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