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