java 利用工具包Geotools实现不同坐标系之间坐标转换

Posted 洛阳泰山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 利用工具包Geotools实现不同坐标系之间坐标转换相关的知识,希望对你有一定的参考价值。

 

maven配置

我们将首先定义我们希望使用的 GeoTools 的版本号。本工作手册是为 28-SNAPSHOT 编写的,尽管您可能希望尝试不同的版本。

对于生产, geotools.version应该使用 28 的稳定版本:

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <geotools.version>28-SNAPSHOT</geotools.version>
    <maven.deploy.skip>true</maven.deploy.skip>
  </properties>

 我们指定以下依赖项(您的应用程序需要的 GeoTools 模块):

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>$geotools.version</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>$geotools.version</version>
        </dependency>

我们告诉 maven 从哪些存储库下载 jars:

  <repositories>
    <repository>
    <id>osgeo</id>
    <name>OSGeo Release Repository</name>
    <url>https://repo.osgeo.org/repository/release/</url>
    <snapshots><enabled>false</enabled></snapshots>
    <releases><enabled>true</enabled></releases>
    </repository>
    <repository>
    <id>osgeo-snapshot</id>
    <name>OSGeo Snapshot Repository</name>
    <url>https://repo.osgeo.org/repository/snapshot/</url>
    <snapshots><enabled>true</enabled></snapshots>
    <releases><enabled>false</enabled></releases>
    </repository>
  </repositories>

代码工具


import lombok.extern.slf4j.Slf4j;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.locationtech.jts.geom.Coordinate;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;

import java.math.BigDecimal;

@Slf4j
public class GisUtil 

    public static void main(String[] args) throws FactoryException, TransformException 
        bjz54ToCgcs2000( 39440999.301,3631381.649);
    //    bjz54ToCgcs2000( 39446227.146,3626791.679);
    

    /**
     * @param x 源坐标x
     * @param y 源坐标y
     * @Description: 坐标系转换-北京54投影转国家2000投影
     */
    public static Coordinate bjz54ToCgcs2000(double x ,double y)
        Coordinate tgtCoordinate= coordinateTransform(2415,4527, y, x);
        double tx=new BigDecimal(tgtCoordinate.x).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
        double ty=new BigDecimal(tgtCoordinate.y).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
        log.info(ty+","+tx);
        tgtCoordinate.setX(ty);
        tgtCoordinate.setY(tx);
        return tgtCoordinate;
    

    public static Coordinate bjz54ToCgcs2000(Coordinate p)
        return bjz54ToCgcs2000(p.x, p.y);
    

    /**
     * @param srcNo 源坐标系EPSG代号
     * @param targetNo 目标坐标系EPSG代号
     * @param x 源坐标x
     * @param y 源坐标y
     * @Description: 坐标系转换 
     */
    public static Coordinate coordinateTransform(int srcNo, int targetNo, double x , double y)
        Coordinate tar=new Coordinate();
        try 
            CoordinateReferenceSystem src = CRS.decode("EPSG:"+srcNo);
            CoordinateReferenceSystem target = CRS.decode("EPSG:"+targetNo);
            MathTransform transform = CRS.findMathTransform(src, target, true);
            Coordinate sour= new Coordinate(x, y);
           return JTS.transform(sour, tar, transform);
         catch (FactoryException | TransformException  e) 
            log.error(e.getMessage());
        
        return tar;

    

注:计算结果和测量软件的结果有2米的误差,用org.locationtech.proj4j工具包 计算的结果误差更大,有几十米。后续突出用pgis转换的办法误差在1毫米之间。

使用示例

    @ApiOperation(value = "坐标系转换北京54-国家2000")
    @GetMapping(value = "/bjz54ToCgcs2000")
    public ResponseDTO<Coordinate> bjz54ToCgcs2000(@RequestBody Coordinate dto)
        return ResponseDTO.succData(GisUtil.bjz54ToCgcs2000(dto));
    

参考文章:

ArcGIS投影坐标的判断与选择_减肥的吉吉的博客-CSDN博客_gis投影坐标系选哪个

常用的地理和投影坐标系的WKID_Giser_往事随风的博客-CSDN博客_wkid

以上是关于java 利用工具包Geotools实现不同坐标系之间坐标转换的主要内容,如果未能解决你的问题,请参考以下文章

使用JAVA中的geotools从定义距离(km)内的线(GPS坐标)生成多边形

GeoTools坐标转换(投影转换和仿射变换)

手写GIS二三维地理空间几何计算GeoTools工具类

geotools实现多边形的合并&缓冲区

我可以实现在 java(geotools) 中存在并编译的类的 Serializable 吗?

Geotools:将不同样式的点添加到同一地图图层