From abb772e08beb75ec1f915921b779168133a5ce54 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 11 九月 2023 21:18:51 +0800 Subject: [PATCH] 解决栅格分析的线查询失败 --- src/main/java/com/moon/server/service/data/RasterAnalysisService.java | 25 ++++++++++++++----------- 1 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java index d443f94..8c02940 100644 --- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java +++ b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java @@ -85,7 +85,7 @@ analysisPoint(entity, ds, geo, size); break; case ogr.wkbLineString: - analysisPolyline(entity, ds, geo); + analysisPolyline(entity, ds, geo, size); break; default: analysisPolygon(entity, ds, geo); @@ -104,8 +104,8 @@ /** * 鍒嗘瀽鐐� */ - public void analysisPoint(AnalysisResultEntity entity, Dataset ds, Geometry point, int size) { - double x = point.GetX(), y = point.GetY(); + public void analysisPoint(AnalysisResultEntity entity, Dataset ds, Geometry geo, int size) { + double x = geo.GetX(), y = geo.GetY(); double[] transform = ds.GetGeoTransform(); // double rotationX = transform[2]; double rotationY = transform[4] double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = transform[5]; @@ -129,17 +129,20 @@ /** * 鍒嗘瀽绾� */ - public void analysisPolyline(AnalysisResultEntity entity, Dataset ds, Geometry polyline) { + public void analysisPolyline(AnalysisResultEntity entity, Dataset ds, Geometry geo, int size) { double[] transform = ds.GetGeoTransform(); // double rotationX = transform[2]; double rotationY = transform[4] - double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = transform[5]; + double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = Math.abs(transform[5]); + + double buffer = Math.max(Math.abs(pixelWidth), Math.abs(pixelHeight)) * size; double[] env = new double[4]; - polyline.GetEnvelope(env); + geo = geo.Buffer(buffer); + geo.GetEnvelope(env); int xMinPixel = (int) Math.floor((env[0] - minX) / pixelWidth); - int yMinPixel = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); + int yMinPixel = (int) Math.floor((maxY - env[3]) / pixelHeight); int xMaxPixel = (int) Math.floor((env[1] - minX) / pixelWidth); - int yMaxPixel = (int) Math.floor((maxY - env[2]) / Math.abs(pixelHeight)); + int yMaxPixel = (int) Math.floor((maxY - env[2]) / pixelHeight); int bandCount = ds.getRasterCount(); int xMin = Math.min(xMinPixel, xMaxPixel); @@ -152,7 +155,7 @@ for (int x = xMin; x <= xMax; x++) { Geometry point = new Geometry(ogr.wkbPoint); point.AddPoint(minX + pixelWidth * x, maxY - pixelHeight * y); - if (polyline.Contains(point)) { + if (geo.Intersects(point)) { for (int i = 1; i <= bandCount; i++) { double[] values = new double[1]; ds.GetRasterBand(i).ReadRaster(x, y, 1, 1, values); @@ -168,12 +171,12 @@ /** * 鍒嗘瀽闈� */ - public void analysisPolygon(AnalysisResultEntity entity, Dataset ds, Geometry polygon) { + public void analysisPolygon(AnalysisResultEntity entity, Dataset ds, Geometry geo) { double[] transform = ds.GetGeoTransform(); // double rotationX = transform[2]; double rotationY = transform[4] double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = transform[5]; double[] env = new double[4]; - polygon.GetEnvelope(env); + geo.GetEnvelope(env); int xMinPixel = (int) Math.floor((env[0] - minX) / pixelWidth); int yMinPixel = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); -- Gitblit v1.9.3