From e6a222fea235eb4ebb3fc47d95c61a07a2db5e15 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 11 九月 2023 15:23:33 +0800 Subject: [PATCH] 修改栅格分析的面方法 --- src/main/java/com/moon/server/service/data/RasterAnalysisService.java | 333 +++++++++++++++++++++---------------------------------- src/main/java/com/moon/server/controller/data/RasterAnalysisController.java | 6 2 files changed, 132 insertions(+), 207 deletions(-) diff --git a/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java b/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java index 2939ae2..73919ee 100644 --- a/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java +++ b/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java @@ -53,7 +53,7 @@ return fail("鍍忕偣鍊煎彧鑳戒负锛�" + StringHelper.join(PIXELS, ", ")); } - List<?> rs = rasterService.analysisPoint(geo, pixel); + List<?> rs = rasterService.analysis(geo, pixel); return success(rs.size(), rs); } catch (Exception ex) { @@ -77,7 +77,7 @@ return fail("WKT瀛楃涓蹭笉姝g‘"); } - List<?> rs = rasterService.analysisPolyline(geo); + List<?> rs = rasterService.analysis(geo, 0); return success(rs.size(), rs); } catch (Exception ex) { @@ -101,7 +101,7 @@ return fail("WKT瀛楃涓蹭笉姝g‘"); } - List<?> rs = rasterService.analysisPolygon(geo); + List<?> rs = rasterService.analysis(geo, 0); return success(rs.size(), rs); } catch (Exception ex) { 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 33200a8..777a207 100644 --- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java +++ b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java @@ -35,9 +35,9 @@ private final static Log log = LogFactory.getLog(RasterAnalysisService.class); /** - * 鍒嗘瀽鐐� + * 鍒嗘瀽鏂规硶 */ - public List<AnalysisResultEntity> analysisPoint(Geometry point, int size) { + public List<AnalysisResultEntity> analysis(Geometry geo, Integer size) { List<AnalysisResultEntity> rs = new ArrayList<>(); List<PublishEntity> pubs = publishService.selectRaster(); @@ -49,7 +49,20 @@ AnalysisResultEntity entity = new AnalysisResultEntity(); entity.setLayerName(pub.getName()); - processPoint(entity, pub, point, size); + List<MetaEntity> metas = publishService.selectMetasByPubid(pub.getId()); + if (null == metas || metas.isEmpty()) { + setError(entity, "鎵句笉鍒板彂甯冩暟鎹�"); + continue; + } + + String filePath = pathHelper.getConfig().getUploadPath() + File.separator + metas.get(0).getPath(); + File file = new File(filePath); + if (!file.exists() || file.isDirectory()) { + setError(entity, "婧愭暟鎹笉瀛樺湪"); + continue; + } + + openRaster(entity, filePath, geo, size); rs.add(entity); } @@ -57,37 +70,9 @@ } /** - * 璁剧疆閿欒 + * 鎵撳紑鏍呮牸鏁版嵁 */ - private void setError(AnalysisResultEntity entity, String info) { - entity.setCode(StaticData.I500); - entity.setInfo(info); - } - - /** - * 澶勭悊鐐� - */ - private void processPoint(AnalysisResultEntity entity, PublishEntity pub, Geometry point, int size) { - List<MetaEntity> metas = publishService.selectMetasByPubid(pub.getId()); - if (null == metas || metas.isEmpty()) { - setError(entity, "鎵句笉鍒板彂甯冩暟鎹�"); - return; - } - - String filePath = pathHelper.getConfig().getUploadPath() + File.separator + metas.get(0).getPath(); - File file = new File(filePath); - if (!file.exists() || file.isDirectory()) { - setError(entity, "婧愭暟鎹笉瀛樺湪"); - return; - } - - processPoint(entity, filePath, point, size); - } - - /** - * 澶勭悊鐐� - */ - public void processPoint(AnalysisResultEntity entity, String filePath, Geometry point, int size) { + private void openRaster(AnalysisResultEntity entity, String filePath, Geometry geo, int size) { Dataset ds = null; try { ds = gdal.Open(filePath); @@ -95,25 +80,16 @@ throw new Exception("鎵撳紑鏍呮牸鏁版嵁澶辫触"); } - double x = point.GetX(), y = point.GetY(); - 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]; - - int bandCount = ds.getRasterCount(); - 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); + switch (geo.GetGeometryType()) { + case ogr.wkbPoint: + analysisPoint(entity, ds, geo, size); + break; + case ogr.wkbLineString: + analysisPolyline(entity, ds, geo); + break; + default: + analysisPolygon(entity, ds, geo); } - - processResult(entity, list); } catch (Exception ex) { setError(entity, ex.getMessage()); log.error(ex.getMessage(), ex); @@ -123,6 +99,106 @@ ds.delete(); } } + } + + /** + * 鍒嗘瀽鐐� + */ + public void analysisPoint(AnalysisResultEntity entity, Dataset ds, Geometry point, int size) { + double x = point.GetX(), y = point.GetY(); + 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]; + + int bandCount = ds.getRasterCount(); + 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); + } + + /** + * 鍒嗘瀽绾� + */ + public void analysisPolyline(AnalysisResultEntity entity, Dataset ds, Geometry polyline) { + 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[] bounds = new double[6]; + polyline.GetEnvelope(bounds); + double startX = bounds[0], endX = bounds[1], startY = bounds[2], endY = bounds[3]; + + 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)); + + 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++) { + Geometry point = new Geometry(ogr.wkbPoint); + point.AddPoint(minX + pixelWidth * x, maxY - pixelHeight * y); + if (polyline.Contains(point)) { + for (int i = 1; i <= bandCount; i++) { + double[] values = new double[1]; + ds.GetRasterBand(i).ReadRaster(x, y, 1, 1, values); + list.add(values[0]); + } + } + } + } + + processResult(list, entity); + } + + /** + * 鍒嗘瀽闈� + */ + public void analysisPolygon(AnalysisResultEntity entity, Dataset ds, Geometry polygon) { + 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[6]; + polygon.GetEnvelope(env); + + 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 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); + + list.add(pixelValues); + } + + processResult(entity, list); + } + + /** + * 璁剧疆閿欒 + */ + private void setError(AnalysisResultEntity entity, String info) { + entity.setCode(StaticData.I500); + entity.setInfo(info); } /** @@ -149,162 +225,11 @@ * 澶勭悊缁撴灉 */ private void processResult(List<Double> rs, AnalysisResultEntity entity) { - double min = Collections.min(rs); - double max = Collections.max(rs); double avg = rs.stream().mapToDouble(Double::valueOf).average().getAsDouble(); - entity.setMin(min); - entity.setMax(max); + entity.setMin(Collections.min(rs)); + entity.setMax(Collections.max(rs)); entity.setAvg(avg); - } - - /** - * 鍒嗘瀽绾� - */ - public List<AnalysisResultEntity> analysisPolyline(Geometry polyline) { - List<AnalysisResultEntity> rs = new ArrayList<>(); - - List<PublishEntity> pubs = publishService.selectRaster(); - if (null == pubs || pubs.isEmpty()) { - return rs; - } - - for (PublishEntity pub : pubs) { - AnalysisResultEntity entity = new AnalysisResultEntity(); - entity.setLayerName(pub.getName()); - - processPolyline(entity, pub, polyline); - rs.add(entity); - } - - return rs; - } - - /** - * 澶勭悊绾� - */ - private void processPolyline(AnalysisResultEntity entity, PublishEntity pub, Geometry polyline) { - List<MetaEntity> metas = publishService.selectMetasByPubid(pub.getId()); - if (null == metas || metas.isEmpty()) { - setError(entity, "鎵句笉鍒板彂甯冩暟鎹�"); - return; - } - - String filePath = pathHelper.getConfig().getUploadPath() + File.separator + metas.get(0).getPath(); - File file = new File(filePath); - if (!file.exists() || file.isDirectory()) { - setError(entity, "婧愭暟鎹笉瀛樺湪"); - return; - } - - processPolyline(entity, filePath, polyline); - } - - /** - * 澶勭悊绾� - */ - public void processPolyline(AnalysisResultEntity entity, String filePath, Geometry polyline) { - Dataset ds = null; - try { - ds = gdal.Open(filePath); - if (null == ds) { - throw new Exception("鎵撳紑鏍呮牸鏁版嵁澶辫触"); - } - - 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[] bounds = new double[6]; - polyline.GetEnvelope(bounds); - double startX = bounds[0], endX = bounds[1], startY = bounds[2], endY = bounds[3]; - - 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)); - - 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++) { - Geometry point = new Geometry(ogr.wkbPoint); - point.AddPoint(minX + pixelWidth * x, maxY - pixelHeight * y); - if (polyline.Contains(point)) { - for (int i = 1; i <= bandCount; i++) { - double[] values = new double[1]; - ds.GetRasterBand(i).ReadRaster(x, y, 1, 1, values); - list.add(values[0]); - } - } - } - } - - processResult(list, entity); - } catch (Exception ex) { - setError(entity, ex.getMessage()); - log.error(ex.getMessage(), ex); - } finally { - // gdal.GDALDestroyDriverManager() - if (null != ds) { - ds.delete(); - } - } - } - - /** - * 鍒嗘瀽闈� - */ - public List<AnalysisResultEntity> analysisPolygon(Geometry polygon) { - List<AnalysisResultEntity> rs = new ArrayList<>(); - // - - return rs; - } - - public double processPolygon(String imagePath, String geometryString) { - // 鎵撳紑鏍呮牸鍥惧儚鏁版嵁闆� - Dataset dataset = gdal.Open(imagePath); - - if (dataset == null) { - throw new RuntimeException("Failed to open raster dataset."); - } - - Geometry geometry = Geometry.CreateFromWkt(geometryString); - - // 鏍呮牸鍍忕礌鑼冨洿 - double[] geoTransform = dataset.GetGeoTransform(); - double minX = geoTransform[0]; - double pixelWidth = geoTransform[1]; - double rotationX = geoTransform[2]; - double maxY = geoTransform[3]; - double rotationY = geoTransform[4]; - double pixelHeight = geoTransform[5]; - - // geometry鍍忕礌鑼冨洿 - double[] env = new double[6]; - geometry.GetEnvelope(env); - int xMinPixel = (int) Math.floor((env[0] - minX) / pixelWidth); - int yMinPixel = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); - int xMaxPixel = (int) Math.ceil((env[1] - minX) / pixelWidth); - int yMaxPixel = (int) Math.ceil((maxY - env[2]) / Math.abs(pixelHeight)); - - int bandCount = dataset.getRasterCount(); - int geometryWidth = Math.abs(xMaxPixel - xMinPixel); - int geometryHeight = Math.abs(yMaxPixel - yMinPixel); - - List<double[]> sum = new ArrayList<>(); - for (int bandIndex = 1; bandIndex <= bandCount; bandIndex++) { - Band band = dataset.GetRasterBand(bandIndex); - - double[] pixelValues = new double[geometryWidth * geometryHeight]; - band.ReadRaster(xMinPixel, yMinPixel, geometryWidth, geometryHeight, pixelValues); - - // 澶氭尝娈靛綊涓�鍖栧鐞� - sum.add(pixelValues); - } - - return 0; } public void processClippedDataByLine(String imagePath, String geometryString) { -- Gitblit v1.9.3