@xingjs@20241226@添加查询管线工具类,修改解决查询站点接口token存在无法获取的情况,解决后可正常获取token,并查询出需要的站点;解析shp文件获取站点范围
已添加1个文件
已修改1个文件
193 ■■■■■ 文件已修改
src/main/java/com/se/simu/controller/SimuController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/utils/ShpToolUtils.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/controller/SimuController.java
@@ -1,5 +1,6 @@
package com.se.simu.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.se.simu.config.PropertiesConfig;
import com.se.simu.domain.dto.GeDb;
@@ -11,6 +12,7 @@
import com.se.simu.domain.vo.R;
import com.se.simu.domain.vo.SimuVo;
import com.se.simu.service.*;
import com.se.simu.utils.ShpToolUtils;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@@ -208,12 +210,24 @@
            // todo: è§£æžèŒƒå›´æ–‡ä»¶ æ ¹æ®ä¸åŒçš„的格式文件进行不同的解析,获取需要计算的范围值
            //  ä¸Šä¼ æ ¼å¼ï¼š.shp/.tiff/.img/.geojson
            //  é‡æ–°ç»™vo赋值
            // 1 è¯»å–shp文件,获取范围值
            JSONObject jsonObject = ShpToolUtils.readShp(floodFile);
            // 2 èŽ·å–jsonObject中的范围值
            vo.setMinx(jsonObject.getDouble("minX"));
            vo.setMaxx(jsonObject.getDouble("maxX"));
            vo.setMiny(jsonObject.getDouble("minY"));
            vo.setMaxy(jsonObject.getDouble("maxY"));
        } catch (Exception e) {
            log.error("解析范围文件失败");
            if (null == vo.getMinx() || null == vo.getMiny() || null == vo.getMaxx() || null == vo.getMaxy()) {
                return fail("解析范围文件失败!选择范围不能为空,请重新选择文件!", false);
            }
        }
        String stationFile = vo.getStationFile();
        log.info("站点文件shp地址:{}", floodFile);
        String stationRainFile = vo.getStationRainFile();
        log.info("站点雨量CSV文件地址:{}", floodFile);
        // TODO: 2024/12/24 æ ¹æ®è¿™äº›æ–‡ä»¶çš„地址,获取文件内容,创建仿真视图
@@ -225,21 +239,16 @@
            if (null == vo.getDuration() || vo.getDuration() < 1 || vo.getDuration() > 10080) {
                return fail("仿真时长不能为空,且取值在1~10080之间");
            }
            if (null == vo.getMinx() || null == vo.getMiny() || null == vo.getMaxx() || null == vo.getMaxy()) {
                return fail("选择范围不能为空", false);
            }
            if (null == vo.getPid() || vo.getPid() < 0) {
                vo.setPid(0);
            }
            if (null == vo.getNum() || vo.getNum() < 1) {
                vo.setNum(simuService.getMaxId() + 1);
            }
            if (null == vo.getPid() || vo.getPid() < 0) {
                vo.setPid(0);
            }
            if (null == vo.getStartTime()) {
                vo.setStartTime(new Date());
            }
            // é˜²æ±›ä½œä¸š
            if (vo.getPid() > 0) {
                SimuPo pp = simuService.getSimuByPid(vo.getPid());
                if (null == pp) {
@@ -261,6 +270,7 @@
                    return fail("防汛范围不能为空", false);
                }
            }
            // å¼€å§‹æ¨¡æ‹Ÿè®¡ç®—
            boolean flag = simuFilesService.createByfiles(vo);
            return success(flag, flag ? "成功" : "失败");
        } catch (Exception ex) {
src/main/java/com/se/simu/utils/ShpToolUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,171 @@
package com.se.simu.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.gdal.gdal.gdal;
import org.gdal.ogr.*;
import org.gdal.osr.CoordinateTransformation;
import org.gdal.osr.SpatialReference;
import java.util.Arrays;
/**
 * shp å·¥å…·å®žç”¨ç¨‹åº
 *
 * @author xingjinshuang@smartearth.cn
 * @date 2024/12/26
 */
public class ShpToolUtils {
    // å£°æ˜Žä¸ºç±»æˆå‘˜å˜é‡
    private static double minX = Double.MAX_VALUE;
    private static double maxX = Double.MIN_VALUE;
    private static double minY = Double.MAX_VALUE;
    private static double maxY = Double.MIN_VALUE;
    // ç”¨äºŽå­˜å‚¨æ‰€æœ‰è½¬æ¢åŽçš„经纬度
    private static JSONArray coordinatesArray = new JSONArray();
    /**
     * é˜…读 SHP
     *
     * @param strVectorFile str å‘量文件
     * @return {@link JSONObject}
     */
    public static JSONObject readShp(String strVectorFile) {
        // æ³¨å†Œæ‰€æœ‰çš„驱动
        ogr.RegisterAll();
        // ä¸ºäº†æ”¯æŒä¸­æ–‡è·¯å¾„,请添加下面这句代码
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
        // è¯»å–数据,这里以ESRI的shp文件为例
        String strDriverName = "ESRI Shapefile";
        org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);
        if (oDriver == null) {
            System.out.println(strDriverName + " é©±åŠ¨ä¸å¯ç”¨ï¼\n");
            return null;
        }
        // æ‰“开数据源
        DataSource dataSource = oDriver.Open(strVectorFile);
        if (dataSource == null) {
            System.out.println("无法打开 Shapefile æ–‡ä»¶ï¼");
            return null;
        }
        Layer layer = dataSource.GetLayer(0);
        // èŽ·å–å›¾å±‚çš„èŒƒå›´ï¼ˆåˆæ­¥çš„çŸ©å½¢èŒƒå›´ï¼‰
        double[] layerExtent = layer.GetExtent();
        System.out.println("初始图层范围:minx:" + layerExtent[0] + ", maxx:" + layerExtent[1] + ", miny:" + layerExtent[2] + ", maxy:" + layerExtent[3]);
        // èŽ·å–å›¾å±‚çš„ç©ºé—´å‚è€ƒ
        SpatialReference layerSpatialRef = layer.GetSpatialRef();
        // åˆ›å»ºç›®æ ‡ç©ºé—´å‚考 (EPSG:4326)
        SpatialReference targetSpatialRef = new SpatialReference();
        targetSpatialRef.ImportFromEPSG(4326); // EPSG:4326 æ˜¯ WGS84
        // åˆ›å»ºåæ ‡è½¬æ¢å¯¹è±¡
        CoordinateTransformation coordTransform = CoordinateTransformation.CreateCoordinateTransformation(layerSpatialRef, targetSpatialRef);
        // éåŽ†æ¯ä¸ª feature èŽ·å–åæ ‡ç‚¹
        for (int i = 0; i < layer.GetFeatureCount(); i++) {
            Feature feature = layer.GetFeature(i);
            Geometry geometry = feature.GetGeometryRef();
            // åˆ¤æ–­å‡ ä½•类型并处理
            if (geometry != null) {
                if (geometry.GetGeometryType() == ogr.wkbPoint) {
                    // å•个点的处理
                    processPointGeometry(geometry, coordTransform);
                } else if (geometry.GetGeometryType() == ogr.wkbMultiPoint) {
                    // å¤šä¸ªç‚¹çš„处理
                    System.out.println("geometry = " + geometry);
                    //processMultiPointGeometry(geometry, coordTransform);
                }
            }
        }
        // æ‰“印转换后的矩形范围(经纬度)
        System.out.println("所有点的经纬度矩形范围:minX = " + minX + ", maxX = " + maxX + ", minY = " + minY + ", maxY = " + maxY);
        JSONObject json = new JSONObject();
        json.put("minX", minX);
        json.put("maxX", maxX);
        json.put("minY", minY);
        json.put("maxY", maxY);
        return json;
    }
    // å¤„理单个点的几何体
    private static void processPointGeometry(Geometry geometry, CoordinateTransformation coordTransform) {
        double x = geometry.GetX();
        double y = geometry.GetY();
        // åˆ›å»ºåŒ…含 3 ä¸ªå…ƒç´ çš„æ•°ç»„,Z åæ ‡å¯ä»¥è®¾ä¸º 0
        double[] coords = new double[]{x, y, 0}; // Z åæ ‡é»˜è®¤å€¼ä¸º 0
        //System.out.println("原始坐标1:coords = " + Arrays.toString(coords));
        // è½¬æ¢åæ ‡
        coordTransform.TransformPoint(coords);
        //System.out.println("转换后的坐标:coords = " + Arrays.toString(coords));
        // åæ ‡é¡ºåºæ˜¯ [latitude, longitude],交换顺序为 [longitude, latitude]
        double longitude = coords[0];
        double latitude = coords[1];
        //System.out.println("转换后的经纬度:longitude = " + longitude + ", latitude = " + latitude);
        // åˆ›å»ºä¸€ä¸ª JSON å¯¹è±¡ä¿å­˜ç»çº¬åº¦ä¿¡æ¯
        JSONObject coordObj = new JSONObject();
        coordObj.put("lat", longitude);
        coordObj.put("lon", latitude);
        // å°†æ­¤ JSON å¯¹è±¡æ·»åŠ åˆ° JSONArray ä¸­
        coordinatesArray.add(coordObj);
        // æ›´æ–°çŸ©å½¢è¾¹ç•Œï¼ˆæ­¤å¤„使用全局变量或返回值进行计算)
        updateRectangleBounds(coords);
    }
    // å¤„理多点的几何体
    private static void processMultiPointGeometry(Geometry geometry, CoordinateTransformation coordTransform) {
        int numPoints = geometry.GetGeometryCount();
        for (int j = 0; j < numPoints; j++) {
            Geometry pointGeometry = geometry.GetGeometryRef(j);
            double x = pointGeometry.GetX();
            double y = pointGeometry.GetY();
            // åˆ›å»ºåŒ…含 3 ä¸ªå…ƒç´ çš„æ•°ç»„,Z åæ ‡å¯ä»¥è®¾ä¸º 0
            double[] coords = new double[]{x, y, 0}; // Z åæ ‡é»˜è®¤å€¼ä¸º 0
            System.out.println("原始坐标2:coords = " + Arrays.toString(coords));
            // è½¬æ¢åæ ‡
            coordTransform.TransformPoint(coords);
            System.out.println("转换后的坐标:coords = " + Arrays.toString(coords));
            // åæ ‡é¡ºåºæ˜¯ [latitude, longitude],交换顺序为 [longitude, latitude]
            double longitude = coords[0];
            double latitude = coords[1];
            System.out.println("转换后的经纬度:longitude = " + longitude + ", latitude = " + latitude);
            // æ›´æ–°çŸ©å½¢è¾¹ç•Œ
            updateRectangleBounds(coords);
        }
    }
    // æ›´æ–°çŸ©å½¢çš„边界值
    private static void updateRectangleBounds(double[] coords) {
        double x = coords[0];
        double y = coords[1];
        // æ›´æ–°æœ€å°æœ€å¤§å€¼
        minX = Math.min(minX, x);
        maxX = Math.max(maxX, x);
        minY = Math.min(minY, y);
        maxY = Math.max(maxY, y);
    }
    public static void main(String[] args) {
        // è¯»å–shp文件
        readShp("D:\\0a_project\\model\\shp\\雨量站点数据\\雨量站点_4548\\雨量站点_4548.shp");
        System.out.println(coordinatesArray.toString()); // Pretty print with indent
    }
}