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 | 327 +++++++++++++++++++++++++---------------------------- 1 files changed, 154 insertions(+), 173 deletions(-) diff --git a/src/main/java/com/se/nsl/service/SimuService.java b/src/main/java/com/se/nsl/service/SimuService.java index e924066..b98d3ee 100644 --- a/src/main/java/com/se/nsl/service/SimuService.java +++ b/src/main/java/com/se/nsl/service/SimuService.java @@ -1,236 +1,217 @@ package com.se.nsl.service; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.json.JSONUtil; 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.dto.GeDb; -import com.se.nsl.domain.po.DataPo; -import com.se.nsl.domain.po.SimuPo; -import com.se.nsl.domain.vo.CreateSimuVo; +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.helper.WebHelper; import com.se.nsl.mapper.SimuMapper; -import lombok.SneakyThrows; +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.sql.Timestamp; -import java.util.Date; +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; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; @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; - @Resource - GedbService gedbService; + /** + * 鍒嗛〉鏌ヨ鎺ㄦ紨妯℃嫙 + * + * @param pageNum 椤电爜 + * @param pageSize 姣忛〉鏁伴噺 + * @return 鍒嗛〉鍚庣殑鎺ㄦ紨妯℃嫙 + */ + public IPage<Simu> selectPage(SimuVo vo, int pageNum, int pageSize) { + QueryWrapper<Simu> wrapper = getPageWrapper(vo, pageNum, pageSize); - @Resource - UwService uwService; - - @Resource - ResultService resultService; - - public IPage<SimuPo> get(SimuVo vo) { - QueryWrapper<SimuPo> wrapper = getPageWrapper(vo); - - Page<SimuPo> page = new Page<>(vo.getPageIndex(), vo.getPageSize()); + Page<Simu> page = new Page<>(pageNum, pageSize); page.addOrder(OrderItem.desc("id")); - IPage<SimuPo> paged = simuMapper.selectPage(page, wrapper); - - return paged; + return simuMapper.selectPage(page, wrapper); } - private QueryWrapper<SimuPo> getPageWrapper(SimuVo vo) { - QueryWrapper<SimuPo> wrapper = new QueryWrapper<>(); + 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 (null != vo.getPid()) { - wrapper.eq("pid", vo.getPid()); - } - if (null != vo.getNum()) { - wrapper.eq("num", vo.getNum()); } if (!StringHelper.isEmpty(vo.getName())) { wrapper.like("lower(name)", vo.getName().trim().toLowerCase()); } - if (!CollUtil.isEmpty(vo.getStatus())) { - wrapper.in("status", vo.getStatus()); + 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; } - public int del(List<Integer> ids) { - List<SimuPo> list = simuMapper.selectBatchIds(ids); - if (null != list && list.size() > 0) { - for (SimuPo po : list) { - try { - if (StringHelper.isEmpty(po.getData())) continue; - - DataPo dp = JSONUtil.toBean(po.getData(), DataPo.class); - if (null == dp) continue; - - delDir(config.getInPath() + File.separator + dp.getInPath()); - delDir(config.getOutPath() + File.separator + dp.getOutPath()); - FileUtil.del(config.getInPath() + File.separator + dp.getInPath() + ".json"); - } catch (Exception ex) { - log.error(ex.getMessage(), ex); - } - } - } - + /** + * 鏍规嵁ID鎵归噺鍒犻櫎鎺ㄦ紨妯℃嫙 + * + * @param ids 瑕佸垹闄ょ殑鍖哄煙ID鍒楄〃 + * @return 鍒犻櫎鎴愬姛鐨勮褰曟暟 + */ + public int deleteByIds(List<Integer> ids) { return simuMapper.deleteBatchIds(ids); } - private boolean delDir(String dir) { - File file = new File(dir); - if (!file.exists() || !file.isDirectory()) { - return false; - } - - return FileUtil.del(dir); + /** + * 鏂板鎺ㄦ紨妯℃嫙 + * + * @param Simu 鎺ㄦ紨妯℃嫙瀵硅薄 + * @return 鏂板鎴愬姛鐨勮褰曟暟 + */ + public int insert(Simu simu) { + return simuMapper.insert(simu); } - public Integer getMaxId() { - return simuMapper.selectMaxId(); + public int inserts(List<Simu> list) { + return simuMapper.inserts(list); } - public SimuPo getSimuByPid(Integer pid) { - QueryWrapper<SimuPo> wrapper = new QueryWrapper<>(); - wrapper.eq("id", pid); - wrapper.last("limit 1"); - - return simuMapper.selectOne(wrapper); - } - public SimuPo getSimuById(Integer id) { + /** + * 鏍规嵁ID鏌ヨ + * + * @param id ID + * @return Simu + */ + public Simu selectById(Integer id) { return simuMapper.selectById(id); } - public SimuPo getSimuByServiceName(String serviceName) { - if (StringHelper.isEmpty(serviceName)) { + /** + * 淇敼鎺ㄦ紨妯℃嫙 + * + * @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; } - - QueryWrapper<SimuPo> wrapper = new QueryWrapper<>(); - wrapper.eq("service_name", serviceName); - wrapper.last("limit 1"); - - return simuMapper.selectOne(wrapper); + return SolverTifUtil.getSimuResult(tifFile, xy); } - public boolean create(CreateSimuVo vo) { - Date now = new Date(); - String date = StringHelper.YMDHMS2_FORMAT.format(now); - if (StringHelper.isEmpty(vo.getName())) { - vo.setName(date); + 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); } - - DataPo data = BeanUtil.copyProperties(vo, DataPo.class); - data.setPath(date, date); - initPath(data); - - SimuPo simu = new SimuPo(vo.getNum(), vo.getPid(), vo.getName(), JSONUtil.toJsonStr(data), 0, vo.getBak()); - simu.setServiceName(date); - simu.setCreateTime(new Timestamp(now.getTime())); - - int rows = simuMapper.insert(simu); - if (rows > 0) { - asyncCall(simu); - } - - return rows > 0; + return res; } - private void initPath(DataPo data) { - createDir(config.getInPath() + File.separator + data.getInPath()); - createDir(config.getOutPath() + File.separator + data.getOutPath()); + private String formatTime(long time) { + return TimeFormatUtil.formatTime(time, YYYY_MM_DD_HH_MM_SS); } - private void createDir(String path) { - File f = new File(path); - if (f.exists() && f.isDirectory()) { - FileUtil.del(f); - } - f.mkdirs(); - } - - private void asyncCall(SimuPo simu) { - ExecutorService executor = Executors.newSingleThreadExecutor(); - executor.execute(new Runnable() { - @Override - @SneakyThrows - public void run() { - cope(simu); - } - }); - executor.shutdown(); - } - - private void cope(SimuPo simu) { - try { - DataPo data = JSONUtil.toBean(simu.getData(), DataPo.class); - - update(simu, 1, null); - String token = gedbService.getToken(); - GeDb db = gedbService.connectGedb(token, data); - simu.setData(JSONUtil.toJsonStr(data)); - - update(simu, 2, null); - gedbService.copeVectors(token, data, db); - - update(simu, 3, null); - gedbService.copeDem(token, data); - - update(simu, 4, null); - uwService.createRainFile(data); - - update(simu, 5, null); - uwService.createConfig(data); - - update(simu, 6, null); - uwService.callExe(data); - - update(simu, 7, null); - //uwService.copeWaterFiles(); - - update(simu, 8, null); - uwService.copeDrainFiles(data); - - update(simu, 9, null); - resultService.process(data); - - update(simu, 10, "瀹屾垚"); - } catch (Exception ex) { - log.error(ex.getMessage(), ex); - update(simu, -simu.getStatus(), ex.getMessage()); - } - } - - private void update(SimuPo simu, int status, String rs) { - simu.setStatus(status); - if (null != rs) simu.setResult(rs); - simu.setUpdateTime(WebHelper.getCurrentTimestamp()); - - simuMapper.updateById(simu); - } } -- Gitblit v1.9.3