package com.terra.system.service.data; import com.terra.common.entity.all.StaticData; import com.terra.system.helper.StringHelper; import com.terra.system.helper.WebHelper; 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.beans.factory.annotation.Value; 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; @Value("${sys.gdal_path}") private String gdalPath; 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(); } } } /** * 使用GDAL获取EPSG编码 */ public Integer getEpsgByGdal(String file) { try { File f = new File(file); if (!f.exists() || f.isDirectory()) { return null; } String cmd = String.format("%s\\gdalsrsinfo.exe \"%s\" -o epsg", gdalPath, file); String rs = WebHelper.exec2(cmd); if (StringHelper.isEmpty(rs)) { return null; } String[] strs = rs.split("\n"); for (String str : strs) { if (str.contains("EPSG:")) { String epsg = str.replace("EPSG:", ""); return Integer.parseInt(epsg); } } return 0; } catch (Exception ex) { log.error(ex.getMessage(), ex); return null; } } /** * 坐标转换 */ 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);*/ return String.format("%f,%f", 0.0, 0.0); } }