dcb
2025-06-20 51d12c4cca7c9d4911a0037673bbd2dc210836d0
src/main/java/com/se/nsl/service/SimuService.java
@@ -13,6 +13,7 @@
import com.se.nsl.helper.StringHelper;
import com.se.nsl.mapper.SimuMapper;
import com.se.nsl.utils.CoordinateTransformer;
import com.se.nsl.utils.TimeFormatUtil;
import lombok.extern.slf4j.Slf4j;
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
@@ -24,10 +25,9 @@
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -36,6 +36,7 @@
@SuppressWarnings("ALL")
public class SimuService {
    public static final String TIF_EXTSION = ".tif";
    public static final String YYYY_MM_DD_HHMMSS = "yyyyMMddHHmmss";
    @Resource
    SimuMapper simuMapper;
@@ -141,6 +142,19 @@
    }
    public List<SimuResult> queryByPosition(double lon, double lat, String serviceName) {
        //transform coordiante from 4326 to 4548
        double[] xy = CoordinateTransformer.transform(4326, 4548, lon, lat);
//        System.out.println(String.format("转换前的坐标:x:%s,y:%s", lon, lat));
//        System.out.println(String.format("转换后的坐标:x:%s,y:%s", xy[0], xy[1]));
        //read from zarr
//        return queryByZarr(xy, time, serviceName);
        //read from tif file
        return queryByTif(xy, serviceName);
    }
    private SimuResult queryByZarr(double[] xy, long time, String serviceName) {
        double x = xy[0];
        double y = xy[1];
@@ -190,13 +204,39 @@
        ColumnRow cr = getColumnRow(tifFile, x, y);
        if (cr == null) return null;
        System.out.println("col:" + cr.col + " ,row:" + cr.row);
//        System.out.println("col:" + cr.col + " ,row:" + cr.row);
        float depth = readPixelValue(cr.dataset, cr.col, cr.row, 1);
        float velocity = calcVelocity(cr.dataset, cr.col, cr.row);
        SimuResult result = new SimuResult();
        result.setDepth(depth);
        result.setVelocity(velocity);
        result.setTime(time);
        return  result;
    }
    private List<SimuResult> queryByTif(double[] xy, String serviceName) {
        double x = xy[0];
        double y = xy[1];
        List<SimuResult> res = new ArrayList<>();
        File inPath = new File(config.getInPath());
        Path depthPath = Paths.get(inPath.getAbsolutePath(), serviceName, "depth");
        File depthDir = depthPath.toFile();
        File[] files = depthDir.listFiles();
        for (File tifFile : files) {
            String name = tifFile.getName();
            if (!name.endsWith(TIF_EXTSION)) continue;
            ColumnRow cr = getColumnRow(tifFile, x, y);
            if (cr == null) continue;
            float depth = readPixelValue(cr.dataset, cr.col, cr.row, 1);
            float velocity = calcVelocity(cr.dataset, cr.col, cr.row);
            SimuResult result = new SimuResult();
            result.setDepth(depth);
            result.setVelocity(velocity);
            String time = tifFile.getName().replace(".tif", "");
            result.setTime(TimeFormatUtil.toMillis(time, YYYY_MM_DD_HHMMSS));
            res.add(result);
        }
        return  res;
    }
    private static ColumnRow getColumnRow(File tifFile, double x, double y) {
@@ -253,10 +293,7 @@
    }
    private String formatTime(long time) {
        Instant instant = Instant.ofEpochMilli(time);
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        return localDateTime.format(formatter);
        return TimeFormatUtil.formatTime(time, YYYY_MM_DD_HHMMSS);
    }
}