package com.lf.server.service.data; import com.lf.server.entity.all.StaticData; import com.lf.server.helper.StringHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.gdal.gdal.Dataset; import org.gdal.gdal.gdal; import org.gdal.gdalconst.gdalconst; import org.gdal.ogr.Geometry; import org.gdal.ogr.ogr; import org.gdal.osr.SpatialReference; import org.osgeo.proj4j.*; import org.springframework.stereotype.Service; import java.io.File; /** * 栅格服务 * @author WWW * @date 2023-08-27 */ @Service public class RasterService { private SpatialReference sr4326; private SpatialReference sr4490; private final static Log log = LogFactory.getLog(RasterService.class); /** * 初始化空间参考 */ public void initSr() { if (null == sr4326) { sr4326 = new SpatialReference(); sr4326.ImportFromEPSG(StaticData.I4326); } if (null == sr4490) { sr4490 = new SpatialReference(); sr4490.ImportFromEPSG(StaticData.I4490); } } /** * 获取栅格数据的EPSG编码 */ public Integer getRaterEpsg(String file) { Dataset ds = null; try { File f = new File(file); if (!f.exists() || f.isDirectory()) { return null; } ds = gdal.Open(file, gdalconst.GA_ReadOnly); if (null == ds || 0 == ds.getRasterCount()) { return null; } if (null == ds.GetSpatialRef()) { return null; } // PROJCS、 GEOGCS、GEOGCS 或 NULL String code = ds.GetSpatialRef().GetAuthorityCode(null); if (StringHelper.isEmpty(code)) { return null; } return Integer.parseInt(code); } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } finally { if (null != ds) { ds.delete(); } } } /** * 坐标转换 */ public Object csTransform(double x, double y, int epsg) { this.initSr(); SpatialReference srs = new SpatialReference(); srs.ImportFromEPSG(epsg); Geometry point = new Geometry(ogr.wkbPoint); point.AddPoint(x, y, 0); point.AssignSpatialReference(srs); if (srs.GetName().contains(StaticData.CGCS2000)) { point.TransformTo(sr4490); } else { point.TransformTo(sr4326); } point.SwapXY(); return new double[]{point.GetX(), point.GetY()}; } /** * 坐标转换-使用Proj4j库 */ public String transformByProj4j(double x, double y, int epsg) { CRSFactory crsFactory = new CRSFactory(); CoordinateReferenceSystem fromCrs = crsFactory.createFromName("EPSG:" + epsg); CoordinateReferenceSystem toCrs = crsFactory.createFromName("EPSG:4326"); CoordinateTransformFactory ctf = new CoordinateTransformFactory(); CoordinateTransform transform = ctf.createTransform(fromCrs, toCrs); ProjCoordinate fromCoord = new ProjCoordinate(x, y); ProjCoordinate toCoord = new ProjCoordinate(); transform.transform(fromCoord, toCoord); return String.format("%f,%f", toCoord.x, toCoord.y); } }