From ef22eddce187cfc2177e731459045c41e035b9bc Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期三, 17 七月 2024 09:15:08 +0800
Subject: [PATCH] 读取DEM数据

---
 src/main/java/com/se/simu/helper/GdalHelper.java    |  139 +++++++++++++++++++++++++++++++++++++++++++++-
 src/main/java/com/se/simu/service/WaterService.java |   15 +++--
 src/main/java/com/se/simu/domain/LayerVo.java       |   16 ++--
 3 files changed, 152 insertions(+), 18 deletions(-)

diff --git a/src/main/java/com/se/simu/domain/LayerVo.java b/src/main/java/com/se/simu/domain/LayerVo.java
index f58afa4..3f67707 100644
--- a/src/main/java/com/se/simu/domain/LayerVo.java
+++ b/src/main/java/com/se/simu/domain/LayerVo.java
@@ -136,16 +136,16 @@
     }
 
     public static class Terrain {
-        int maxHeight;
-
         int maxWidth;
+
+        int maxHeight;
 
         public Terrain() {
         }
 
-        public Terrain(int maxHeight, int maxWidth) {
-            this.maxHeight = maxHeight;
+        public Terrain(int maxWidth, int maxHeight) {
             this.maxWidth = maxWidth;
+            this.maxHeight = maxHeight;
         }
 
         public int getMaxHeight() {
@@ -166,18 +166,18 @@
     }
 
     public static class Water {
-        int maxHeight;
-
         int maxWidth;
+
+        int maxHeight;
 
         List<Long> data;
 
         public Water() {
         }
 
-        public Water(int maxHeight, int maxWidth, List<Long> data) {
-            this.maxHeight = maxHeight;
+        public Water(int maxWidth, int maxHeight, List<Long> data) {
             this.maxWidth = maxWidth;
+            this.maxHeight = maxHeight;
             this.data = data;
         }
 
diff --git a/src/main/java/com/se/simu/helper/GdalHelper.java b/src/main/java/com/se/simu/helper/GdalHelper.java
index 5c03481..51fe052 100644
--- a/src/main/java/com/se/simu/helper/GdalHelper.java
+++ b/src/main/java/com/se/simu/helper/GdalHelper.java
@@ -1,12 +1,14 @@
 package com.se.simu.helper;
 
+import com.se.simu.domain.LayerVo;
 import lombok.extern.slf4j.Slf4j;
 import org.gdal.gdal.Band;
 import org.gdal.gdal.Dataset;
 import org.gdal.gdal.gdal;
 import org.gdal.gdalconst.gdalconst;
-import org.gdal.gdalconst.gdalconstConstants;
+import org.gdal.ogr.Geometry;
 import org.gdal.ogr.ogr;
+import org.gdal.osr.SpatialReference;
 
 import java.io.File;
 
@@ -19,6 +21,16 @@
 @Slf4j
 @SuppressWarnings("ALL")
 public class GdalHelper {
+    public final static int I4326 = 4326;
+
+    public final static int I4490 = 4490;
+
+    public static SpatialReference SR4326;
+
+    public static SpatialReference SR4490;
+
+    public final static String CGCS2000 = "CGCS2000";
+
     /**
      * 鍒濆鍖�
      */
@@ -46,19 +58,136 @@
         // 娉ㄥ唽鎵�鏈夌殑椹卞姩
         gdal.AllRegister();
         ogr.RegisterAll();
+        initSr();
+    }
+
+    /**
+     * 鍒濆鍖栧潗鏍囩郴
+     */
+    public static void initSr() {
+        try {
+            SR4326 = new SpatialReference();
+            SR4326.ImportFromEPSG(I4326);
+
+            SR4490 = new SpatialReference();
+            SR4490.ImportFromEPSG(I4490);
+        } catch (Exception ex) {
+            log.error(ex.getMessage(), ex);
+        }
+    }
+
+    /**
+     * 璇诲彇DEM杈圭晫
+     */
+    public static LayerVo readDemExtent(String file) {
+        LayerVo layer = new LayerVo();
+        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) {
+                return null;
+            }
+
+            Band band = ds.GetRasterBand(1);
+            double[] mm = new double[2];
+            band.ComputeRasterMinMax(mm);
+
+            Geometry minPoint = getMinPoint(ds);
+            Geometry maxPoint = getMaxPoint(ds);
+
+            layer.setExtension(new LayerVo.Extension(minPoint.GetX(), minPoint.GetY(), maxPoint.GetX(), maxPoint.GetY(), mm[0], mm[1]));
+            layer.setTerrain(new LayerVo.Terrain(band.getXSize(), band.getYSize()));
+            layer.setWater(new LayerVo.Water(band.getXSize(), band.getYSize(), null));
+        } catch (Exception ex) {
+            log.error(ex.getMessage(), ex);
+        } finally {
+            if (null != ds) {
+                ds.delete();
+            }
+        }
+
+        return layer;
+    }
+
+    /**
+     * 鑾峰彇Dataset鐨勬渶灏忕偣
+     */
+    private static Geometry getMinPoint(Dataset ds) {
+        double[] transform = new double[6];
+        ds.GetGeoTransform(transform);
+
+        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);
+    }
+
+    /**
+     * 鑾峰彇Dataset鐨勬渶澶х偣
+     */
+    private static Geometry getMaxPoint(Dataset ds) {
+        /*
+         * transform[0] 宸︿笂瑙抶鍧愭爣
+         * transform[1] 涓滆タ鏂瑰悜鍒嗚鲸鐜�
+         * transform[2] 鏃嬭浆瑙掑害, 0琛ㄧず鍥惧儚 "鍖楁柟鏈濅笂"
+         *
+         * transform[3] 宸︿笂瑙抷鍧愭爣
+         * transform[4] 鏃嬭浆瑙掑害, 0琛ㄧず鍥惧儚 "鍖楁柟鏈濅笂"
+         * transform[5] 鍗楀寳鏂瑰悜鍒嗚鲸鐜�
+         */
+        double[] transform = new double[6];
+        ds.GetGeoTransform(transform);
+
+        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);
+    }
+
+    /**
+     * 鍧愭爣杞崲
+     */
+    private static Geometry transform(Dataset ds, Geometry point) {
+        point.AssignSpatialReference(ds.GetSpatialRef());
+        if (ds.GetSpatialRef().IsGeographic() > 0) {
+            return point;
+        }
+
+        String srsName = ds.GetSpatialRef().GetName();
+        if (srsName.contains(CGCS2000)) {
+            point.TransformTo(SR4490);
+        } else {
+            point.TransformTo(SR4326);
+        }
+        point.SwapXY();
+
+        return point;
     }
 
     /**
      * 鍒涘缓閲戝瓧濉�
      */
     public static void createPyramid(String file) {
+        Dataset ds = null;
         try {
             File f = new File(file);
             if (!f.exists() || f.isDirectory()) {
                 return;
             }
 
-            Dataset ds = gdal.Open(file, gdalconst.GA_ReadOnly);
+            ds = gdal.Open(file, gdalconst.GA_ReadOnly);
             if (null == ds) {
                 return;
             }
@@ -68,10 +197,12 @@
             if (0 == band.GetOverviewCount()) {
                 ds.BuildOverviews("nearest", new int[]{2, 4, 6, 8, 16}, null);
             }
-
-            ds.delete();
         } catch (Exception ex) {
             log.error(ex.getMessage(), ex);
+        } finally {
+            if (null != ds) {
+                ds.delete();
+            }
         }
     }
 }
diff --git a/src/main/java/com/se/simu/service/WaterService.java b/src/main/java/com/se/simu/service/WaterService.java
index eceeb3b..4564fa1 100644
--- a/src/main/java/com/se/simu/service/WaterService.java
+++ b/src/main/java/com/se/simu/service/WaterService.java
@@ -35,14 +35,17 @@
         String file2 = "D:/simu/test/DOM_M.tif";
         GdalHelper.createPyramid(file2);
 
-        LayerVo layer = new LayerVo();
+        LayerVo layer = GdalHelper.readDemExtent(file);
+        if (null == layer) {
+            return null;
+        }
         layer.setVer(ver);
-        layer.setDuration(new LayerVo.Duration(1719812810225L, 1719812810225L));
-        layer.setExtension(new LayerVo.Extension(2.11062743358, 0.53812160220, 2.11070827834, 0.53819799453, 1.151, 38.83));
-        layer.setTerrain(new LayerVo.Terrain(10000, 10000));
+        //layer.setDuration(new LayerVo.Duration(1719812810225L, 1719812810225L));
+        //layer.setExtension(new LayerVo.Extension(2.11062743358, 0.53812160220, 2.11070827834, 0.53819799453, 1.151, 38.83));
+        //layer.setTerrain(new LayerVo.Terrain(10000, 10000));
 
-        List<Long> data = new ArrayList<>(Arrays.asList(1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L));
-        layer.setWater(new LayerVo.Water(10000, 10000, data));
+        //List<Long> data = new ArrayList<>(Arrays.asList(1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L));
+        //layer.setWater(new LayerVo.Water(10000, 10000, data));
 
         return layer;
     }

--
Gitblit v1.9.3