张洋洋
2025-02-20 4fd3f760a30adf230f85b3e82d9a72af407266e7
src/main/java/com/se/simu/controller/SimuController.java
@@ -11,6 +11,7 @@
import com.se.simu.domain.po.DataPo;
import com.se.simu.domain.po.SimuPo;
import com.se.simu.domain.vo.*;
import com.se.simu.enums.RadioEnums;
import com.se.simu.service.*;
import com.se.simu.utils.*;
import io.swagger.annotations.*;
@@ -24,10 +25,13 @@
import javax.annotation.Resource;
import java.io.*;
import java.math.BigDecimal;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@@ -231,6 +235,9 @@
                if (StringUtils.isEmpty(floodFile)) {
                    return fail("范围文件地址不能为空", false);
                } else {
                    // todo: 解析范围文件 根据不同的的格式文件进行不同的解析,获取需要计算的范围值
                    //  上传格式:.shp/.tiff/.img/.geojson
                    //  重新给vo赋值
                    // 获取文件的后缀名
                    String fileName = floodFile.substring(floodFile.lastIndexOf("."));
                    // 判断后缀名是否为.shp
@@ -252,54 +259,79 @@
                        rangeVerify(minX, maxX, minY, maxY);
                    }
                }
            // todo: 解析范围文件 根据不同的的格式文件进行不同的解析,获取需要计算的范围值
            //  上传格式:.shp/.tiff/.img/.geojson
            //  重新给vo赋值
        } catch (Exception e) {
            log.error("解析范围文件失败");
            if (null == vo.getMinx() || null == vo.getMiny() || null == vo.getMaxx() || null == vo.getMaxy()) {
                return fail("解析范围文件失败!选择范围不能为空,请重新选择文件!", false);
            }
        }
        JSONArray jsonArray = new JSONArray();
        String stationFile = vo.getStationFile();
        log.info("站点文件shp地址:{}", stationFile);
        try {
            // 判断地址不为空
            if (StringUtils.isEmpty(stationFile)) {
                return fail("站点文件shp地址不能为空", false);
            if (RadioEnums.ACCESS.getCode().equals(vo.getRadio()) && StringUtils.isNotEmpty(stationFile)) {
                // 1 读取shp文件,获取站点坐标值
                ShpToolUtils.readShpGetLocal(stationFile);
            }
            // 1 读取shp文件,获取站点坐标值
            jsonArray = ShpToolUtils.readShpGetLocal(stationFile);
            System.out.println("jsonArray = " + jsonArray);
        } catch (Exception e) {
            log.error("解析站点文件shp失败");
        }
        String stationRainFile = vo.getStationRainFile();
        log.info("站点雨量CSV文件地址:{}", floodFile);
        JSONArray array = new JSONArray();
        // 创建表名 时间戳
        String tableName = "station_rain_" + System.currentTimeMillis();
        try {
            // 判断地址不为空
            if (StringUtils.isEmpty(stationRainFile)) {
                return fail("站点雨量CSV文件地址不能为空", false);
            //接入处理
            if (RadioEnums.ACCESS.getCode().equals(vo.getRadio())) {
                String stationRainFile = vo.getStationRainFile();
                log.info("站点雨量CSV文件地址:{}", floodFile);
                // 判断地址不为空
                if (StringUtils.isEmpty(stationRainFile)) {
                    return fail("站点雨量CSV文件地址不能为空", false);
                }
                // 1 读取CSV 文件
                CsvToSQLiteUtils.readCsvSaveLocal(stationRainFile, tableName);
                // 获取仿真时间 duration
                Integer duration = CsvToSQLiteUtils.getDuration(tableName);
                log.info("仿真时间 duration = {}", duration);
                vo.setDuration(duration);
                // 获取降雨总量 total
                Double total = CsvToSQLiteUtils.getTotal(tableName);
                log.info("降雨总量 total = {}", total);
                vo.setTotal(total);
            } else if (RadioEnums.SIMULATE.getCode().equals(vo.getRadio())) {
                if (StringUtils.isEmpty(vo.getStation())) {
                    return fail("模拟计算站点不能为空!", false);
                }
                if (vo.getTotal() == null) {
                    return fail("模拟计算降雨量不能为空!", false);
                }
                if (vo.getDuration() == null || vo.getDuration() <= 0) {
                    return fail("模拟计算计算时长不能为空!", false);
                }
                if (vo.getStationLatitude() == null) {
                    return fail("模拟计算计算坐标!", false);
                }
                if (vo.getStationLongitude() == null) {
                    return fail("模拟计算计算坐标!", false);
                }
                double aveTotal = BigDecimal.valueOf(vo.getTotal()).divide(BigDecimal.valueOf(vo.getDuration()), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
                JSONArray jsonArray=new JSONArray();
                LocalDateTime now=LocalDateTime.now();
                DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
                for (int i=0;i<vo.getDuration();i++){
                    JSONObject jsonObject=new JSONObject();
                    jsonObject.put("stationName", vo.getStation());
                    jsonObject.put("rainfall", aveTotal);
                    jsonObject.put("longitude", vo.getStationLongitude());
                    jsonObject.put("latitude", vo.getStationLatitude());
                    LocalDateTime plusMinutes = now.plusMinutes(i);
                    jsonObject.put("datetime", customFormatter.format(plusMinutes));
                    jsonArray.add(jsonObject);
                }
                CsvToSQLiteUtils.readCsvSaveLocal(jsonArray, tableName);
            } else {
                return fail("无效的模型计算方式", false);
            }
            // 1 读取CSV 文件
            array = CsvToSQLiteUtils.readCsvSaveLocal(stationRainFile, tableName);
            // 获取仿真时间 duration
            Integer duration = CsvToSQLiteUtils.getDuration(tableName);
            log.info("仿真时间 duration = {}", duration);
            vo.setDuration(duration);
            // 获取降雨总量 total
            Double total = CsvToSQLiteUtils.getTotal(tableName);
            log.info("降雨总量 total = {}", total);
            vo.setTotal(total);
        } catch (Exception e) {
            log.error("解析站点雨量CSV文件失败");
            return fail("雨量处理失败!", false);
        }
        // TODO: 2024/12/24 根据这些文件的地址,获取文件内容,创建仿真视图
        try {
@@ -356,22 +388,22 @@
    @ApiOperation(value = "获取点路径")
    @GetMapping("/getPointUrl")
    public R<String> getPointUrl(@RequestParam("id") Integer id) throws Exception{
    public R<String> getPointUrl(@RequestParam("id") Integer id) throws Exception {
        SimuPo po = simuService.getSimuById(id);
        String token = EntityLibraryUtils.login();
        if (po != null) {
            return success(po.getPointUrl().replace("{token}",token));
            return success(po.getPointUrl().replace("{token}", token));
        }
        return success(null);
    }
    @ApiOperation(value = "获取线路径")
    @GetMapping("/getLineUrl")
    public R<String> getLineUrl(@RequestParam("id") Integer id) throws Exception{
    public R<String> getLineUrl(@RequestParam("id") Integer id) throws Exception {
        SimuPo po = simuService.getSimuById(id);
        String token = EntityLibraryUtils.login();
        if (po != null) {
            return success(po.getLinkUrl().replace("{token}",token));
            return success(po.getLinkUrl().replace("{token}", token));
        }
        return success(null);
    }