From 50155d2d6da56ac59a672755a704ed1503ffe3f6 Mon Sep 17 00:00:00 2001 From: dcb <xgybdcb@163.com> Date: 星期四, 19 六月 2025 10:07:18 +0800 Subject: [PATCH] 修复返回的模拟结果中最大最小水深问题 --- src/main/java/com/se/nsl/helper/ComHelper.java | 80 +++++++++++++++++++++++++++++++++++++-- 1 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/se/nsl/helper/ComHelper.java b/src/main/java/com/se/nsl/helper/ComHelper.java index 417ee73..fe10817 100644 --- a/src/main/java/com/se/nsl/helper/ComHelper.java +++ b/src/main/java/com/se/nsl/helper/ComHelper.java @@ -2,10 +2,7 @@ import com.se.nsl.domain.dto.*; import lombok.extern.slf4j.Slf4j; -import org.gdal.gdal.Band; -import org.gdal.gdal.Dataset; -import org.gdal.gdal.WarpOptions; -import org.gdal.gdal.gdal; +import org.gdal.gdal.*; import org.gdal.gdalconst.gdalconst; import org.gdal.ogr.Geometry; import org.gdal.ogr.ogr; @@ -70,6 +67,37 @@ destDs.delete(); } + public static void Resample(Dataset ds, Integer targetEpsg, String dest, Double destNoData, String wkt, Integer width, Integer height) { + Vector<String> vector = new Vector<>(); + if (targetEpsg != null) { + //vector.add("-s_srs"); + //vector.add("EPSG:" + 4548); + vector.add("-t_srs"); + vector.add("EPSG:" + targetEpsg); + } + //if (destNoData != null) { + // vector.add("-dstnodata"); + // vector.add("" + destNoData); + //} + if (wkt != null) { + vector.add("-cutline"); + vector.add(wkt); + vector.add("-crop_to_cutline"); + } + if (width != null && height != null) { + vector.add("-ts"); + vector.add("" + width); + vector.add("" + height); + } + vector.add("-r"); + vector.add("bilinear"); // 鍙岀嚎鎬ф彃鍊� + vector.add("-of"); + vector.add("GTiff"); + + Dataset destDs = gdal.Warp(dest, new Dataset[]{ds}, new WarpOptions(vector)); + if (null != destDs) destDs.delete(); + } + public static void Resample2(Dataset ds, String dest, int width, int height, LayerDto layer) { Vector<String> vector = new Vector<>(); vector.add("-s_srs"); @@ -87,15 +115,57 @@ //vector.add("-te_srs"); //vector.add("EPSG:" + 4326); vector.add("-r"); - vector.add("average"); +// vector.add("average"); + vector.add("cubic"); vector.add("-of"); vector.add("GTiff"); WarpOptions warpOptions = new WarpOptions(vector); Dataset destDs = gdal.Warp(dest, new Dataset[]{ds}, warpOptions); + updateLayerExtension(destDs, layer); destDs.delete(); } + private static void updateLayerExtension(Dataset ds, LayerDto layer) { + double[] bbox = readTifBbox(ds); + double minLon = bbox[0]; + double maxLon = bbox[1]; + double minLat = bbox[2]; + double maxLat = bbox[3]; + ExtensionDto extension = layer.getExtension(); + double minx = extension.getMinx(); + double miny = extension.getMiny(); + double maxx = extension.getMaxx(); + double maxy = extension.getMaxy(); + if (minx > minLon) extension.setMinx(minLon); + if (miny > minLat) extension.setMiny(minLat); + if (maxx < maxLon) extension.setMaxx(maxLon); + if (maxy < maxLat) extension.setMaxy(maxLat); + } + + private static double[] readTifBbox(Dataset ds) { + // 1. 鑾峰彇鍥惧儚灏哄 + int width = ds.getRasterXSize(); + int height = ds.getRasterYSize(); + + // 2. 鑾峰彇GeoTransform鍙傛暟 + double[] geoTransform = new double[6]; + ds.GetGeoTransform(geoTransform); + + // 3. 瑙f瀽GeoTransform鍙傛暟锛堢粡绾害鍧愭爣锛� + double originLon = geoTransform[0]; // 宸︿笂瑙掔粡搴� + double originLat = geoTransform[3]; // 宸︿笂瑙掔含搴� + double pixelWidth = geoTransform[1]; // 缁忓害鏂瑰悜鍒嗚鲸鐜囷紙搴�/鍍忕礌锛� + double pixelHeight = geoTransform[5]; // 绾害鏂瑰悜鍒嗚鲸鐜囷紙搴�/鍍忕礌锛岄�氬父涓鸿礋锛� + + // 4. 璁$畻鍥涜嚦鑼冨洿锛堢粡绾害锛� + double minLon = Math.min(originLon, originLon + width * pixelWidth); + double maxLon = Math.max(originLon, originLon + width * pixelWidth); + double minLat = Math.min(originLat, originLat + height * pixelHeight); + double maxLat = Math.max(originLat, originLat + height * pixelHeight); + return new double[] {minLon, maxLon, minLat, maxLat}; + } + public static BuildingDto intersects(ResultDto dto, double x, double y) { Geometry p = new Geometry(ogr.wkbPoint); p.AddPoint_2D(x, y); -- Gitblit v1.9.3