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