From a6fe405947004d6571806edabd8f14357e144cfa Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 14 十月 2024 17:31:31 +0800 Subject: [PATCH] 1 --- src/main/java/com/se/simu/service/ResultService.java | 122 +++++++++++++++++++++++++++------------- 1 files changed, 81 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/se/simu/service/ResultService.java b/src/main/java/com/se/simu/service/ResultService.java index b40b757..772ec93 100644 --- a/src/main/java/com/se/simu/service/ResultService.java +++ b/src/main/java/com/se/simu/service/ResultService.java @@ -1,14 +1,14 @@ package com.se.simu.service; import cn.hutool.core.io.FileUtil; -import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; import com.se.simu.config.PropertiesConfig; import com.se.simu.domain.dto.ExtensionDto; import com.se.simu.domain.dto.LayerDto; import com.se.simu.domain.dto.ResultDto; +import com.se.simu.domain.po.DataPo; import com.se.simu.helper.GdalHelper; import lombok.extern.slf4j.Slf4j; -import nonapi.io.github.classgraph.utils.FileUtils; import org.gdal.gdal.Band; import org.gdal.gdal.Dataset; import org.gdal.gdal.WarpOptions; @@ -40,7 +40,7 @@ public final static double MAX_X_OFFSET = 0.002; - public String test() throws Exception { + public String testResuslt() throws Exception { ResultDto dto = new ResultDto( "202409", "D:\\simu\\input\\tongzhou-local-mesh2-terrain.tif", @@ -49,15 +49,28 @@ "D:\\simu\\input\\flows", "D:\\simu\\out", ""); - process(dto); + LayerDto layer = new LayerDto(config.getVer(), 4528, config.getSizes()); + process(dto, layer); return "OK"; } - public void process(ResultDto dto) throws Exception { - try { - LayerDto layer = new LayerDto(config.getVer()); + public void process(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.getOutPath(), + ""); + 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); copeWater(dto, layer); @@ -128,14 +141,11 @@ private static void Resample(Dataset ds, String dest, int width, int height, LayerDto layer) { Vector<String> vector = new Vector<>(); - //vector.add("-s_srs"); - //vector.add("EPSG:" + 4326); vector.add("-t_srs"); vector.add("EPSG:" + 4326); - vector.add("-r"); - vector.add("bilinear"); - vector.add("-of"); - vector.add("GTiff"); + vector.add("-ts"); + vector.add("" + width); + vector.add("" + height); vector.add("-te"); vector.add("" + layer.getExtension().getMinx()); vector.add("" + layer.getExtension().getMiny()); @@ -143,6 +153,10 @@ vector.add("" + layer.getExtension().getMaxy()); vector.add("-te_srs"); vector.add("EPSG:" + 4326); + vector.add("-r"); + vector.add("bilinear"); + vector.add("-of"); + vector.add("GTiff"); WarpOptions warpOptions = new WarpOptions(vector); Dataset destDs = gdal.Warp(dest, new Dataset[]{ds}, warpOptions); @@ -161,11 +175,6 @@ band.ReadRaster(0, 0, width, height, buffer); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D graphic = image.createGraphics(); - Color transparent = new Color(0, 0, 0, 0); - graphic.setColor(transparent); - graphic.clearRect(0, 0, width, height); - double differ = layer.getExtension().getMaxHeight() - layer.getExtension().getMinHeight(), minHeight = layer.getExtension().getMinHeight(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { @@ -182,15 +191,25 @@ } Color color = new Color(r, g, b, 127); - //image.setRGB(x, y, color.getRGB()); - graphic.drawImage(image, x, y, 1, 1, color, null); + //graphic.drawImage(image, x, y, 1, 1, color, null); + image.setRGB(x, y, color.getRGB()); } } - graphic.dispose(); savePng(image, png); } finally { if (null != ds) ds.delete(); } + } + + private static BufferedImage createImage(int width, int height) { + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D graphic = image.createGraphics(); + Color transparent = new Color(0, 0, 0, 0); + graphic.setColor(transparent); + graphic.clearRect(0, 0, width, height); + graphic.dispose(); + + return image; } private static void savePng(BufferedImage image, String png) { @@ -250,9 +269,9 @@ } private static List<String> getFiles(String path, String suffix) { - List<String> files = new ArrayList<>(); getFiles(files, new File(path), suffix); + files.sort((a, b) -> a.compareToIgnoreCase(b)); return files; } @@ -281,11 +300,13 @@ private static void setWaterData(LayerDto layer, List<String> files) { Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); + calendar.set(Calendar.MILLISECOND, 0); + for (String file : files) { - String fileName = new File(file).getName(); + String fileName = getNameWithExt(file); int hour = Integer.parseInt(fileName.substring(0, 2)); - int minute = Integer.parseInt(fileName.substring(2, 2)); - int second = Integer.parseInt(fileName.substring(4, 2)); + int minute = Integer.parseInt(fileName.substring(2, 4)); + int second = Integer.parseInt(fileName.substring(4, 6)); calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minute); @@ -298,10 +319,10 @@ } private static void setWaterHeight(LayerDto layer, List<String> files) { - for (int i = 0, c = files.size(); i < c; i++) { + files.parallelStream().forEach(file -> { Dataset ds = null; try { - ds = gdal.Open(files.get(i), gdalconst.GA_ReadOnly); + ds = gdal.Open(file, gdalconst.GA_ReadOnly); if (null == ds || 0 == ds.getRasterCount() || null == ds.GetSpatialRef()) return; double[] mm = new double[2]; @@ -310,7 +331,7 @@ } finally { if (null != ds) ds.delete(); } - } + }); layer.getExtension().setMinHeight(getMinVal(layer.getExtension().getMinHeight() - 1, 1000)); layer.getExtension().setMaxHeight(getMaxVal(layer.getExtension().getMaxHeight() + 1, 1000)); } @@ -346,7 +367,7 @@ } private static String getNameWithExt(String file) { - return file.substring(file.lastIndexOf(File.separator), file.lastIndexOf(".")); + return file.substring(file.lastIndexOf(File.separator) + 1, file.lastIndexOf(".")); } private static void water2Png(ResultDto dto, LayerDto layer, String tif, String png, int width, int height) { @@ -362,11 +383,6 @@ float[] building = dto.getBuildings().get(width + "_" + height); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D graphic = image.createGraphics(); - Color transparent = new Color(0, 0, 0, 0); - graphic.setColor(transparent); - graphic.clearRect(0, 0, width, height); - double differ = layer.getExtension().getMaxHeight() - layer.getExtension().getMinHeight(), minHeight = layer.getExtension().getMinHeight(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { @@ -384,11 +400,9 @@ } Color color = new Color(r, g, b, 127); - //image.setRGB(x, y, color.getRGB()); - graphic.drawImage(image, x, y, 1, 1, color, null); + image.setRGB(x, y, color.getRGB()); } } - graphic.dispose(); savePng(image, png); } finally { if (null != ds) ds.delete(); @@ -400,8 +414,8 @@ List<String> vyFiles = new ArrayList<>(); List<String> files = getFiles(dto.getFlowPath(), ".tif"); for (String file : files) { - if (file.startsWith("vx")) vxFiles.add(file); - if (file.startsWith("vy")) vyFiles.add(file); + if (file.contains(File.separator + "vx")) vxFiles.add(file); + if (file.contains(File.separator + "vy")) vyFiles.add(file); } if (null == vxFiles || null == vyFiles || vxFiles.size() != vyFiles.size() || vxFiles.size() != layer.getWaters().getData().size()) return; @@ -461,7 +475,28 @@ } private static void createFlowPng(float[] vxBuffer, float[] vyBuffer, String png, int width, int height) { - // + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + // 鐢� R閫氶亾琛ㄧず锛屾祦鍚戜负褰掍竴鍖栫殑浜岀淮鍚戦噺锛坸,y锛夛紝G閫氶亾琛ㄧず涓� x *255 , B閫氶亾琛ㄧず涓� y * 255 + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int offset = x + y * width; + float fx = getFloatValue(vxBuffer[offset]); + float fy = getFloatValue(vyBuffer[offset]); + if (Float.isNaN(fx) && Float.isNaN(fy) || (fx == 0 && fy == 0)) continue; + + fx = Float.isNaN(fx) ? 0 : fx; + fy = Float.isNaN(fy) ? 0 : fy; + double dr = Math.sqrt(Math.pow(fx, 2) + Math.pow(fy, 2)); + + int r = (int) (dr / 4 * 255); + int g = (int) ((fx / dr * 0.5 + 0.5) * 255); + int b = (int) ((fy / dr * 0.5 + 0.5) * 255); + + Color color = new Color(getSafeValue(r), getSafeValue(g), getSafeValue(b), 127); + image.setRGB(x, y, color.getRGB()); + } + } + savePng(image, png); } private static float getFloatValue(float val) { @@ -475,8 +510,13 @@ return val; } + /** + * 鍏冩暟鎹� + */ private void copeLayerJson(ResultDto dto, LayerDto layer) throws IOException { - String json = JSONUtil.toJsonPrettyStr(layer); + layer.getWaters().setFiles(null); + //String json = JSONUtil.toJsonPrettyStr(layer); + String json = JSON.toJSONString(layer); String filePath = dto.getOutPath() + File.separator + "layer.json"; FileWriter fw = new FileWriter(filePath); -- Gitblit v1.9.3