利用pgsql插件PostGIS 实现地理坐标系数据转换

Posted 洛阳泰山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用pgsql插件PostGIS 实现地理坐标系数据转换相关的知识,希望对你有一定的参考价值。

pgsql数据库添加PostGIs 空间扩展

CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION address_standardizer;

查询坐标系数据转换sql的mapper.xml

    <select id="coordinateTransform" resultType="java.lang.String">
      select st_astext(st_transform(st_setsrid(ST_MakePoint(#pointX,#pointY),#srcSrid),#targetSrid))
    </select>

mapper类

    /**
     * 方法描述: 计算线的夹角
     *
     * @param x 源坐标x
     * @param y 源坐标y
     * @param srcSrid  源坐标系EPSG代号
     * @param targetSrid 目标坐标系EPSG代号
     * @return @link String
     */
    String coordinateTransform(@Param("pointX") BigDecimal x, @Param("pointY") BigDecimal y, @Param("srcSrid") int srcSrid, @Param("targetSrid") int targetSrid);

service类

    //坐标系转换
    public CoordinateDTO coordinateTransform(BigDecimal x, BigDecimal y, int srcSrid, int targetSrid) 
        CoordinateDTO vo=new CoordinateDTO();
        String  targetPoint = tunnelCenterLineService.coordinateTransform(x,y,srcSrid,targetSrid);
        String[] coordinateArr = StringUtil.subBetween(targetPoint, "(", ")").split(" ");
        if(coordinateArr==null ||coordinateArr.length<2)
            return vo;
        
        String txs="Infinity".equals(coordinateArr[0])?"0":coordinateArr[0];
        String tys="Infinity".equals(coordinateArr[1])?"0":coordinateArr[1];
        BigDecimal tx=new BigDecimal(txs).setScale(3, BigDecimal.ROUND_HALF_UP);
        BigDecimal ty=new BigDecimal(tys).setScale(3, BigDecimal.ROUND_HALF_UP);
        vo.setX(tx);
        vo.setY(ty);
        return  vo;
    

注:计算结果和专业测量软件转换的结果,误差在1毫米之间。 

使用示例

    @ApiOperation(value = "坐标系转换北京54-国家2000")
    @PostMapping(value = "/bjz54ToCgcs2000")
    public ResponseDTO<CoordinateDTO> bjz54ToCgcs2000(@RequestBody CoordinateDTO dto)
        return ResponseDTO.succData(unionSpaceDataService.coordinateTransform(dto.getX(),dto.getY(),2415,4527));
    

以上是关于利用pgsql插件PostGIS 实现地理坐标系数据转换的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 添加postgis插件实现获取经纬度间的距离

利用GDAL实现影像的几何校正

有啥方法可以从作为 LAT/LONG 作为 PostGIS 中的地理数据类型插入的 GPS 坐标中恢复数据?

PostgreSQL , PostGIS , 球坐标 , 平面坐标 , 球面距离 , 平面距离

常规笛卡尔坐标系的 PostGIS 空间参考 ID(SRID)?

错误:无法打开扩展控制文件“/usr/pgsql-9.6/share/extension/postgis.control”:没有这样的文件或目录