1
13693261870
2024-11-14 5296b04442d1c09bf55a8f5a556355788ee9f8ca
1
已添加2个文件
已修改2个文件
143 ■■■■ 文件已修改
src/main/java/com/se/simu/domain/dto/PointDto.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/domain/dto/XYDto.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/domain/po/PondingPo.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/ResultService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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());
    }
}
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;
    }
}
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;
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) {