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