From 8f3d45ded35c23d233b9891d3d69de2635f2a125 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期四, 14 九月 2023 17:32:41 +0800 Subject: [PATCH] 栅格分析按照Band进行计算~ --- src/main/java/com/moon/server/service/data/RasterAnalysisService.java | 131 +++++++++++++++++-------------------------- src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java | 43 +++++++++----- 2 files changed, 78 insertions(+), 96 deletions(-) diff --git a/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java b/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java index a1c1d1b..4a6a83a 100644 --- a/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java +++ b/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java @@ -2,7 +2,6 @@ import com.moon.server.helper.WebHelper; -import java.io.DataOutput; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -17,6 +16,9 @@ public AnalysisResultEntity() { this.code = 200; + this.minList = new ArrayList<>(); + this.avgList = new ArrayList<>(); + this.maxList = new ArrayList<>(); this.points = new ArrayList<>(); } @@ -28,13 +30,22 @@ this.points.add(point); } + /** + * 娣诲姞Band鍊� + */ + public void addBandVals(double min, double avg, double max) { + this.minList.add(WebHelper.round(min, 3)); + this.avgList.add(WebHelper.round(avg, 3)); + this.maxList.add(WebHelper.round(max, 3)); + } + private String layerName; - private Double min; + private List<Double> minList; - private Double avg; + private List<Double> avgList; - private Double max; + private List<Double> maxList; private int code; @@ -50,28 +61,28 @@ this.layerName = layerName; } - public Double getMin() { - return min; + public List<Double> getMinList() { + return minList; } - public void setMin(Double min) { - this.min = WebHelper.round(min, 3); + public void setMinList(List<Double> minList) { + this.minList = minList; } - public Double getAvg() { - return avg; + public List<Double> getAvgList() { + return avgList; } - public void setAvg(Double avg) { - this.avg = avg; + public void setAvgList(List<Double> avgList) { + this.avgList = avgList; } - public Double getMax() { - return max; + public List<Double> getMaxList() { + return maxList; } - public void setMax(Double max) { - this.max = max; + public void setMaxList(List<Double> maxList) { + this.maxList = maxList; } public int getCode() { 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 8d3d40d..80be306 100644 --- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java +++ b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java @@ -14,11 +14,7 @@ import org.gdal.gdal.gdal; import org.gdal.ogr.Geometry; import org.gdal.ogr.ogr; -import org.gdal.osr.SpatialReference; -import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.springframework.stereotype.Service; -import org.geotools.referencing.CRS; -import sun.awt.IconInfo; import javax.annotation.Resource; import java.awt.geom.Point2D; @@ -133,16 +129,11 @@ int xPixel = (int) Math.floor((x - minX) / pixelWidth); int yPixel = (int) Math.floor((maxY - y) / Math.abs(pixelHeight)); - List<double[]> list = new ArrayList<>(); for (int i = 1; i <= bandCount; i++) { double[] pixelValues = new double[size * size]; Band band = ds.GetRasterBand(i); band.ReadRaster(xPixel, yPixel, size, size, pixelValues); - - list.add(pixelValues); } - - processResult(entity, list); } /** @@ -210,8 +201,7 @@ } } } - - processResult(list, entity); + // processResult(list, entity) } /** @@ -233,16 +223,12 @@ int geoWidth = Math.abs(xMaxPixel - xMinPixel); int geoHeight = Math.abs(yMaxPixel - yMinPixel); - List<double[]> list = new ArrayList<>(); for (int i = 1; i <= bandCount; i++) { - Band band = ds.GetRasterBand(i); double[] pixelValues = new double[geoWidth * geoHeight]; - band.ReadRaster(xMinPixel, yMinPixel, geoWidth, geoHeight, pixelValues); + ds.GetRasterBand(i).ReadRaster(xMinPixel, yMinPixel, geoWidth, geoHeight, pixelValues); - list.add(pixelValues); + setBandVals(entity, pixelValues); } - - processResult(entity, list); } /** @@ -254,75 +240,22 @@ } /** - * 澶勭悊缁撴灉 + * 璁剧疆Band鍊� */ - private void processResult(AnalysisResultEntity entity, List<double[]> list) { - if (null == list || list.isEmpty()) { + private void setBandVals(AnalysisResultEntity entity, double[] pixelValues) { + if (null == pixelValues || pixelValues.length == 0) { return; } - List<Double> rs = new ArrayList<>(); - for (double[] ds : list) { - if (null != ds && ds.length > 0) { - for (double d : ds) { - rs.add(d); - } - } + List<Double> list = new ArrayList<>(); + for (double val : pixelValues) { + list.add(val); } - processResult(rs, entity); - } - - /** - * 澶勭悊缁撴灉 - */ - private void processResult(List<Double> rs, AnalysisResultEntity entity) { - 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); - } - - public void processClippedDataByLine(String imagePath, String geometryString) { - // 娉ㄥ唽GDAL椹卞姩 - gdal.AllRegister(); - // 鎵撳紑鏍呮牸鍥惧儚鏁版嵁闆� - Dataset dataset = gdal.Open(imagePath); - if (dataset == null) { - throw new RuntimeException("Failed to open raster dataset."); - } - - Geometry geometry = Geometry.CreateFromWkt(geometryString); - - Dataset clippedDataset = clipRaster(dataset, geometry); - - int width = clippedDataset.GetRasterXSize(); - int height = clippedDataset.GetRasterYSize(); - int bandCount = clippedDataset.getRasterCount(); - - List<double[]> sum = new ArrayList<>(); - for (int bandIndex = 1; bandIndex <= bandCount; bandIndex++) { - Band band = clippedDataset.GetRasterBand(bandIndex); - - double[] pixelValues = new double[width * height]; - band.ReadRaster(0, 0, width, height, pixelValues); - - sum.add(pixelValues); - } - } - - public static Dataset clipRaster(Dataset dataset, Geometry geometry) { - Vector<String> warpOptions = new Vector<>(); - warpOptions.add("-crop_to_cutline"); - warpOptions.add("-cutline"); - warpOptions.add(geometry.ExportToWkt()); - warpOptions.add("-dstalpha"); - - return gdal.Warp("", new Dataset[]{dataset}, new WarpOptions(warpOptions)); + double min = Collections.min(list); + double max = Collections.max(list); + double avg = list.stream().mapToDouble(Double::valueOf).average().getAsDouble(); + entity.addBandVals(min, avg, max); } /** @@ -370,4 +303,42 @@ return list; } + + private void processClippedDataByLine(String imagePath, String geometryString) { + // 娉ㄥ唽GDAL椹卞姩 + gdal.AllRegister(); + // 鎵撳紑鏍呮牸鍥惧儚鏁版嵁闆� + Dataset dataset = gdal.Open(imagePath); + if (dataset == null) { + throw new RuntimeException("Failed to open raster dataset."); + } + + Geometry geometry = Geometry.CreateFromWkt(geometryString); + + Dataset clippedDataset = clipRaster(dataset, geometry); + + int width = clippedDataset.GetRasterXSize(); + int height = clippedDataset.GetRasterYSize(); + int bandCount = clippedDataset.getRasterCount(); + + List<double[]> sum = new ArrayList<>(); + for (int bandIndex = 1; bandIndex <= bandCount; bandIndex++) { + Band band = clippedDataset.GetRasterBand(bandIndex); + + double[] pixelValues = new double[width * height]; + band.ReadRaster(0, 0, width, height, pixelValues); + + sum.add(pixelValues); + } + } + + private Dataset clipRaster(Dataset dataset, Geometry geometry) { + Vector<String> warpOptions = new Vector<>(); + warpOptions.add("-crop_to_cutline"); + warpOptions.add("-cutline"); + warpOptions.add(geometry.ExportToWkt()); + warpOptions.add("-dstalpha"); + + return gdal.Warp("", new Dataset[]{dataset}, new WarpOptions(warpOptions)); + } } -- Gitblit v1.9.3