From ee26ff7331614b14c9f156c5590724e29e99dc06 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期六, 02 十一月 2024 17:08:05 +0800 Subject: [PATCH] 1 --- src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java | 16 ++++---- src/main/java/com/se/simu/service/ResultService.java | 70 ++++++++++++++++++++++++++++++++-- src/main/java/com/se/simu/service/WaterService.java | 3 - 3 files changed, 74 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java b/src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java index 21280a9..6ccfea1 100644 --- a/src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java +++ b/src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java @@ -19,14 +19,14 @@ public BuildingDepthVo() { } - public BuildingDepthVo(String seid, Long timestamp, Double depth) { - this.seid = seid; + public BuildingDepthVo(String id, Long timestamp, Double depth) { + this.id = id; this.timestamp = timestamp; this.depth = depth; } - @ApiModelProperty("SE涓婚敭") - private String seid; + @ApiModelProperty("涓婚敭ID") + private String id; @ApiModelProperty("鏃堕棿鎴�") private Long timestamp; @@ -34,12 +34,12 @@ @ApiModelProperty("娑夋按灏濊瘯") private Double depth; - public String getSeid() { - return seid; + public String getId() { + return id; } - public void setSeid(String seid) { - this.seid = seid; + public void setId(String id) { + this.id = id; } public Long getTimestamp() { diff --git a/src/main/java/com/se/simu/service/ResultService.java b/src/main/java/com/se/simu/service/ResultService.java index 2a58383..8cb6be8 100644 --- a/src/main/java/com/se/simu/service/ResultService.java +++ b/src/main/java/com/se/simu/service/ResultService.java @@ -31,6 +31,8 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.DoubleStream; /** * 澶勭悊缁撴灉鏈嶅姟绫� @@ -67,10 +69,11 @@ try { copeTerrain(dto, layer); copeBuilding(dto, layer); - copeWater(dto, layer); + List<BuildingDepthVo> buildings = copeWater(dto, layer); copeFlow(dto, layer); copeLayerJson(dto, layer); copeRainFallJson(dto, layer); + copeBuildingDepthJson(dto, buildings); } finally { File dir = new File(dto.getTemp()); if (dir.exists()) { @@ -264,11 +267,13 @@ setWaterHeight(layer, files); } - private void copeWater(ResultDto dto, LayerDto layer) { + private List<BuildingDepthVo> copeWater(ResultDto dto, LayerDto layer) { List<String> files = layer.getWaters().getFiles(); - if (files.size() == 0 || files.size() != layer.getWaters().getData().size()) return; + if (files.size() == 0 || files.size() != layer.getWaters().getData().size()) return null; processWaters(dto, files, layer); + + return processBuilding(dto, files, layer); } private static List<String> getFiles(String path, String suffix) { @@ -405,8 +410,8 @@ int offset = x + y * width; if (Float.isNaN(buffer[offset]) || buffer[offset] < -999 || buffer[offset] < minHeight) continue; - double X = transform[0] + x * transform[1] + y * transform[2]; - double Y = transform[3] + x * transform[4] + y * transform[5]; + //double X = transform[0] + x * transform[1] + y * transform[2]; + //double Y = transform[3] + x * transform[4] + y * transform[5]; //BuildingDto building = intersects(dto, X, Y); //if (null != building) continue; @@ -441,6 +446,61 @@ return dto.getBuildingList().parallelStream().filter(b -> b.getGeom().Intersects(p)).findFirst().orElse(null); } + private List<BuildingDepthVo> processBuilding(ResultDto dto, List<String> files, LayerDto layer) { + List<BuildingDepthVo> list = new CopyOnWriteArrayList<>(); + for (int i = 0, c = files.size(); i < c; i++) { + Dataset ds = null; + try { + ds = gdal.Open(files.get(i), gdalconst.GA_ReadOnly); + if (null == ds || 0 == ds.getRasterCount()) continue; + if (null == ds.GetSpatialRef()) ds.SetSpatialRef(dto.getSpatialReference()); + + copeBuildingDepth(dto, ds, layer.getWaters().getData().get(i), list); + } finally { + if (null != ds) ds.delete(); + } + } + + return list; + } + + private void copeBuildingDepth(ResultDto dto, Dataset ds, long ticks, List<BuildingDepthVo> list) { + double[] transform = ds.GetGeoTransform(); + int xSize = ds.getRasterXSize(), ySize = ds.getRasterYSize(); + double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = Math.abs(transform[5]); + + for (BuildingDto building : dto.getBuildingList()) { + Double val = getValue(ds, building, xSize, ySize, minX, maxY, pixelWidth, pixelHeight); + list.add(new BuildingDepthVo(building.getId(), ticks, null)); + } + } + + private Double getValue(Dataset ds, BuildingDto building, int xSize, int ySize, double minX, double maxY, double pixelWidth, double pixelHeight) { + double[] env = new double[4]; + building.getGeom().GetEnvelope(env); + + int xMinPixel = Math.max((int) Math.floor((env[0] - minX) / pixelWidth), 1); + int yMinPixel = Math.max((int) Math.floor((maxY - env[3]) / pixelHeight), 1); + int xMaxPixel = Math.min((int) Math.floor((env[1] - minX) / pixelWidth), xSize); + int yMaxPixel = Math.min((int) Math.floor((maxY - env[2]) / pixelHeight), ySize); + if (xMaxPixel < 1 || yMaxPixel < 1 || xMaxPixel - xMinPixel < 0 || yMaxPixel - yMinPixel < 0) { + return null; + } + + int width = xMaxPixel - xMinPixel; + int height = yMaxPixel - yMinPixel; + double[] pixelValues = new double[width * height]; + ds.GetRasterBand(1).ReadRaster(xMinPixel, yMinPixel, width, height, pixelValues); + + Double val = Arrays.stream(pixelValues).max().getAsDouble(); + + return isValid(val) ? val : null; + } + + public static boolean isValid(Double val) { + return !Double.isNaN(val) && val > Integer.MIN_VALUE; + } + private void copeFlow(ResultDto dto, LayerDto layer) { List<String> files = getFiles(dto.getFlowPath(), ".tif"); if (null == files || files.size() != layer.getWaters().getData().size()) return; diff --git a/src/main/java/com/se/simu/service/WaterService.java b/src/main/java/com/se/simu/service/WaterService.java index b781db1..3f38e8d 100644 --- a/src/main/java/com/se/simu/service/WaterService.java +++ b/src/main/java/com/se/simu/service/WaterService.java @@ -13,7 +13,6 @@ import org.gdal.gdal.gdal; import org.gdal.gdalconst.gdalconst; import org.gdal.osr.SpatialReference; -import org.gdal.osr.osr; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -177,7 +176,7 @@ if (CollectionUtils.isEmpty(list)) return null; return list.parallelStream() - .filter(b -> seid.equals(b.getSeid())) + .filter(b -> seid.equals(b.getId())) .sorted((a, b) -> a.getTimestamp().compareTo(b.getTimestamp())) .collect(Collectors.toList()); } -- Gitblit v1.9.3