From 636f52fc934cd4fdc61472d786dec14616b2f2fa Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 11 九月 2023 18:02:37 +0800 Subject: [PATCH] 修改栅格分析-1 --- src/main/java/com/moon/server/service/data/RasterAnalysisService.java | 30 ++++++++++++++++++------------ 1 files changed, 18 insertions(+), 12 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 ae472e7..d443f94 100644 --- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java +++ b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java @@ -133,20 +133,23 @@ 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]; + polyline.GetEnvelope(env); - double[] bounds = new double[4]; - polyline.GetEnvelope(bounds); - double startX = bounds[0], endX = bounds[1], startY = bounds[2], endY = bounds[3]; + int xMinPixel = (int) Math.floor((env[0] - minX) / pixelWidth); + int yMinPixel = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); + int xMaxPixel = (int) Math.floor((env[1] - minX) / pixelWidth); + int yMaxPixel = (int) Math.floor((maxY - env[2]) / Math.abs(pixelHeight)); int bandCount = ds.getRasterCount(); - int xStartPixel = (int) Math.floor((startX - minX) / pixelWidth); - int yStartPixel = (int) Math.floor((maxY - startY) / Math.abs(pixelHeight)); - int xEndPixel = (int) Math.floor((endX - minX) / pixelWidth); - int yEndPixel = (int) Math.floor((maxY - endY) / Math.abs(pixelHeight)); + int xMin = Math.min(xMinPixel, xMaxPixel); + int xMax = Math.max(xMinPixel, xMaxPixel); + int yMin = Math.min(yMinPixel, yMaxPixel); + int yMax = Math.max(yMinPixel, yMaxPixel); List<Double> list = new ArrayList<>(); - for (int y = Math.min(yStartPixel, yEndPixel); y <= Math.max(yStartPixel, yEndPixel); y++) { - for (int x = Math.min(xStartPixel, xEndPixel); x <= Math.max(xStartPixel, xEndPixel); x++) { + for (int y = yMin; y <= yMax; y++) { + 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)) { @@ -173,9 +176,9 @@ polygon.GetEnvelope(env); int xMinPixel = (int) Math.floor((env[0] - minX) / pixelWidth); - int yMinPixel = (int) Math.floor((maxY - env[2]) / Math.abs(pixelHeight)); + int yMinPixel = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); int xMaxPixel = (int) Math.floor((env[1] - minX) / pixelWidth); - int yMaxPixel = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); + int yMaxPixel = (int) Math.floor((maxY - env[2]) / Math.abs(pixelHeight)); int bandCount = ds.getRasterCount(); int geoWidth = Math.abs(xMaxPixel - xMinPixel); @@ -225,8 +228,11 @@ * 澶勭悊缁撴灉 */ private void processResult(List<Double> rs, AnalysisResultEntity entity) { - double avg = rs.stream().mapToDouble(Double::valueOf).average().getAsDouble(); + if (null == rs || rs.isEmpty()) { + return; + } + double avg = rs.stream().mapToDouble(Double::valueOf).average().getAsDouble(); entity.setMin(Collections.min(rs)); entity.setMax(Collections.max(rs)); entity.setAvg(avg); -- Gitblit v1.9.3