1
13693261870
2024-11-02 ee26ff7331614b14c9f156c5590724e29e99dc06
1
已修改3个文件
89 ■■■■ 文件已修改
src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/ResultService.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/WaterService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java
@@ -19,14 +19,14 @@
    public BuildingDepthVo() {
    }
    public BuildingDepthVo(String seid, Long timestamp, Double depth) {
        this.seid = seid;
    public BuildingDepthVo(String id, Long timestamp, Double depth) {
        this.id = id;
        this.timestamp = timestamp;
        this.depth = depth;
    }
    @ApiModelProperty("SE主键")
    private String seid;
    @ApiModelProperty("主键ID")
    private String id;
    @ApiModelProperty("时间戳")
    private Long timestamp;
@@ -34,12 +34,12 @@
    @ApiModelProperty("涉水尝试")
    private Double depth;
    public String getSeid() {
        return seid;
    public String getId() {
        return id;
    }
    public void setSeid(String seid) {
        this.seid = seid;
    public void setId(String id) {
        this.id = id;
    }
    public Long getTimestamp() {
src/main/java/com/se/simu/service/ResultService.java
@@ -31,6 +31,8 @@
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.DoubleStream;
/**
 * 处理结果服务类
@@ -67,10 +69,11 @@
        try {
            copeTerrain(dto, layer);
            copeBuilding(dto, layer);
            copeWater(dto, layer);
            List<BuildingDepthVo> buildings = copeWater(dto, layer);
            copeFlow(dto, layer);
            copeLayerJson(dto, layer);
            copeRainFallJson(dto, layer);
            copeBuildingDepthJson(dto, buildings);
        } finally {
            File dir = new File(dto.getTemp());
            if (dir.exists()) {
@@ -264,11 +267,13 @@
        setWaterHeight(layer, files);
    }
    private void copeWater(ResultDto dto, LayerDto layer) {
    private List<BuildingDepthVo> copeWater(ResultDto dto, LayerDto layer) {
        List<String> files = layer.getWaters().getFiles();
        if (files.size() == 0 || files.size() != layer.getWaters().getData().size()) return;
        if (files.size() == 0 || files.size() != layer.getWaters().getData().size()) return null;
        processWaters(dto, files, layer);
        return processBuilding(dto, files, layer);
    }
    private static List<String> getFiles(String path, String suffix) {
@@ -405,8 +410,8 @@
                    int offset = x + y * width;
                    if (Float.isNaN(buffer[offset]) || buffer[offset] < -999 || buffer[offset] < minHeight) continue;
                    double X = transform[0] + x * transform[1] + y * transform[2];
                    double Y = transform[3] + x * transform[4] + y * transform[5];
                    //double X = transform[0] + x * transform[1] + y * transform[2];
                    //double Y = transform[3] + x * transform[4] + y * transform[5];
                    //BuildingDto building = intersects(dto, X, Y);
                    //if (null != building) continue;
@@ -441,6 +446,61 @@
        return dto.getBuildingList().parallelStream().filter(b -> b.getGeom().Intersects(p)).findFirst().orElse(null);
    }
    private List<BuildingDepthVo> processBuilding(ResultDto dto, List<String> files, LayerDto layer) {
        List<BuildingDepthVo> list = new CopyOnWriteArrayList<>();
        for (int i = 0, c = files.size(); i < c; i++) {
            Dataset ds = null;
            try {
                ds = gdal.Open(files.get(i), gdalconst.GA_ReadOnly);
                if (null == ds || 0 == ds.getRasterCount()) continue;
                if (null == ds.GetSpatialRef()) ds.SetSpatialRef(dto.getSpatialReference());
                copeBuildingDepth(dto, ds, layer.getWaters().getData().get(i), list);
            } finally {
                if (null != ds) ds.delete();
            }
        }
        return list;
    }
    private void copeBuildingDepth(ResultDto dto, Dataset ds, long ticks, List<BuildingDepthVo> list) {
        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]);
        for (BuildingDto building : dto.getBuildingList()) {
            Double val = getValue(ds, building, xSize, ySize, minX, maxY, pixelWidth, pixelHeight);
            list.add(new BuildingDepthVo(building.getId(), ticks, null));
        }
    }
    private Double getValue(Dataset ds, BuildingDto building, int xSize, int ySize, double minX, double maxY, double pixelWidth, double pixelHeight) {
        double[] env = new double[4];
        building.getGeom().GetEnvelope(env);
        int xMinPixel = Math.max((int) Math.floor((env[0] - minX) / pixelWidth), 1);
        int yMinPixel = Math.max((int) Math.floor((maxY - env[3]) / pixelHeight), 1);
        int xMaxPixel = Math.min((int) Math.floor((env[1] - minX) / pixelWidth), xSize);
        int yMaxPixel = Math.min((int) Math.floor((maxY - env[2]) / pixelHeight), ySize);
        if (xMaxPixel < 1 || yMaxPixel < 1 || xMaxPixel - xMinPixel < 0 || yMaxPixel - yMinPixel < 0) {
            return null;
        }
        int width = xMaxPixel - xMinPixel;
        int height = yMaxPixel - yMinPixel;
        double[] pixelValues = new double[width * height];
        ds.GetRasterBand(1).ReadRaster(xMinPixel, yMinPixel, width, height, pixelValues);
        Double val = Arrays.stream(pixelValues).max().getAsDouble();
        return isValid(val) ? val : null;
    }
    public static boolean isValid(Double val) {
        return !Double.isNaN(val) && val > Integer.MIN_VALUE;
    }
    private void copeFlow(ResultDto dto, LayerDto layer) {
        List<String> files = getFiles(dto.getFlowPath(), ".tif");
        if (null == files || files.size() != layer.getWaters().getData().size()) return;
src/main/java/com/se/simu/service/WaterService.java
@@ -13,7 +13,6 @@
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
import org.gdal.osr.SpatialReference;
import org.gdal.osr.osr;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -177,7 +176,7 @@
        if (CollectionUtils.isEmpty(list)) return null;
        return list.parallelStream()
                .filter(b -> seid.equals(b.getSeid()))
                .filter(b -> seid.equals(b.getId()))
                .sorted((a, b) -> a.getTimestamp().compareTo(b.getTimestamp()))
                .collect(Collectors.toList());
    }