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坐标)生成多边形