From 59b432c883011119649c283cc9d4c1d357599802 Mon Sep 17 00:00:00 2001 From: dcb <xgybdcb@163.com> Date: 星期一, 30 六月 2025 15:13:56 +0800 Subject: [PATCH] 对于没有不能获取到数据的雨量计,使用其他雨量计数据填充 --- src/main/java/com/se/nsl/service/SimuService.java | 217 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 217 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/se/nsl/service/SimuService.java b/src/main/java/com/se/nsl/service/SimuService.java new file mode 100644 index 0000000..b98d3ee --- /dev/null +++ b/src/main/java/com/se/nsl/service/SimuService.java @@ -0,0 +1,217 @@ +package com.se.nsl.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bc.zarr.ZarrArray; +import com.bc.zarr.ZarrGroup; +import com.se.nsl.config.PropertiesConfig; +import com.se.nsl.domain.po.Simu; +import com.se.nsl.domain.vo.SimuResult; +import com.se.nsl.domain.vo.SimuVo; +import com.se.nsl.helper.StringHelper; +import com.se.nsl.mapper.SimuMapper; +import com.se.nsl.utils.CoordinateTransformer; +import com.se.nsl.utils.SolverTifUtil; +import com.se.nsl.utils.TimeFormatUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ucar.ma2.InvalidRangeException; + +import javax.annotation.Resource; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Slf4j +@Service +@SuppressWarnings("ALL") +public class SimuService { + public static final String TIF_EXTSION = ".tif"; + public static final String YYYY_MM_DD_HH_MM_SS = "yyyyMMddHHmmss"; + @Resource + SimuMapper simuMapper; + + @Resource + PropertiesConfig config; + + /** + * 鍒嗛〉鏌ヨ鎺ㄦ紨妯℃嫙 + * + * @param pageNum 椤电爜 + * @param pageSize 姣忛〉鏁伴噺 + * @return 鍒嗛〉鍚庣殑鎺ㄦ紨妯℃嫙 + */ + public IPage<Simu> selectPage(SimuVo vo, int pageNum, int pageSize) { + QueryWrapper<Simu> wrapper = getPageWrapper(vo, pageNum, pageSize); + + Page<Simu> page = new Page<>(pageNum, pageSize); + page.addOrder(OrderItem.desc("id")); + + return simuMapper.selectPage(page, wrapper); + } + + private QueryWrapper<Simu> getPageWrapper(SimuVo vo, int pageNum, int pageSize) { + QueryWrapper<Simu> wrapper = new QueryWrapper<>(); + if (null != vo.getId()) { + wrapper.eq("id", vo.getId()); + } + if (!StringHelper.isEmpty(vo.getName())) { + wrapper.like("lower(name)", vo.getName().trim().toLowerCase()); + } + if (!StringHelper.isEmpty(vo.getServiceName())) { + wrapper.like("service_name", vo.getServiceName().trim()); + } + if (null != vo.getType()) { + wrapper.eq("type", vo.getType()); + } + if (null != vo.getAreaType()) { + wrapper.eq("area_type", vo.getAreaType()); + } + if (null != vo.getStatus()) { + wrapper.eq("status", vo.getStatus()); + } + + return wrapper; + } + + /** + * 鏍规嵁ID鎵归噺鍒犻櫎鎺ㄦ紨妯℃嫙 + * + * @param ids 瑕佸垹闄ょ殑鍖哄煙ID鍒楄〃 + * @return 鍒犻櫎鎴愬姛鐨勮褰曟暟 + */ + public int deleteByIds(List<Integer> ids) { + return simuMapper.deleteBatchIds(ids); + } + + /** + * 鏂板鎺ㄦ紨妯℃嫙 + * + * @param Simu 鎺ㄦ紨妯℃嫙瀵硅薄 + * @return 鏂板鎴愬姛鐨勮褰曟暟 + */ + public int insert(Simu simu) { + return simuMapper.insert(simu); + } + + public int inserts(List<Simu> list) { + return simuMapper.inserts(list); + } + + /** + * 鏍规嵁ID鏌ヨ + * + * @param id ID + * @return Simu + */ + public Simu selectById(Integer id) { + return simuMapper.selectById(id); + } + + /** + * 淇敼鎺ㄦ紨妯℃嫙 + * + * @param Simu 鎺ㄦ紨妯℃嫙瀵硅薄 + * @return 淇敼鎴愬姛鐨勮褰曟暟 + */ + public int updateById(Simu simu) { + return simuMapper.updates(Arrays.asList(simu)); + } + + public SimuResult queryByPosition(double lon, double lat, long time, String serviceName) { + //transform coordiante from 4326 to 4548 + double[] xy = CoordinateTransformer.transform(4326, 4548, lon, lat); +// System.out.println(String.format("杞崲鍓嶇殑鍧愭爣锛歺:%s,y:%s", lon, lat)); +// System.out.println(String.format("杞崲鍚庣殑鍧愭爣锛歺:%s,y:%s", xy[0], xy[1])); + //read from zarr +// return queryByZarr(xy, time, serviceName); + + //read from tif file + return queryByTif(xy, time, serviceName); + + } + + public List<SimuResult> queryByPosition(double lon, double lat, String serviceName) { + //transform coordiante from 4326 to 4548 + double[] xy = CoordinateTransformer.transform(4326, config.getEpsg(), lon, lat); +// System.out.println(String.format("杞崲鍓嶇殑鍧愭爣锛歺:%s,y:%s", lon, lat)); +// System.out.println(String.format("杞崲鍚庣殑鍧愭爣锛歺:%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]; + String prefix = formatTime(time); + File inPath = new File(config.getInPath()); +// File tifDir = new File(inPath, serviceName + File.separator + "depth"); +// int index = 0; +// File[] files = tifDir.listFiles(); +// for (File file : files) { +// String name = file.getName(); +// if (!name.endsWith(TIF_EXTSION)) continue; +// if (name.equals(prefix + TIF_EXTSION)) { +// break; +// } +// index++; +// } + File dem = new File(inPath, serviceName + File.separator + "DEM.tif"); + //TODO + + File zarr = new File(inPath, serviceName + File.separator + "result.zarr"); + try { + ZarrGroup group = ZarrGroup.open(zarr.toPath()); + ZarrArray depthArray = group.openArray("depth"); + int[] shape = new int[] {60, 637, 351}; +// int[] offset = new int[]{210, 384}; + float[] depth = (float[]) depthArray.read(shape); + System.out.println("depth:" + depth.length); + } catch (IOException | InvalidRangeException e) { + throw new RuntimeException(e); + } + return null; + } + + private SimuResult queryByTif(double[] xy, long time, String serviceName) { + File inPath = new File(config.getInPath()); + String prefix = formatTime(time); + String child = serviceName + File.separator + "depth" + File.separator + prefix + TIF_EXTSION; + File tifFile = new File(inPath, child); + if (!tifFile.exists()) { + return null; + } + return SolverTifUtil.getSimuResult(tifFile, xy); + } + + private List<SimuResult> queryByTif(double[] xy, String serviceName) { + 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; + SimuResult result = SolverTifUtil.getSimuResult(tifFile, xy); + if (result == null) continue; + res.add(result); + } + return res; + } + + private String formatTime(long time) { + return TimeFormatUtil.formatTime(time, YYYY_MM_DD_HH_MM_SS); + } + +} -- Gitblit v1.9.3