场景
Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示:
Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示_霸道流氓气质的博客-CSDN博客
在上面实现Java中集成Geotools之后,需求是将WKT数据转换成其他坐标系的WKT。
比如说将EPSG:4524的坐标系转换成EPSG:2334的坐标系数据。
当然如果是数据量较少,可以直接从WKT中复制出来单个点的数据在EPSG的官网进行转换。
EPSG.io: Coordinate Systems Worldwide
但是如果数据量较大,需要通过代码遍历的方式去转换大量数据。
注:
博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
实现
1、用到ESPG的转换需要添加依赖
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>24-SNAPSHOT</version>
</dependency>
否则会提示:
No code "EPSG:4524" from authority "EPSG" found for object of type "EngineeringCRS"
上面也讲过需要设置geotools的仓库,所以完整的pom需要添加的内容
<!-- GeoTools begin-->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>24-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-swing</artifactId>
<version>24-SNAPSHOT</version>
</dependency>
<!-- GeoTools epsg need -->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>24-SNAPSHOT</version>
</dependency>
</dependencies>
<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>
<!-- GeoTools end-->
2、然后新建类
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.WKTWriter;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CRSAuthorityFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
public class WKTTransform {
public static void main(String[] args) throws ParseException, FactoryException, TransformException {
//要转换的wkt
String oldWKT = "LINESTRING (37360817.569479 5127237.510467304, 37360830.13825466 5127118.315033647)";
WKTReader wktReader = new WKTReader();
//读取wkt为Geometry 几何对象
Geometry oldGeometry = wktReader.read(oldWKT);
//获取CRS权威工厂
CRSAuthorityFactory crsAuthorityFactory = CRS.getAuthorityFactory(true);
//创建sourceCRS
CoordinateReferenceSystem sourceCRS = crsAuthorityFactory.createCoordinateReferenceSystem("EPSG:4524");
//创建targetCRS
CoordinateReferenceSystem targetCRS = crsAuthorityFactory.createCoordinateReferenceSystem("EPSG:2334");
//获取MathTransform
MathTransform mathTransform = CRS.findMathTransform(sourceCRS, targetCRS, true);
//转换
Geometry transform = JTS.transform(oldGeometry, mathTransform);
//Geometry几何对象转换为WKT
String newWKT = new WKTWriter().write(transform);
System.out.println(newWKT);
}
}
详细说明见代码实现。
相关api参考官方api文档
Overview (Geotools modules 30-SNAPSHOT API)
运行代码输出结果
注意这里转换的数据,将同样的坐标在EPSG网站上转换后对比
发现会存在0.00级别的误差数据。
3、如果以上0.00级别的误差都不能容忍的话,可以采用以下方式。
看一下epsg.io官网坐标系转换的接口,发现是无需任何鉴权,比如上面的转换对应的是get请求。
https://epsg.io/srs/transform/37360817.569479,5127237.510467304.json?key=default&s_srs=4524&t_srs=2334
所以另一种方式就是从WKT获取所有坐标,然后调用上面espg.io的接口进行转换,然后再将转换后的数据转成WKT。
具体流程自行实现。