dcb
2025-05-22 f984496e9bb3612ce38040a5dd0be548b181e971
修复时间轴问题
已修改3个文件
61 ■■■■■ 文件已修改
src/main/java/com/se/nsl/service/ResolveService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/nsl/service/TestService.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mybatis.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/nsl/service/ResolveService.java
@@ -40,6 +40,8 @@
import java.nio.file.StandardCopyOption;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -273,7 +275,14 @@
        int duration = 3600 * data.getDuration(); // 秒数
        if (null != data.getRainfalls() && data.getRainfalls().size() > 1) {
            duration = (int) (Math.abs(data.getRainfalls().get(data.getRainfalls().size() - 1).getTime().getTime() - data.getRainfalls().get(0).getTime().getTime()) / 60);
            List<Rainfall> rainfalls = data.getRainfalls();
            int size = rainfalls.size();
            Rainfall last = rainfalls.get(size - 1);
            Rainfall first = rainfalls.get(0);
            Instant end = last.getTime().toInstant();
            Instant start = first.getTime().toInstant();
            long diff = ChronoUnit.SECONDS.between(end, start);
            duration = (int) (Math.abs(diff));
        }
        String inPath = config.getInPath() + File.separator + data.getInPath();
src/main/java/com/se/nsl/service/TestService.java
@@ -22,6 +22,10 @@
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.List;
@@ -197,6 +201,21 @@
    }
    public void setWaterData(LayerDto layer, List<String> files) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        for (String file : files) {
            String fileName = ComHelper.getNameWithExt(file);
            // 解析为 LocalDateTime(默认基于系统时区,可能需指定时区)
            LocalDateTime dateTime = LocalDateTime.parse(fileName, formatter);
            // 转换为 UTC 时间戳(推荐,避免时区歧义)
            Instant utcInstant = dateTime.atZone(ZoneId.of("UTC")).toInstant();
            long timestamp = utcInstant.toEpochMilli();
            layer.getWaters().getData().add(timestamp);
        }
        layer.getDuration().setStart(layer.getWaters().getData().get(0));
        layer.getDuration().setEnd(layer.getWaters().getData().get(layer.getWaters().getData().size() - 1));
    }
    /*public void setWaterData(LayerDto layer, List<String> files) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(Calendar.MILLISECOND, 0);
@@ -221,7 +240,7 @@
        }
        layer.getDuration().setStart(layer.getWaters().getData().get(0));
        layer.getDuration().setEnd(layer.getWaters().getData().get(layer.getWaters().getData().size() - 1));
    }
    }*/
    public void setWaterHeight(LayerDto layer, List<String> files) {
        int c = files.size(), step = files.size() / 10;
@@ -244,29 +263,6 @@
        layer.getExtension().setMaxHeight(ComHelper.getMaxVal(layer.getExtension().getMaxHeight(), 1000000));
        layer.getExtension().setMinHeight(ComHelper.getMaxVal(layer.getExtension().getMinHeight(), 1000000));
        layer.getExtension().setDiffer();
    }
    private double[] readTifBbox(Dataset ds) {
        // 1. 获取图像尺寸
        int width = ds.getRasterXSize();
        int height = ds.getRasterYSize();
        // 2. 获取GeoTransform参数
        double[] geoTransform = new double[6];
        ds.GetGeoTransform(geoTransform);
        // 3. 解析GeoTransform参数(经纬度坐标)
        double originLon = geoTransform[0];  // 左上角经度
        double originLat = geoTransform[3];  // 左上角纬度
        double pixelWidth = geoTransform[1];  // 经度方向分辨率(度/像素)
        double pixelHeight = geoTransform[5]; // 纬度方向分辨率(度/像素,通常为负)
        // 4. 计算四至范围(经纬度)
        double minLon = Math.min(originLon, originLon + width * pixelWidth);
        double maxLon = Math.max(originLon, originLon + width * pixelWidth);
        double minLat = Math.min(originLat, originLat + height * pixelHeight);
        double maxLat = Math.max(originLat, originLat + height * pixelHeight);
        return new double[] {minLon, maxLon, minLat, maxLat};
    }
    public void processWaters(ResultDto dto, List<String> files, LayerDto layer) {
@@ -434,7 +430,7 @@
        for (int[] sizes : layer.getTerrain().getSize()) {
            String name = ComHelper.getNameWithExt(ds.GetDescription()) + "_" + sizes[0] + "_" + sizes[1];
            String tif = dto.getTemp() + File.separator + name + ".tif";
            ComHelper.Resample(ds, tif, sizes[0], sizes[1], layer);
//            ComHelper.Resample(ds, tif, sizes[0], sizes[1], layer);
            if (!new File(tif).exists()) continue;
            String png = flowPath + File.separator + sizes[0] + "_" + sizes[1] + ".png";
src/main/resources/mybatis.xml
@@ -29,7 +29,9 @@
        <!--指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法-->
        <setting name="callSettersOnNulls" value="true"/>
        <!--指定 MyBatis 所用日志的具体实现:LOG4J/LOG4J2/SLF4J/STDOUT_LOGGING/NO_LOGGING-->
        <setting name="logImpl" value="STDOUT_LOGGING" />
        <!--控制台输出 -->
<!--        <setting name="logImpl" value="STDOUT_LOGGING" />-->
        <setting name="logImpl" value="NO_LOGGING" />
    </settings>
    <typeAliases>
        <package name="com.se.nsl.domain"/>