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/helper/ComHelper.java | 41 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 41 insertions(+), 0 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); -- Gitblit v1.9.3