From b25ba75d2e0c60242d0f9195f0820db470485c61 Mon Sep 17 00:00:00 2001
From: dcb <xgybdcb@163.com>
Date: 星期二, 27 五月 2025 11:27:08 +0800
Subject: [PATCH] 新增根据点位查询水深流速接口

---
 src/main/java/com/se/nsl/controller/SimuController.java |   20 +++--
 src/main/java/com/se/nsl/controller/BaseController.java |   10 ++
 pom.xml                                                 |   34 ++++++--
 src/main/java/com/se/nsl/service/SimuService.java       |  127 ++++++++++++++++++++++++++++++-
 4 files changed, 169 insertions(+), 22 deletions(-)

diff --git a/pom.xml b/pom.xml
index 066695b..17495ff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -213,23 +213,18 @@
             <artifactId>commons-fileupload</artifactId>
             <version>1.5</version>
         </dependency>
-        <!-- https://mvnrepository.com/artifact/dev.zarr/jzarr -->
         <dependency>
             <groupId>dev.zarr</groupId>
             <artifactId>jzarr</artifactId>
             <version>0.4.2</version>
-            <scope>system</scope>
-            <systemPath>${project.basedir}/libs/jzarr-0.4.2.jar</systemPath>
         </dependency>
-        <!-- https://mvnrepository.com/artifact/edu.ucar/cdm-core -->
-        <dependency>
+        <!--<dependency>
             <groupId>edu.ucar</groupId>
             <artifactId>cdm-core</artifactId>
             <version>5.4.1</version>
             <scope>system</scope>
             <systemPath>${project.basedir}/libs/cdm-core-5.4.1.jar</systemPath>
         </dependency>
-        <!-- https://mvnrepository.com/artifact/org.blosc/jblosc -->
         <dependency>
             <groupId>org.blosc</groupId>
             <artifactId>jblosc</artifactId>
@@ -242,8 +237,6 @@
             <artifactId>jna</artifactId>
             <version>4.2.2</version>
         </dependency>
-        <!-- zarr -->
-        <!-- https://mvnrepository.com/artifact/org.janelia.saalfeldlab/n5-zarr -->
         <dependency>
             <groupId>org.janelia.saalfeldlab</groupId>
             <artifactId>n5-zarr</artifactId>
@@ -251,14 +244,13 @@
             <scope>system</scope>
             <systemPath>${project.basedir}/libs/n5-zarr-1.3.5.jar</systemPath>
         </dependency>
-        <!-- https://mvnrepository.com/artifact/dev.zarr/jzarr -->
         <dependency>
             <groupId>dev.zarr</groupId>
             <artifactId>jzarr</artifactId>
             <version>0.4.2</version>
             <scope>system</scope>
             <systemPath>${project.basedir}/libs/jzarr-0.4.2.jar</systemPath>
-        </dependency>
+        </dependency>-->
         <!--gavaghan娴嬭窛-->
         <dependency>
             <groupId>org.gavaghan</groupId>
@@ -327,8 +319,30 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>alimaven</id>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
     <repositories>
         <repository>
+            <id>alimaven</id>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+        <repository>
             <id>osgeo</id>
             <name>OSGeo Release Repository</name>
             <url>https://repo.osgeo.org/repository/release/</url>
diff --git a/src/main/java/com/se/nsl/controller/BaseController.java b/src/main/java/com/se/nsl/controller/BaseController.java
index 0177121..8dd3b58 100644
--- a/src/main/java/com/se/nsl/controller/BaseController.java
+++ b/src/main/java/com/se/nsl/controller/BaseController.java
@@ -40,4 +40,14 @@
         log.error(ex.getMessage(), ex);
         return new R<T>(HttpStatus.INTERNAL_SERVER_ERROR, data, ex.getMessage());
     }
+
+    public <T> R<T> notFound(String msg) {
+        return new R<T>(HttpStatus.NOT_FOUND, null, msg);
+    }
+
+    public <T> R<T> clientError(String msg) {
+        return new R<T>(HttpStatus.BAD_REQUEST, null, msg);
+    }
+
+
 }
diff --git a/src/main/java/com/se/nsl/controller/SimuController.java b/src/main/java/com/se/nsl/controller/SimuController.java
index 484f60f..0aa1c78 100644
--- a/src/main/java/com/se/nsl/controller/SimuController.java
+++ b/src/main/java/com/se/nsl/controller/SimuController.java
@@ -6,6 +6,7 @@
 import com.se.nsl.domain.po.Simu;
 import com.se.nsl.domain.po.SimuData;
 import com.se.nsl.domain.vo.R;
+import com.se.nsl.domain.vo.SimuResult;
 import com.se.nsl.domain.vo.SimuVo;
 import com.se.nsl.service.ResolveService;
 import com.se.nsl.service.SimuService;
@@ -163,20 +164,23 @@
 
     @ApiOperation(value = "position")
     @GetMapping("/position")
-    public R<Object> queryByPosition(double lon, double lat, String time, String serviceName) {
+    public R<Object> queryByPosition(double lon, double lat, Long time, String serviceName) {
         if (lon > 180 || lon < -180) {
-            return fail("缁忓害鑼冨洿搴旇鍦�-180鍒�180");
+            return clientError("缁忓害鑼冨洿搴旇鍦�-180鍒�180");
         }
         if (lat > 90 || lat < -90) {
-            return fail("绾害鑼冨洿搴旇鍦�-90鍒�90");
+            return clientError("绾害鑼冨洿搴旇鍦�-90鍒�90");
         }
-        if (time == null || time.trim().isEmpty()) {
-            return fail("鏃堕棿鎴充笉鑳戒负绌�");
+        if (time == null) {
+            return clientError("鏃堕棿鎴充笉鑳戒负绌�");
         }
         if (serviceName == null || serviceName.trim().isEmpty()) {
-            return fail("鏈嶅姟鍚嶄笉鑳戒负绌�");
+            return clientError("鏈嶅姟鍚嶄笉鑳戒负绌�");
         }
-
-        return null;
+        SimuResult result = simuService.queryByPosition(lon, lat, time, serviceName);
+        if (result == null) {
+            return notFound("鏈煡鎵惧埌鐩稿叧鏁版嵁");
+        }
+        return success(result);
     }
 }
diff --git a/src/main/java/com/se/nsl/service/SimuService.java b/src/main/java/com/se/nsl/service/SimuService.java
index 0a12469..a222fe0 100644
--- a/src/main/java/com/se/nsl/service/SimuService.java
+++ b/src/main/java/com/se/nsl/service/SimuService.java
@@ -4,6 +4,9 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.bc.zarr.ZarrArray;
+import com.bc.zarr.ZarrGroup;
+import com.se.nsl.config.PropertiesConfig;
 import com.se.nsl.domain.po.Simu;
 import com.se.nsl.domain.vo.SimuResult;
 import com.se.nsl.domain.vo.SimuVo;
@@ -11,9 +14,20 @@
 import com.se.nsl.mapper.SimuMapper;
 import com.se.nsl.utils.CoordinateTransformer;
 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.springframework.stereotype.Service;
+import ucar.ma2.InvalidRangeException;
 
 import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.List;
 
@@ -21,8 +35,12 @@
 @Service
 @SuppressWarnings("ALL")
 public class SimuService {
+    public static final String TIF_EXTSION = ".tif";
     @Resource
     SimuMapper simuMapper;
+
+    @Resource
+    PropertiesConfig config;
 
     /**
      * 鍒嗛〉鏌ヨ鎺ㄦ紨妯℃嫙
@@ -110,14 +128,115 @@
         return simuMapper.updates(Arrays.asList(simu));
     }
 
-    public SimuResult queryByPosition(double lon, double lat, String time, String serviceName) {
+    public SimuResult queryByPosition(double lon, double lat, long time, String serviceName) {
         //transform coordiante from 4326 to 4548
         double[] xy = CoordinateTransformer.transform(4326, 4548, lon, lat);
-        System.out.println(String.format("杞崲鍓嶇殑鍧愭爣锛歺:%s,y:%s", lon, lat));
-        System.out.println(String.format("杞崲鍚庣殑鍧愭爣锛歺:%s,y:%s", xy[0], xy[1]));
-        //read zarr data and compare the data with lon,lat,time
+//        System.out.println(String.format("杞崲鍓嶇殑鍧愭爣锛歺:%s,y:%s", lon, lat));
+//        System.out.println(String.format("杞崲鍚庣殑鍧愭爣锛歺:%s,y:%s", xy[0], xy[1]));
+        //read from zarr
+//        return null;
+
+        //read from tif file
+        return queryByTif(xy, time, serviceName);
+
+    }
+
+    private SimuResult queryByZarr(double[] xy, long time, String serviceName) {
+        double x = xy[0];
+        double y = xy[1];
+        String prefix = formatTime(time);
+        File inPath = new File(config.getInPath());
+        File tifDir = new File(inPath, serviceName + File.separator + "depth");
+        int index = 0;
+        File[] files = tifDir.listFiles();
+        for (File file : files) {
+            String name = file.getName();
+            if (!name.endsWith(TIF_EXTSION)) continue;
+            if (name.equals(prefix + TIF_EXTSION)) {
+                break;
+            }
+            index++;
+        }
+        //TODO闇�瑕佽绠楄鍒楀彿
+        int col = 0;
+        int row = 0;
+
+
+        File zarr = new File(inPath, serviceName + File.separator + "result.zarr");
+        try {
+            ZarrGroup group = ZarrGroup.open(zarr.toPath());
+            ZarrArray depthArray = group.openArray("depth");
+            Object object = depthArray.read();
+            System.out.println(object);
+        } catch (IOException | InvalidRangeException e) {
+            throw new RuntimeException(e);
+        }
+
 
         return null;
     }
 
+    private SimuResult queryByTif(double[] xy, long time, String serviceName) {
+        double x = xy[0];
+        double y = xy[1];
+        File inPath = new File(config.getInPath());
+        String prefix = formatTime(time);
+        String child = serviceName + File.separator + "depth" + File.separator + prefix + TIF_EXTSION;
+        File tifFile = new File(inPath, child);
+        if (!tifFile.exists()) {
+            return null;
+        }
+
+        Dataset dataset = gdal.Open(tifFile.getAbsolutePath(), gdalconstConstants.GA_ReadOnly);
+        // 鑾峰彇鍦扮悊鍙樻崲鍙傛暟锛�6鍏冪礌鏁扮粍锛�
+        // [0]: 宸︿笂瑙扻鍧愭爣, [1]: 鍍忓厓瀹藉害, [2]: X鏂瑰悜鏃嬭浆,
+        // [3]: 宸︿笂瑙扽鍧愭爣, [4]: Y鏂瑰悜鏃嬭浆, [5]: 鍍忓厓楂樺害锛堣礋鍊艰〃绀篩杞村悜涓嬶級
+        double[] geoTransform = dataset.GetGeoTransform();
+        //璁$畻鏍呮牸琛屽垪鍙�
+        int col = (int) ((x - geoTransform[0]) / geoTransform[1]);
+        int row = (int) ((geoTransform[3] - y) / Math.abs(geoTransform[5]));
+        int width = dataset.getRasterXSize();
+        int height = dataset.getRasterYSize();
+        if (col < 0 || col > width || row < 0 || row > height) {
+            log.warn("琛屽垪鍙蜂笉鍦╰if鑼冨洿鍐�");
+            return null;
+        }
+        float depth = readPixelValue(dataset, col, row, 1);
+        float velocity = calcVelocity(dataset, col, row);
+        SimuResult result = new SimuResult();
+        result.setDepth(depth);
+        result.setVelocity(velocity);
+        return  result;
+    }
+
+    private float calcVelocity(Dataset dataset, int col, int row) {
+        float x = readPixelValue(dataset, col, row, 2);
+        float y = readPixelValue(dataset, col, row, 3);
+        float velocity = 0f;
+        if (Float.isNaN(x) && Float.isNaN(y)) {
+            velocity = 0f;
+        } else if (Float.isNaN(x)) {
+            velocity = y;
+        } else if (Float.isNaN(y)) {
+            velocity = x;
+        } else {
+            velocity = (float) Math.sqrt(x * x + y * y);
+        }
+        return velocity;
+    }
+
+    private float readPixelValue(Dataset dataset, int col, int row, int bandNum) {
+        Band band = dataset.GetRasterBand(bandNum);
+        float[] values = new float[1];
+        band.ReadRaster(col, row, 1, 1, values);
+        return values[0];
+    }
+
+    private String formatTime(long time) {
+        Instant instant = Instant.ofEpochMilli(time);
+        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        return localDateTime.format(formatter);
+    }
+
 }

--
Gitblit v1.9.3