zhongrj
2024-12-02 1b571842429899c253c8bce5c6e01aedb056416a
新增高度,新增位置地形分析增加高度
12 files modified
3 files added
364 ■■■■■ changed files
pom.xml 5 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/dem/DemConfigProperties.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/dem/DemUtils.java 109 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/controller/TestController.java 177 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/entity/EmergencySpaceEntity.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/entity/FacilityEntity.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/entity/FirmInfo.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/entity/GeomInfoEntity.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/entity/IndParkInfoEntity.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/entity/PanoramicEntity.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/entity/ProTarEntity.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/entity/SuppliesEntity.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/mapper/EmergencySpaceMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/yw/mapper/FacilityMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/resources/application.yml 1 ●●●● patch | view | raw | blame | history
pom.xml
@@ -244,6 +244,11 @@
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geotiff</artifactId>
            <version>28.0</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>28.0</version>
        </dependency>
src/main/java/org/springblade/modules/dem/DemConfigProperties.java
New file
@@ -0,0 +1,20 @@
package org.springblade.modules.dem;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Data
@ConfigurationProperties("dem")
public class DemConfigProperties {
    private String tifUrl;
    private String shanxiTifUrl;
    private int defaultHeiht;
    private int safeTrueHeight;
}
src/main/java/org/springblade/modules/dem/DemUtils.java
New file
@@ -0,0 +1,109 @@
package org.springblade.modules.dem;
import lombok.SneakyThrows;
import org.geotools.coverage.grid.GridCoordinates2D;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.gce.geotiff.GeoTiffReader;
import org.geotools.geometry.DirectPosition2D;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.locationtech.jts.geom.Coordinate;
import org.opengis.geometry.DirectPosition;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform2D;
import java.io.File;
public class DemUtils {
    /**
     * 根据点获取海拔高
     * @param file
     * @param point
     * @return
     */
    @SneakyThrows
    public static int calculateMaxByPoint(File file, Coordinate point) {
        //获取高程文件
        GeoTiffReader reader = new GeoTiffReader(file);
        GridCoverage2D coverage = reader.read(null);
        CoordinateReferenceSystem crs = coverage.getCoordinateReferenceSystem2D();
        DirectPosition position = new DirectPosition2D(crs, point.x, point.y);
        int[] pixelValue = (int[]) coverage.evaluate(position);
        return pixelValue[0];
    }
    /**
     * 计算两点之间最高海拔
     * @param file
     * @param start
     * @param end
     * @return
     */
    @SneakyThrows
    public static Coordinate calculateMaxElevation(File file, Coordinate start, Coordinate end) {
        //获取高程文件
        GeoTiffReader reader = new GeoTiffReader(file);
        GridCoverage2D coverage = reader.read(null);
        CoordinateReferenceSystem crs = coverage.getCoordinateReferenceSystem2D();
        MathTransform2D toGrid = (MathTransform2D) CRS.findMathTransform(DefaultGeographicCRS.WGS84, crs, true);
        MathTransform2D fromGrid = (MathTransform2D) CRS.findMathTransform(crs, DefaultGeographicCRS.WGS84, true);
        DirectPosition2D startPos = new DirectPosition2D(start.x, start.y);
        DirectPosition2D endPos = new DirectPosition2D(end.x, end.y);
        GridCoordinates2D startGrid = new GridCoordinates2D();
        GridCoordinates2D endGrid = new GridCoordinates2D();
        toGrid.transform(startPos, startGrid);
        toGrid.transform(endPos, endGrid);
        int maxPixelValue = Integer.MIN_VALUE;
        Coordinate retCoordinate = new Coordinate();
        // 线性插值,计算中间的点
        for (int i = 0; i <= 10000; i++) {
            double t = i / 10000.0;
            double lon = start.x + t * (end.x - start.x);
            double lat = start.y + t * (end.y - start.y);
            DirectPosition position = new DirectPosition2D(crs, lon, lat);
            int[] pixelValue = (int[]) coverage.evaluate(position);
            if (pixelValue[0] > maxPixelValue) {
                maxPixelValue = pixelValue[0];
                retCoordinate.setX(lon);
                retCoordinate.setY(lat);
                retCoordinate.setZ(maxPixelValue);
            }
        }
        return retCoordinate;
    }
    public static void main(String[] args) {
        Coordinate start = new Coordinate(115.856725497, 28.624514734);
////        Coordinate end = new Coordinate(115.84832847430599, 28.629107705136526);
//        Coordinate end = new Coordinate(115.85650343813958, 28.62419061027172);
//
        String demPath = "C:\\Users\\vip_x\\Desktop\\无人机\\高程\\江西省12.5米DEM_CGCS2000\\江西省12.5米DEM_CGCS2000.tif";
        File file = new File(demPath);
//
//        Coordinate height = calculateMaxElevation(file,start,end);
//        System.out.println("height:" + height);
//
////        double maxElevation = calculateMaxElevation(file, start, end);
////        System.out.println("Maximum elevation between points: " + maxElevation);
//
        int height2 = calculateMaxByPoint(file,start);
        System.out.println("height2 = " + height2);
    }
}
src/main/java/org/springblade/modules/yw/controller/TestController.java
New file
@@ -0,0 +1,177 @@
package org.springblade.modules.yw.controller;
import lombok.AllArgsConstructor;
import org.apache.logging.log4j.util.Strings;
import org.locationtech.jts.geom.Coordinate;
import org.springblade.modules.dem.DemUtils;
import org.springblade.modules.yw.entity.*;
import org.springblade.modules.yw.service.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.util.List;
/**
 * 测试数据处理
 */
@RestController
@AllArgsConstructor
@RequestMapping("/test/data")
public class TestController {
    private final IEmergencySpaceService emergencySpaceService;
    private final IFacilityService facilityService;
    private final IFirmInfoService firmInfoService;
    private final IGeomInfoService geomInfoService;
    private final IIndParkInfoService indParkInfoService;
    private final IPanoramicService panoramicService;
    private final IProTarService proTarService;
    private final ISuppliesService suppliesService;
    /**
     * 测试数据处理
     */
    @GetMapping("/emeSpace")
    public void handleDataEmeSpace(){
        // 查询数据
        List<EmergencySpaceEntity> list = emergencySpaceService.list();
        // 获取高程
        for (EmergencySpaceEntity emergencySpaceEntity : list) {
            if (!Strings.isBlank(emergencySpaceEntity.getLng()) && Strings.isBlank(emergencySpaceEntity.getGeom())){
                Coordinate point = new Coordinate(Double.parseDouble(emergencySpaceEntity.getLng()), Double.parseDouble(emergencySpaceEntity.getLat()));
                int ele = DemUtils.calculateMaxByPoint(getFile(), point);
                // 设置高程
                emergencySpaceEntity.setEle(Integer.toString(ele));
                // 更新数据
                emergencySpaceService.updateById(emergencySpaceEntity);
            }
        }
    }
    /**
     * 测试数据处理
     */
    @GetMapping("/fac")
    public void handleDataFac(){
        // 查询数据
        List<FacilityEntity> list = facilityService.list();
        // 获取高程
        for (FacilityEntity emergencySpaceEntity : list) {
            if (!Strings.isBlank(emergencySpaceEntity.getLng())){
                Coordinate point = new Coordinate(Double.parseDouble(emergencySpaceEntity.getLng()), Double.parseDouble(emergencySpaceEntity.getLat()));
                int ele = DemUtils.calculateMaxByPoint(getFile(), point);
                // 设置高程
                emergencySpaceEntity.setEle(Integer.toString(ele));
                // 更新数据
                facilityService.updateById(emergencySpaceEntity);
            }
        }
    }
    /**
     * 测试数据处理
     */
    @GetMapping("/firm")
    public void handleDataFirm(){
        // 查询数据
        List<FirmInfo> list = firmInfoService.list();
        // 获取高程
        for (FirmInfo emergencySpaceEntity : list) {
            if (!Strings.isBlank(emergencySpaceEntity.getLng())){
                Coordinate point = new Coordinate(Double.parseDouble(emergencySpaceEntity.getLng()), Double.parseDouble(emergencySpaceEntity.getLat()));
                int ele = DemUtils.calculateMaxByPoint(getFile(), point);
                // 设置高程
                emergencySpaceEntity.setEle(Integer.toString(ele));
                // 更新数据
                firmInfoService.updateById(emergencySpaceEntity);
            }
        }
    }
    /**
     * 测试数据处理
     */
    @GetMapping("/ind")
    public void handleDataInd(){
        // 查询数据
        List<IndParkInfoEntity> list = indParkInfoService.list();
        // 获取高程
        for (IndParkInfoEntity emergencySpaceEntity : list) {
            if (!Strings.isBlank(emergencySpaceEntity.getLng())){
                Coordinate point = new Coordinate(Double.parseDouble(emergencySpaceEntity.getLng()), Double.parseDouble(emergencySpaceEntity.getLat()));
                int ele = DemUtils.calculateMaxByPoint(getFile(), point);
                // 设置高程
                emergencySpaceEntity.setEle(Integer.toString(ele));
                // 更新数据
                indParkInfoService.updateById(emergencySpaceEntity);
            }
        }
    }
    /**
     * 测试数据处理
     */
    @GetMapping("/pan")
    public void handleDataPan(){
        // 查询数据
        List<PanoramicEntity> list = panoramicService.list();
        // 获取高程
        for (PanoramicEntity emergencySpaceEntity : list) {
            if (!Strings.isBlank(emergencySpaceEntity.getLng())){
                Coordinate point = new Coordinate(Double.parseDouble(emergencySpaceEntity.getLng()), Double.parseDouble(emergencySpaceEntity.getLat()));
                int ele = DemUtils.calculateMaxByPoint(getFile(), point);
                // 设置高程
                emergencySpaceEntity.setEle(Integer.toString(ele));
                // 更新数据
                panoramicService.updateById(emergencySpaceEntity);
            }
        }
    }
    /**
     * 测试数据处理
     */
        @GetMapping("/pro")
    public void handleDataPro(){
        // 查询数据
        List<ProTarEntity> list = proTarService.list();
        // 获取高程
        for (ProTarEntity emergencySpaceEntity : list) {
            if (!Strings.isBlank(emergencySpaceEntity.getLng())){
                Coordinate point = new Coordinate(Double.parseDouble(emergencySpaceEntity.getLng()), Double.parseDouble(emergencySpaceEntity.getLat()));
                int ele = DemUtils.calculateMaxByPoint(getFile(), point);
                // 设置高程
                emergencySpaceEntity.setEle(Integer.toString(ele));
                // 更新数据
                proTarService.updateById(emergencySpaceEntity);
            }
        }
    }
    /**
     * 测试数据处理
     */
    @GetMapping("/sup")
    public void handleDataSup(){
        // 查询数据
        List<SuppliesEntity> list = suppliesService.list();
        // 获取高程
        for (SuppliesEntity emergencySpaceEntity : list) {
            if (!Strings.isBlank(emergencySpaceEntity.getLng())){
                Coordinate point = new Coordinate(Double.parseDouble(emergencySpaceEntity.getLng()), Double.parseDouble(emergencySpaceEntity.getLat()));
                int ele = DemUtils.calculateMaxByPoint(getFile(), point);
                // 设置高程
                emergencySpaceEntity.setEle(Integer.toString(ele));
                // 更新数据
                suppliesService.updateById(emergencySpaceEntity);
            }
        }
    }
    public File getFile(){
        String demPath = "F:\\aliyun\\江西省地形数据\\江西省12.5米DEM_CGCS2000.tif";
        return new File(demPath);
    }
}
src/main/java/org/springblade/modules/yw/entity/EmergencySpaceEntity.java
@@ -130,4 +130,10 @@
    @ApiModelProperty(value = "空间坐标")
    private String geom;
    /**
     * 高程
     */
    @ApiModelProperty(value = "高程")
    private String ele;
}
src/main/java/org/springblade/modules/yw/entity/FacilityEntity.java
@@ -101,4 +101,10 @@
    @TableLogic
    private Integer isDeleted;
    /**
     * 高程
     */
    @ApiModelProperty(value = "高程")
    private String ele;
}
src/main/java/org/springblade/modules/yw/entity/FirmInfo.java
@@ -149,4 +149,10 @@
    @TableField("is_deleted")
    @TableLogic
    private Integer isDeleted;
    /**
     * 高程
     */
    @ApiModelProperty(value = "高程")
    private String ele;
}
src/main/java/org/springblade/modules/yw/entity/GeomInfoEntity.java
@@ -90,4 +90,10 @@
    @TableLogic
    private Integer isDeleted;
    /**
     * 高程
     */
    @ApiModelProperty(value = "高程")
    private String ele;
}
src/main/java/org/springblade/modules/yw/entity/IndParkInfoEntity.java
@@ -128,4 +128,10 @@
    @TableLogic
    private Integer isDeleted;
    /**
     * 高程
     */
    @ApiModelProperty(value = "高程")
    private String ele;
}
src/main/java/org/springblade/modules/yw/entity/PanoramicEntity.java
@@ -97,4 +97,10 @@
    @TableLogic
    private Integer isDeleted;
    /**
     * 高程
     */
    @ApiModelProperty(value = "高程")
    private String ele;
}
src/main/java/org/springblade/modules/yw/entity/ProTarEntity.java
@@ -142,4 +142,10 @@
    @ApiModelProperty(value = "说明")
    private String remark;
    /**
     * 高程
     */
    @ApiModelProperty(value = "高程")
    private String ele;
}
src/main/java/org/springblade/modules/yw/entity/SuppliesEntity.java
@@ -121,4 +121,10 @@
    @TableLogic
    private Integer isDeleted;
    /**
     * 高程
     */
    @ApiModelProperty(value = "高程")
    private String ele;
}
src/main/java/org/springblade/modules/yw/mapper/EmergencySpaceMapper.xml
@@ -6,7 +6,7 @@
    <select id="selectEmergencySpacePage" resultType="org.springblade.modules.yw.vo.EmergencySpaceVO">
        select
        yes.id,yes.name,yes.full_name,yes.type,yes.main_func,yes.lng,yes.lat,yes.pre_level,
        yes.capacity,yes.remark,yes.firm_id,yes.image_url,ST_AsGeoJSON(yes.geom) as geom,
        yes.capacity,yes.remark,yes.firm_id,yes.image_url,ST_AsGeoJSON(yes.geom) as geom,yes.ele,
        yfi.name as firmName,
        bdb.dict_value as emergencySpaceType
        from yw_emergency_space yes
src/main/java/org/springblade/modules/yw/mapper/FacilityMapper.xml
@@ -44,7 +44,7 @@
    <!--三道防线信息查询-->
    <select id="getTreeFacilityList" resultType="org.springblade.modules.yw.vo.FacilityVO">
        select
        yes.id,yes.name,yes.lng,yes.lat,yes.image_url,yes.capacity,yfi.id as firm_id,
        yes.id,yes.name,yes.lng,yes.lat,yes.ele,yes.image_url,yes.capacity,yfi.id as firm_id,
        yfi.name as firmName
        from yw_emergency_space yes
        left join yw_firm_info yfi on yfi.id = yes.firm_id and yfi.is_deleted = 0
src/main/resources/application.yml
@@ -239,6 +239,7 @@
    #接口放行
    skip-url:
      - /blade-test/**
      - /test/**
#      - /yw/**
#      - /blade-resource/**
    #授权认证配置