From ce6c5db45473661b6cf4c0825df8ddc2b62289ba Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期六, 16 九月 2023 17:40:43 +0800 Subject: [PATCH] 优化栅格分析-面分析的速度 --- src/main/java/com/moon/server/entity/all/StaticData.java | 2 + src/main/java/com/moon/server/service/data/RasterAnalysisService.java | 68 +++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/moon/server/entity/all/StaticData.java b/src/main/java/com/moon/server/entity/all/StaticData.java index 5a4389b..2cda5d1 100644 --- a/src/main/java/com/moon/server/entity/all/StaticData.java +++ b/src/main/java/com/moon/server/entity/all/StaticData.java @@ -62,6 +62,8 @@ public static final int I60 = 60; + public static final int I64 = 64; + public static final int I90 = 90; public static final int I90_NEG = -90; 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 a2866b4..19f0b96 100644 --- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java +++ b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java @@ -37,6 +37,20 @@ private final static Log log = LogFactory.getLog(RasterAnalysisService.class); /** + * 娴嬭瘯 + */ + public List<AnalysisResultEntity> test(Geometry geo, Integer size) { + List<AnalysisResultEntity> rs = new ArrayList<>(); + AnalysisResultEntity entity = new AnalysisResultEntity(); + entity.setLayerName("Test"); + + openRaster(entity, "D:\\Moon\\data\\DOM\\Lunar_LRO_LOLA_ClrShade_Global_128ppd_v04_2.tif", geo, size); + rs.add(entity); + + return rs; + } + + /** * 鍒嗘瀽鏂规硶 */ public List<AnalysisResultEntity> analysis(Geometry geo, Integer size) { @@ -227,15 +241,53 @@ int yMaxPixel = (int) Math.floor((maxY - env[2]) / pixelHeight); int bandCount = ds.getRasterCount(); - int geoWidth = Math.abs(xMaxPixel - xMinPixel); - int geoHeight = Math.abs(yMaxPixel - yMinPixel); + int width = Math.abs(xMaxPixel - xMinPixel); + int height = Math.abs(yMaxPixel - yMinPixel); + + if (width * height > StaticData.I64 * StaticData.I64) { + readRasterForBlocks(entity, ds, bandCount, xMinPixel, yMinPixel, width, height); + return; + } for (int i = 1; i <= bandCount; i++) { - double[] pixelValues = new double[geoWidth * geoHeight]; - ds.GetRasterBand(i).ReadRaster(xMinPixel, yMinPixel, geoWidth, geoHeight, pixelValues); - + double[] pixelValues = new double[width * height]; + ds.GetRasterBand(i).ReadRaster(xMinPixel, yMinPixel, width, height, pixelValues); setBandVals(entity, pixelValues); } + } + + /** + * 鎸夌収鍧楄鍙栨爡鏍兼暟鎹� + */ + private void readRasterForBlocks(AnalysisResultEntity entity, Dataset ds, int bandCount, int xMinPixel, int yMinPixel, int width, int height) { + List<Integer> xList = getSamples(xMinPixel, width); + List<Integer> yList = getSamples(yMinPixel, height); + + double[] pixelValues = new double[1]; + for (int i = 1; i <= bandCount; i++) { + List<Double> list = new ArrayList<>(); + for (Integer x : xList) { + for (Integer y : yList) { + ds.GetRasterBand(i).ReadRaster(x, y, 1, 1, pixelValues); + list.add(pixelValues[0]); + } + } + setBandVals(entity, list); + } + } + + /** + * 鑾峰彇鎶芥牱鍒楄〃 + */ + private List<Integer> getSamples(int start, int strip) { + List<Integer> list = new ArrayList<>(); + + double avg = 1.0 * strip / StaticData.I64; + for (int i = 0; i <= StaticData.I64; i++) { + list.add(start + (int) Math.ceil(avg * i)); + } + + return list; } /** @@ -258,7 +310,13 @@ for (double val : pixelValues) { list.add(val); } + setBandVals(entity, list); + } + /** + * 璁剧疆Band鍊� + */ + private void setBandVals(AnalysisResultEntity entity, List<Double> list) { double min = Collections.min(list); double max = Collections.max(list); double avg = list.stream().mapToDouble(Double::valueOf).average().getAsDouble(); -- Gitblit v1.9.3