From 0383642d09b4974fa98853f8cb679cc5ed2fe8a2 Mon Sep 17 00:00:00 2001 From: wuww <252740454@qq.com> Date: 星期四, 15 五月 2025 17:01:12 +0800 Subject: [PATCH] 修订水面、高程等尺寸 --- src/main/java/com/se/nsl/service/TestService.java | 266 ++++++---------------------------------------------- 1 files changed, 33 insertions(+), 233 deletions(-) diff --git a/src/main/java/com/se/nsl/service/TestService.java b/src/main/java/com/se/nsl/service/TestService.java index 1c081e9..a6f1079 100644 --- a/src/main/java/com/se/nsl/service/TestService.java +++ b/src/main/java/com/se/nsl/service/TestService.java @@ -4,37 +4,26 @@ import com.alibaba.fastjson.JSON; import com.se.nsl.config.PropertiesConfig; import com.se.nsl.domain.dto.*; -import com.se.nsl.domain.po.DataPo; -import com.se.nsl.domain.po.PondingPo; import com.se.nsl.domain.po.SimuData; import com.se.nsl.domain.vo.BuildingDepthVo; import com.se.nsl.helper.ComHelper; import com.se.nsl.helper.GdalHelper; -import com.se.nsl.helper.ShpHelper; import lombok.extern.slf4j.Slf4j; import org.gdal.gdal.Band; import org.gdal.gdal.Dataset; import org.gdal.gdal.gdal; -//import org.gdal.gdalconstConstants.gdalconst; import org.gdal.gdalconst.gdalconstConstants; import org.gdal.ogr.*; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.awt.*; import java.awt.image.BufferedImage; -import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; import java.io.IOException; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; @Slf4j @Service @@ -42,9 +31,6 @@ public class TestService { @Resource PropertiesConfig config; - - @Resource - ResultService resultService; public final static double MIN_VAL = 0.00001; @@ -67,30 +53,12 @@ process(dto, layer); } - public void test(DataPo data) throws Exception { - String basePath = config.getInPath() + File.separator + data.getInPath() + File.separator; - ResultDto dto = new ResultDto( - data.getInPath(), - basePath + config.getTerrainFile(), - basePath + config.getBuildingFile(), - basePath + config.getWaterPath(), - basePath + config.getFlowPath(), - config.getInPath(), - config.getOutPath(), - data.getEpsg()); - LayerDto layer = new LayerDto(config.getVer(), data.getEpsg(), config.getSizes()); - process(dto, layer); - } - private void process(ResultDto dto, LayerDto layer) throws Exception { try { copeTerrain(dto, layer); - //copeBuilding(dto, layer); - List<BuildingDepthVo> buildings = copeWater(dto, layer); + 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()) { @@ -102,15 +70,29 @@ public void copeTerrain(ResultDto dto, LayerDto layer) { Dataset ds = null; try { - // gdalconst锛実dalconstConstants - ds = gdal.Open(dto.getTerrainFile(), gdalconstConstants.GA_ReadOnly); + ds = gdal.Open(dto.getTerrainFile(), gdalconstConstants.GA_ReadOnly); // gdalconst if (null == ds || 0 == ds.getRasterCount()) return; + setSizes(ds, layer); setTerrainInfo(ds, layer); setWaterInfo(dto, layer); createTerrainPng(dto, ds, layer); } finally { if (null != ds) ds.delete(); + } + } + + private void setSizes(Dataset ds, LayerDto layer) { + int xSize = ds.getRasterXSize(), ySize = ds.getRasterYSize(); + double rate = xSize < ySize ? xSize * 1.0 / ySize : ySize * 1.0 / xSize; + + List<int[]> list = layer.getTerrain().getSize(); + for (int i = 0, c = list.size(); i < c; i++) { + if (xSize < ySize) { + list.get(i)[0] = (int) Math.floor(list.get(i)[0] * rate); + } else { + list.get(i)[1] = (int) Math.floor(list.get(i)[1] * rate); + } } } @@ -199,10 +181,6 @@ processWaters(dto, files, layer); - if (new File(dto.getBuildingFile()).exists()) { - return processBuilding(dto, files, layer); - } - return null; } @@ -242,20 +220,6 @@ } public void setWaterHeight(LayerDto layer, List<String> files) { - /*files.parallelStream().forEach(file -> { - Dataset ds = null; - try { - ds = gdal.Open(file, gdalconstConstants.GA_ReadOnly); - if (null == ds || 0 == ds.getRasterCount()) return; - - double[] mm = new double[2]; - ds.GetRasterBand(1).ComputeRasterMinMax(mm, 0); - layer.getWaters().setHeight(mm[0], mm[1]); - } finally { - if (null != ds) ds.delete(); - } - });*/ - int c = files.size(), step = files.size() / 10; if (step < 1) step = 1; for (int i = 0; i < c; i += step) { @@ -321,7 +285,7 @@ float[] buffer = new float[width * height]; band.ReadRaster(0, 0, width, height, buffer); double[] transform = ds.GetGeoTransform(); - buffer = interpolateGrid(buffer, width); + buffer = interpolateGrid(buffer, width, height); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); //double differ = layer.getWaters().getMaxHeight() - layer.getWaters().getMinHeight(), minHeight = layer.getWaters().getMinHeight(); @@ -362,42 +326,42 @@ /** * 鎻掑�煎鐞�-鍥涢偦鍩� */ - public float[] interpolateGrid(float[] buffer, int size) { - float[] tempBuffer = new float[size * size]; - for (int i = 0; i < size; i++) { - for (int j = 0; j < size; j++) { - int index = i * size + j; + public float[] interpolateGrid(float[] buffer, int width, int height) { + float[] tempBuffer = new float[width * height]; + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int index = x + y * width; float current = buffer[index]; - if (current == 0) { + if (current <= MIN_VAL) { float sum = 0; int count = 0; // 妫�鏌ヤ笂閭� - if (i > 0) { - float neighbor = buffer[(i - 1) * size + j]; + if (y > 0) { + float neighbor = buffer[x + (y - 1) * width]; if (neighbor > MIN_VAL) { sum += neighbor; count++; } } // 妫�鏌ヤ笅閭� - if (i < size - 1) { - float neighbor = buffer[(i + 1) * size + j]; + if (y < height - 1) { + float neighbor = buffer[x + (y + 1) * width]; if (neighbor > MIN_VAL) { sum += neighbor; count++; } } // 妫�鏌ュ乏閭� - if (j > 0) { - float neighbor = buffer[i * size + (j - 1)]; + if (x > 0) { + float neighbor = buffer[x - 1 + y * width]; if (neighbor > MIN_VAL) { sum += neighbor; count++; } } // 妫�鏌ュ彸閭� - if (j < size - 1) { - float neighbor = buffer[i * size + (j + 1)]; + if (x < width - 1) { + float neighbor = buffer[x + 1 + y * width]; if (neighbor > MIN_VAL) { sum += neighbor; count++; @@ -414,154 +378,8 @@ } } } - // 灏嗕复鏃舵暟缁勫鍒跺洖鍘熸暟缁� - //System.arraycopy(tempBuffer, 0, buffer, 0, tempBuffer.length); + //System.arraycopy(tempBuffer, 0, buffer, 0, tempBuffer.length); // 澶嶅埗鍥炲師鏁扮粍 return tempBuffer; - } - - public 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), gdalconstConstants.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; - } - - public 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, val)); - } - } - - public 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 startX = (int) Math.floor((env[0] - minX) / pixelWidth); - int endX = (int) Math.floor((env[1] - minX) / pixelWidth); - int startY = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); - int endY = (int) Math.floor((maxY - env[2]) / Math.abs(pixelHeight)); - if (startX < 0) startX = 0; - if (startY < 0) startY = 0; - if (endX > ds.getRasterXSize()) endX = ds.getRasterXSize(); - if (endY > ds.getRasterYSize()) endY = ds.getRasterYSize(); - if (endX - startX < 1 || endY - startY < 1) return null; - - int width = endX - startX; - int height = endY - startY; - double[] pixelValues = new double[width * height]; - ds.GetRasterBand(1).ReadRaster(startX, startY, width, height, pixelValues); - - Double val = Arrays.stream(pixelValues).max().getAsDouble(); - - return ComHelper.isValid(val) ? val : null; - } - - public void createVectors(ResultDto dto, Dataset ds, LayerDto layer, Long ticks) { - String filePath = dto.getOutPath() + File.separator + "waters" + File.separator + ticks + File.separator + "polygonize.geojson"; - ShpHelper.polygonize2Geojson(ds, filePath); - - /*List<Geometry> geometries = getGeometries(filePath); - if (CollectionUtils.isEmpty(geometries)) return; - - List<PondingPo> list = copePonding(dto, ds, layer, geometries); - if (CollectionUtils.isEmpty(list)) return; - - try { - filePath = dto.getOutPath() + File.separator + "waters" + File.separator + ticks + File.separator + "water.json"; - ComHelper.writeJson(filePath, JSON.toJSONString(list)); - } catch (Exception ex) { - log.error(ex.getMessage(), ex); - }*/ - } - - public List<Geometry> getGeometries(String filePath) { - if (!FileUtil.exist(filePath)) return null; - - Driver driver = null; - DataSource dataSource = null; - org.gdal.ogr.Layer layer = null; - try { - driver = ogr.GetDriverByName("GeoJSON"); - if (null == driver) return null; - - DataSource ds = driver.Open(filePath); - if (null == ds) return null; - - layer = ds.GetLayer(0); - List<Geometry> list = new ArrayList<>(); - for (long i = 0, d = layer.GetFeatureCount(); i < d; i++) { - Feature f = layer.GetFeature(i); - if (f.GetFieldAsDouble("val") < -999) continue; - - list.add(f.GetGeometryRef()); - } - - return list; - } catch (Exception ex) { - log.error(ex.getMessage(), ex); - return null; - } finally { - GdalHelper.delete(layer, dataSource, driver); - } - } - - public List<PondingPo> copePonding(ResultDto dto, Dataset ds, LayerDto layer, List<Geometry> geometries) { - double[] transform = ds.GetGeoTransform(); - int xSize = ds.getRasterXSize(), ySize = ds.getRasterYSize(); - - List<PondingPo> list = new ArrayList<>(); - for (Geometry geometry : geometries) { - //List<PointDto> points = getValues(ds, geometry, transform, xSize, ySize); - //if (CollectionUtils.isEmpty(points)) continue; - - //PointDto point = Collections.max(points); - PointDto point = getValues(ds, geometry, transform, xSize, ySize); - if (null == point) continue; - - list.add(new PondingPo(geometry, point)); - } - - return list; - } - - public PointDto getValues(Dataset ds, Geometry g, double[] transform, int xSize, int ySize) { - double[] env = new double[4]; - g.GetEnvelope(env); - - int startX = (int) Math.floor((env[0] - transform[0]) / transform[1]); - int endX = (int) Math.floor((env[1] - transform[0]) / transform[1]); - int startY = (int) Math.floor((transform[3] - env[3]) / Math.abs(transform[5])); - int endY = (int) Math.floor((transform[3] - env[2]) / Math.abs(transform[5])); - if (startX < 0) startX = 0; - if (startY < 0) startY = 0; - if (endX > ds.getRasterXSize()) endX = ds.getRasterXSize(); - if (endY > ds.getRasterYSize()) endY = ds.getRasterYSize(); - if (endX - startX < 1 || endY - startY < 1) return null; - - int width = endX - startX; - int height = endY - startY; - double[] pixelValues = new double[width * height]; - ds.GetRasterBand(1).ReadRaster(startX, startY, width, height, pixelValues); - - Double val = Arrays.stream(pixelValues).max().getAsDouble(); - - return new PointDto(g.Centroid().GetX(), g.Centroid().GetY(), ComHelper.isValid(val) ? val : 0.0); } public void copeFlow(ResultDto dto, LayerDto layer) { @@ -646,24 +464,6 @@ } ComHelper.savePng(image, png); } - -/* - public void vxyTif2Png(LayerDto layer, String tif, String png, int width, int height) { - Dataset ds = null; - try { - ds = gdal.Open(tif, gdalconstConstants.GA_ReadOnly); - if (null == ds || 0 == ds.getRasterCount()) return; - - float[] vxBuffer = new float[width * height], vyBuffer = new float[width * height]; - ds.GetRasterBand(2).ReadRaster(0, 0, width, height, vxBuffer); - ds.GetRasterBand(3).ReadRaster(0, 0, width, height, vyBuffer); - - createFlowPng(vxBuffer, vyBuffer, png, width, height); - } finally { - if (null != ds) ds.delete(); - } - } -*/ /*public void createFlowPng(float[] vxBuffer, float[] vyBuffer, String png, int width, int height) { BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); -- Gitblit v1.9.3