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 +++++++++++++++++-------------------------- 1 files changed, 51 insertions(+), 80 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 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