From 5296b04442d1c09bf55a8f5a556355788ee9f8ca Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期四, 14 十一月 2024 15:09:29 +0800 Subject: [PATCH] 1 --- src/main/java/com/se/simu/service/ResultService.java | 50 +++++++++++----- src/main/java/com/se/simu/domain/dto/PointDto.java | 48 ++++++++++++++++ src/main/java/com/se/simu/domain/dto/XYDto.java | 32 ++++++++++ src/main/java/com/se/simu/domain/po/PondingPo.java | 13 ++++ 4 files changed, 126 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/se/simu/domain/dto/PointDto.java b/src/main/java/com/se/simu/domain/dto/PointDto.java new file mode 100644 index 0000000..c8afafa --- /dev/null +++ b/src/main/java/com/se/simu/domain/dto/PointDto.java @@ -0,0 +1,48 @@ +package com.se.simu.domain.dto; + +@SuppressWarnings("ALL") +public class PointDto implements Comparable<PointDto> { + private double x; + + private double y; + + private double val; + + PointDto() { + } + + public PointDto(double x, double y, double val) { + this.x = x; + this.y = y; + this.val = val; + } + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + public double getVal() { + return val; + } + + public void setVal(double val) { + this.val = val; + } + + @Override + public int compareTo(PointDto other) { + return Double.compare(this.getVal(), other.getVal()); + } +} diff --git a/src/main/java/com/se/simu/domain/dto/XYDto.java b/src/main/java/com/se/simu/domain/dto/XYDto.java new file mode 100644 index 0000000..adbf9dd --- /dev/null +++ b/src/main/java/com/se/simu/domain/dto/XYDto.java @@ -0,0 +1,32 @@ +package com.se.simu.domain.dto; + +@SuppressWarnings("ALL") +public class XYDto { + private int x; + + private int y; + + public XYDto() { + } + + public XYDto(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } +} diff --git a/src/main/java/com/se/simu/domain/po/PondingPo.java b/src/main/java/com/se/simu/domain/po/PondingPo.java index afd78fc..b44ba90 100644 --- a/src/main/java/com/se/simu/domain/po/PondingPo.java +++ b/src/main/java/com/se/simu/domain/po/PondingPo.java @@ -1,6 +1,9 @@ package com.se.simu.domain.po; +import com.se.simu.domain.dto.PointDto; import io.swagger.annotations.ApiModelProperty; +import org.gdal.ogr.Geometry; +import org.gdal.ogr.ogr; @SuppressWarnings("ALL") public class PondingPo { @@ -16,6 +19,16 @@ public PondingPo() { } + public PondingPo(Geometry polygon, PointDto dto) { + Geometry point = new Geometry(ogr.wkbPoint); + point.AddPoint_2D(dto.getX(), dto.getY()); + point.AssignSpatialReference(polygon.GetSpatialReference()); + + this.polygon = polygon.ExportToWkt(); + this.point = point.ExportToWkt(); + this.depth = dto.getVal(); + } + public PondingPo(String polygon, String point, Double depth) { this.polygon = polygon; this.point = point; diff --git a/src/main/java/com/se/simu/service/ResultService.java b/src/main/java/com/se/simu/service/ResultService.java index ef859a7..10d8bae 100644 --- a/src/main/java/com/se/simu/service/ResultService.java +++ b/src/main/java/com/se/simu/service/ResultService.java @@ -3,10 +3,7 @@ import cn.hutool.core.io.FileUtil; import com.alibaba.fastjson.JSON; import com.se.simu.config.PropertiesConfig; -import com.se.simu.domain.dto.BuildingDto; -import com.se.simu.domain.dto.ExtensionDto; -import com.se.simu.domain.dto.LayerDto; -import com.se.simu.domain.dto.ResultDto; +import com.se.simu.domain.dto.*; import com.se.simu.domain.po.DataPo; import com.se.simu.domain.po.PondingPo; import com.se.simu.domain.vo.BuildingDepthVo; @@ -532,36 +529,55 @@ private List<PondingPo> copePonding(ResultDto dto, Dataset ds, LayerDto layer, List<Geometry> geometries) { double[] transform = ds.GetGeoTransform(); int xSize = ds.getRasterXSize(), ySize = ds.getRasterYSize(); - double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = Math.abs(transform[5]); List<PondingPo> list = new ArrayList<>(); for (Geometry geometry : geometries) { - double[] values = getValues(ds, geometry, xSize, ySize, minX, maxY, pixelWidth, pixelHeight); + List<PointDto> points = getValues(ds, geometry, transform, xSize, ySize); + if (CollectionUtils.isEmpty(points))continue; + + PointDto point = Collections.max(points); + list.add(new PondingPo(geometry, point)); } return list; } - private double[] getValues(Dataset ds, Geometry geometry, int xSize, int ySize, double minX, double maxY, double pixelWidth, double pixelHeight) { + private List<PointDto> getValues(Dataset ds, Geometry g,double[] transform, int xSize, int ySize) { double[] env = new double[4]; - geometry.GetEnvelope(env); + g.GetEnvelope(env); - int startX = (int) Math.floor((env[0] - minX) / pixelWidth); - int endX = (int) Math.floor((env[1] - minX) / pixelWidth); - int startY = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); - int endY = (int) Math.floor((maxY - env[2]) / Math.abs(pixelHeight)); + int startX = (int) Math.floor((env[0] - transform[0]) / transform[1]); + int endX = (int) Math.floor((env[1] - transform[0]) / transform[1]); + int startY = (int) Math.floor((transform[3] - env[3]) / Math.abs(transform[5])); + int endY = (int) Math.floor((transform[3] - env[2]) / Math.abs(transform[5])); if (startX < 0) startX = 0; if (startY < 0) startY = 0; if (endX > ds.getRasterXSize()) endX = ds.getRasterXSize(); if (endY > ds.getRasterYSize()) endY = ds.getRasterYSize(); if (endX - startX < 1 || endY - startY < 1) return null; - int width = endX - startX; - int height = endY - startY; - double[] pixelValues = new double[width * height]; - ds.GetRasterBand(1).ReadRaster(startX, startY, width, height, pixelValues); + float[] values = new float[1]; + List<PointDto> points = new ArrayList<>(); + for (int x = startX; x <= endX; x++) { + for (int y = startY; y <= endY; y++) { + double X = transform[0] + x * transform[1] + y * transform[2]; + double Y = transform[3] + x * transform[4] + y * transform[5]; + ds.GetRasterBand(1).ReadRaster(startX, startY, 1, 1, values); - return pixelValues; + if (Float.isNaN(values[0]) || values[0] < -999 || !isContains(g, X, Y)) continue; + points.add(new PointDto(X, Y, values[0])); + } + } + + return points; + } + + private boolean isContains(Geometry g, double x, double y) { + Geometry p = new Geometry(ogr.wkbPoint); + p.AddPoint_2D(x, y); + p.AssignSpatialReference(g.GetSpatialReference()); + + return g.Contains(p); } private void copeFlow(ResultDto dto, LayerDto layer) { -- Gitblit v1.9.3