From 794f620632fca78834677d6b0890bfa0fe78eb02 Mon Sep 17 00:00:00 2001
From: wangyifei <1522824457@qq.com>
Date: 星期四, 31 十月 2024 16:23:13 +0800
Subject: [PATCH] 根据坐标查询积水深度功能第一次提交

---
 src/main/java/com/se/simu/service/WaterService.java |   67 +++++++++++++++++++++++++++++++++
 1 files changed, 67 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/se/simu/service/WaterService.java b/src/main/java/com/se/simu/service/WaterService.java
index d49d75a..1c05a40 100644
--- a/src/main/java/com/se/simu/service/WaterService.java
+++ b/src/main/java/com/se/simu/service/WaterService.java
@@ -3,6 +3,11 @@
 import com.se.simu.config.PropertiesConfig;
 import com.se.simu.domain.vo.*;
 import lombok.extern.slf4j.Slf4j;
+import org.gdal.gdal.Band;
+import org.gdal.gdal.Dataset;
+import org.gdal.gdal.gdal;
+import org.gdal.gdalconst.gdalconstConstants;
+import org.gdal.osr.SpatialReference;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -116,4 +121,66 @@
             return null;
         }
     }
+
+    /**
+     * 鏍规嵁鍧愭爣鏌ヨ绉按娣卞害
+     */
+    public Double getWaterHeight(String serviceName, Double x, Double y, Long timestamp) {
+        String filePath = config.getOutPath() + File.separator + serviceName + File.separator + "waters"
+                + File.separator + timestamp + File.separator + "water.tif";
+
+        // 棣栧厛鏄墍鏈塯dal绋嬪簭閮介渶瑕佺殑娉ㄥ唽璇彞
+        gdal.AllRegister();
+        // 璇诲彇褰卞儚
+        Dataset hDataset = gdal.Open(filePath, gdalconstConstants.GA_Update);
+
+        // 璁剧疆鏁版嵁闆嗙殑鎶曞奖
+        SpatialReference srs = new SpatialReference();
+        srs.ImportFromEPSG(4548);
+        hDataset.SetProjection(srs.ExportToWkt());
+
+        //鑾峰彇鏍呮牸鏁伴噺
+        int numBands=hDataset.GetRasterCount();
+        System.out.println("RasterCount: " + numBands);
+        //鏋勯�犱豢灏勫彉鎹㈠弬鏁版暟缁勶紝骞惰幏鍙栨暟鎹�
+        double[] gt = new double[6];
+        hDataset.GetGeoTransform(gt);
+        System.out.println("浠垮皠鍙樻崲鍙傛暟"+ Arrays.toString(gt));
+
+        //缁忕含搴﹁浆鎹负鏍呮牸鍍忕礌鍧愭爣
+        int[] ColRow=Coordinates2ColRow(gt,x,y);
+
+        //鍒ゆ柇鏄惁鍧愭爣瓒呭嚭鑼冨洿
+        if(ColRow[0]<0||ColRow[1]<0||ColRow[0]>hDataset.getRasterXSize()||ColRow[1]>hDataset.getRasterYSize()){
+            System.out.println(Arrays.toString(ColRow)+"鍧愭爣鍊艰秴鍑烘爡鏍艰寖鍥达紒");
+            return null;
+        }
+
+        //鑾峰彇璇ョ偣瀵瑰簲鐨勬尝娈电殑鍊�
+        Band band = hDataset.GetRasterBand(1);
+        double[] values = new double[1];
+        band.ReadRaster(ColRow[0], ColRow[1], 1, 1, values);
+        double value = values[0];
+
+        //閲婃斁璧勬簮
+        hDataset.delete();
+        return value;
+    }
+
+    /**
+     * 灏嗗湴鍥惧潗鏍囪浆鎹负鏍呮牸鍍忕礌鍧愭爣
+     * @param gt 浠垮皠鍙樻崲鍙傛暟
+     * @param X 妯潗鏍�
+     * @param Y 绾靛潗鏍�
+     * @return
+     */
+    public int[] Coordinates2ColRow(double[] gt, double X, double Y){
+        int[] ints = new int[2];
+        //鍚戜笅鍙栨暣,濡傛灉鍚戜笂鍙栨暣浼氬鑷磋绠楃粨鏋滃亸澶э紝浠庤�屽湪鍚庨潰璇诲彇鍒伴偦杩戝儚鍏冪殑鏁版嵁
+        double  Yline = Math.floor(((Y - gt[3])*gt[1] - (X-gt[0])*gt[4]) / (gt[5]*gt[1]-gt[2]*gt[4]));
+        double  Xpixel = Math.floor((X-gt[0] - Yline*gt[2])/gt[1]);
+        ints[0] = new Double(Xpixel).intValue();
+        ints[1] = new Double(Yline).intValue();
+        return ints;
+    }
 }

--
Gitblit v1.9.3