From dfded458c5ee662a2dc4a51a6d0640e1a4f4a4bb Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期五, 25 八月 2023 14:16:20 +0800 Subject: [PATCH] 修改栅格读取服务 --- src/main/java/com/moon/server/service/data/RasterService.java | 140 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 138 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/moon/server/service/data/RasterService.java b/src/main/java/com/moon/server/service/data/RasterService.java index 3a6c070..be905d5 100644 --- a/src/main/java/com/moon/server/service/data/RasterService.java +++ b/src/main/java/com/moon/server/service/data/RasterService.java @@ -1,10 +1,15 @@ package com.moon.server.service.data; +import com.moon.server.entity.all.StaticData; import com.moon.server.entity.data.MetaEntity; +import com.moon.server.helper.StringHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.gdal.gdal.ColorTable; import org.gdal.gdal.Dataset; import org.gdal.gdal.gdal; +import org.gdal.ogr.Geometry; +import org.gdal.ogr.ogr; import org.gdal.osr.SpatialReference; import org.springframework.stereotype.Service; @@ -17,12 +22,33 @@ */ @Service public class RasterService { + private SpatialReference sr4326; + + private SpatialReference sr4490; + + private SpatialReference sr104903; + private final static Log log = LogFactory.getLog(RasterService.class); + + /** + * 鍒濆鍖栫┖闂村紩鐢� + */ + private void initSpatialReference() { + if (null == sr4326) { + sr4326 = new SpatialReference(); + sr4326.ImportFromEPSG(StaticData.I4326); + + sr4490 = new SpatialReference(); + sr4490.ImportFromEPSG(StaticData.I4490); + + sr104903 = new SpatialReference(StaticData.MOON_2000_WKT); + } + } /** * 璇诲彇鏍呮牸淇℃伅 */ - public void ReadRasterInfo(MetaEntity me, String file) { + public void readRasterInfo(MetaEntity me, String file) { Dataset ds = null; try { File f = new File(file); @@ -35,7 +61,35 @@ return; } - SpatialReference sr = ds.GetSpatialRef(); + // EPSG缂栫爜 + String epsg = getEpsg(ds); + // 娉㈡鏁� + String bands = "" + ds.getRasterCount(); + //vd.Meta.band_type = Enum.GetName(typeof(DataType), ds.GetRasterBand(1).DataType); // 鏁版嵁绫诲瀷 + ColorTable colorTable = ds.GetRasterBand(1).GetRasterColorTable(); + // 鏁版嵁棰滆壊琛� + String ct = null == colorTable ? null : colorTable.toString(); + // 楂樼▼鍩哄噯 + String hDatum = null; + + double[] transform = new double[6]; + ds.GetGeoTransform(transform); + // 鍒嗚鲸鐜� + String resolution = String.format("%f,%f", transform[1], transform[5]); + + if (!StaticData.EPSGS.contains(epsg)) { + return; + } + + Geometry minPoint = getMinPoint(ds); + Geometry maxPoint = getMaxPoint(ds); + double xmin = minPoint.GetX(0); + double ymin = minPoint.GetY(0); + double xmax = maxPoint.GetX(0); + double ymax = maxPoint.GetY(0); + + // 鍥涜嚦鑼冨洿 + String geom = String.format("ST_GeomFromText('POLYGON ((%f %f,%f %f,%f %f,%f %f,%f %f))')", xmin, ymax, xmax, ymax, xmax, ymin, xmin, ymin, xmin, ymax); } catch (Exception ex) { log.error(ex.getMessage(), ex); } finally { @@ -44,4 +98,86 @@ } } } + + /** + * 鑾峰彇EPSG缂栫爜 + */ + private String getEpsg(Dataset ds) { + SpatialReference sr = ds.GetSpatialRef(); + if (sr != null) { + // 鍧愭爣绯荤粺 + String coorSys = sr.GetName(); + if (StaticData.MOON200.equals(coorSys)) { + return "ESRI:" + StaticData.I104903; + } else { + String code = sr.GetAuthorityCode(null); + return StringHelper.isEmpty(code) ? null : "EPSG:" + code; + } + } + + return null; + } + + /** + * 鑾峰彇Dataset鐨勬渶灏忕偣 + */ + private Geometry getMinPoint(Dataset ds) { + double[] transform = new double[6]; + ds.GetGeoTransform(transform); + + String epsg = ds.GetSpatialRef().GetAuthorityCode(null); + double xMin = transform[0]; + double yMin = transform[3] - ds.getRasterYSize() * transform[1]; + + Geometry point = new Geometry(ogr.wkbPoint); + point.AddPoint(xMin, yMin, 0); + + return transform(ds, point, epsg); + } + + /** + * 鑾峰彇Dataset鐨勬渶澶х偣 + */ + private Geometry getMaxPoint(Dataset ds) { + double[] transform = new double[6]; + ds.GetGeoTransform(transform); + + String epsg = ds.GetSpatialRef().GetAuthorityCode(null); + double xMax = transform[0] + (ds.getRasterXSize() * transform[1]); + double yMax = transform[3]; + + Geometry point = new Geometry(ogr.wkbPoint); + point.AddPoint(xMax, yMax, 0); + + return transform(ds, point, epsg); + } + + /** + * 鍧愭爣杞崲 + */ + private Geometry transform(Dataset ds, Geometry point, String epsg) { + this.initSpatialReference(); + + if (StringHelper.isEmpty(epsg)) { + point.AssignSpatialReference(sr104903); + return point; + } + if (String.valueOf(StaticData.I4326).equals(epsg)) { + point.AssignSpatialReference(sr4326); + return point; + } + if (String.valueOf(StaticData.I4490).equals(epsg)) { + point.AssignSpatialReference(sr4490); + return point; + } + + point.AssignSpatialReference(ds.GetSpatialRef()); + if (ds.GetSpatialRef().GetName().contains(StaticData.CGCS2000)) { + point.TransformTo(sr4490); + } else { + point.TransformTo(sr4326); + } + + return point; + } } -- Gitblit v1.9.3