From e040d561d798536f666fffbe33f9b43ecbed5bba Mon Sep 17 00:00:00 2001 From: SundaySee <xgybdcb@163.com> Date: 星期四, 15 五月 2025 18:44:35 +0800 Subject: [PATCH] 修复设置layer的extension的问题 --- src/main/java/com/se/nsl/service/TestService.java | 26 ++++--------- src/main/java/com/se/nsl/helper/ComHelper.java | 41 ++++++++++++++++++++ 2 files changed, 49 insertions(+), 18 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..9946591 100644 --- a/src/main/java/com/se/nsl/helper/ComHelper.java +++ b/src/main/java/com/se/nsl/helper/ComHelper.java @@ -93,9 +93,50 @@ 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); diff --git a/src/main/java/com/se/nsl/service/TestService.java b/src/main/java/com/se/nsl/service/TestService.java index 5953381..401352b 100644 --- a/src/main/java/com/se/nsl/service/TestService.java +++ b/src/main/java/com/se/nsl/service/TestService.java @@ -99,10 +99,14 @@ public void setTerrainInfo(Dataset ds, LayerDto layer) { Geometry minPoint = GdalHelper.getMinPoint(ds); Geometry maxPoint = GdalHelper.getMaxPoint(ds); - double minx = ComHelper.getMinVal(minPoint.GetX(0), 10000000); - double miny = ComHelper.getMinVal(minPoint.GetY(0), 10000000); - double maxx = ComHelper.getMaxVal(maxPoint.GetX(0) + MAX_X_OFFSET, 10000000); - double maxy = ComHelper.getMaxVal(maxPoint.GetY(0), 10000000); +// double minx = ComHelper.getMinVal(minPoint.GetX(0), 10000000); +// double miny = ComHelper.getMinVal(minPoint.GetY(0), 10000000); +// double maxx = ComHelper.getMaxVal(maxPoint.GetX(0) + MAX_X_OFFSET, 10000000); +// double maxy = ComHelper.getMaxVal(maxPoint.GetY(0), 10000000); + double minx = Double.MAX_VALUE; + double miny = Double.MAX_VALUE; + double maxx = Double.MIN_VALUE; + double maxy = Double.MIN_VALUE; //layer.setExtension(new ExtensionDto(minx, miny, maxx, maxy, Double.MAX_VALUE, Double.MIN_VALUE)); Band band = ds.GetRasterBand(1); @@ -222,10 +226,6 @@ public void setWaterHeight(LayerDto layer, List<String> files) { int c = files.size(), step = files.size() / 10; if (step < 1) step = 1; - double minx = Double.MAX_VALUE; - double miny = Double.MAX_VALUE; - double maxx = Double.MIN_VALUE; - double maxy = Double.MIN_VALUE; for (int i = 0; i < c; i += step) { Dataset ds = null; try { @@ -235,16 +235,6 @@ double[] mm = new double[2]; ds.GetRasterBand(1).ComputeRasterMinMax(mm, 0); layer.getWaters().setHeight(mm[0], mm[1]); - - double[] bbox = readTifBbox(ds); - double minLon = bbox[0]; - double maxLon = bbox[1]; - double minLat = bbox[2]; - double maxLat = bbox[3]; - if (minx > minLon) minx = minLon; - if (miny > minLat) miny = minLat; - if (maxx < maxLon) maxx = maxLon; - if (maxy < maxLat) maxy = maxLat; } finally { if (null != ds) ds.delete(); } -- Gitblit v1.9.3