From 51d12c4cca7c9d4911a0037673bbd2dc210836d0 Mon Sep 17 00:00:00 2001
From: dcb <xgybdcb@163.com>
Date: 星期五, 20 六月 2025 10:17:12 +0800
Subject: [PATCH] 根据位置查询Bug修复

---
 src/main/java/com/se/nsl/service/SimuService.java |  121 +++++++++++++++++++++++++++++----------
 1 files changed, 89 insertions(+), 32 deletions(-)

diff --git a/src/main/java/com/se/nsl/service/SimuService.java b/src/main/java/com/se/nsl/service/SimuService.java
index a222fe0..ccc2b3d 100644
--- a/src/main/java/com/se/nsl/service/SimuService.java
+++ b/src/main/java/com/se/nsl/service/SimuService.java
@@ -13,6 +13,7 @@
 import com.se.nsl.helper.StringHelper;
 import com.se.nsl.mapper.SimuMapper;
 import com.se.nsl.utils.CoordinateTransformer;
+import com.se.nsl.utils.TimeFormatUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.gdal.gdal.Band;
 import org.gdal.gdal.Dataset;
@@ -24,10 +25,9 @@
 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.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -36,6 +36,7 @@
 @SuppressWarnings("ALL")
 public class SimuService {
     public static final String TIF_EXTSION = ".tif";
+    public static final String YYYY_MM_DD_HHMMSS = "yyyyMMddHHmmss";
     @Resource
     SimuMapper simuMapper;
 
@@ -134,10 +135,23 @@
 //        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;
+//        return queryByZarr(xy, time, serviceName);
 
         //read from tif file
         return queryByTif(xy, time, serviceName);
+
+    }
+
+    public List<SimuResult> queryByPosition(double lon, double lat, 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 from zarr
+//        return queryByZarr(xy, time, serviceName);
+
+        //read from tif file
+        return queryByTif(xy, serviceName);
 
     }
 
@@ -146,28 +160,29 @@
         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 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++;
+//        }
+        File dem = new File(inPath, serviceName + File.separator + "DEM.tif");
+        ColumnRow cr = getColumnRow(dem.getAbsoluteFile(), x, y);
+        if (cr == null) return null;
 
         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);
+            int[] shape = new int[] {60, 637, 351};
+//            int[] offset = new int[]{210, 384};
+            float[] depth = (float[]) depthArray.read(shape);
+            System.out.println("depth:" + depth.length);
         } catch (IOException | InvalidRangeException e) {
             throw new RuntimeException(e);
         }
@@ -187,6 +202,44 @@
             return null;
         }
 
+        ColumnRow cr = getColumnRow(tifFile, x, y);
+        if (cr == null) return null;
+//        System.out.println("col:" + cr.col + " ,row:" + cr.row);
+        float depth = readPixelValue(cr.dataset, cr.col, cr.row, 1);
+        float velocity = calcVelocity(cr.dataset, cr.col, cr.row);
+        SimuResult result = new SimuResult();
+        result.setDepth(depth);
+        result.setVelocity(velocity);
+        result.setTime(time);
+        return  result;
+    }
+
+    private List<SimuResult> queryByTif(double[] xy, String serviceName) {
+        double x = xy[0];
+        double y = xy[1];
+        List<SimuResult> res = new ArrayList<>();
+        File inPath = new File(config.getInPath());
+        Path depthPath = Paths.get(inPath.getAbsolutePath(), serviceName, "depth");
+        File depthDir = depthPath.toFile();
+        File[] files = depthDir.listFiles();
+        for (File tifFile : files) {
+            String name = tifFile.getName();
+            if (!name.endsWith(TIF_EXTSION)) continue;
+            ColumnRow cr = getColumnRow(tifFile, x, y);
+            if (cr == null) continue;
+            float depth = readPixelValue(cr.dataset, cr.col, cr.row, 1);
+            float velocity = calcVelocity(cr.dataset, cr.col, cr.row);
+            SimuResult result = new SimuResult();
+            result.setDepth(depth);
+            result.setVelocity(velocity);
+            String time = tifFile.getName().replace(".tif", "");
+            result.setTime(TimeFormatUtil.toMillis(time, YYYY_MM_DD_HHMMSS));
+            res.add(result);
+        }
+        return  res;
+    }
+
+    private static ColumnRow getColumnRow(File tifFile, double x, double y) {
         Dataset dataset = gdal.Open(tifFile.getAbsolutePath(), gdalconstConstants.GA_ReadOnly);
         // 鑾峰彇鍦扮悊鍙樻崲鍙傛暟锛�6鍏冪礌鏁扮粍锛�
         // [0]: 宸︿笂瑙扻鍧愭爣, [1]: 鍍忓厓瀹藉害, [2]: X鏂瑰悜鏃嬭浆,
@@ -201,12 +254,19 @@
             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;
+        return new ColumnRow(dataset, col, row);
+    }
+
+    private static class ColumnRow {
+        public final Dataset dataset;
+        public final int col;
+        public final int row;
+
+        public ColumnRow(Dataset dataset, int col, int row) {
+            this.dataset = dataset;
+            this.col = col;
+            this.row = row;
+        }
     }
 
     private float calcVelocity(Dataset dataset, int col, int row) {
@@ -233,10 +293,7 @@
     }
 
     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);
+        return TimeFormatUtil.formatTime(time, YYYY_MM_DD_HHMMSS);
     }
 
 }

--
Gitblit v1.9.3