# java 基于 geotools 实现的几何图形坐标系转换通用工具类 geotools 几何坐标转换 java 几何坐标转换
导入依赖
<!-- shp 文件解析 --> | |
<dependency> | |
<groupId>org.gdal</groupId> | |
<artifactId>gdal</artifactId> | |
<version>3.5.0</version> | |
</dependency> | |
<dependency> | |
<groupId>net.postgis</groupId> | |
<artifactId>postgis-jdbc</artifactId> | |
<version>2.5.0</version> | |
</dependency> | |
<!-- 解析 shp 文件 --> | |
<dependency> | |
<groupId>org.geotools</groupId> | |
<artifactId>gt-shapefile</artifactId> | |
<version>25.0</version> | |
</dependency> | |
<dependency> | |
<groupId>org.geotools</groupId> | |
<artifactId>gt-epsg-wkt</artifactId> | |
<version>25.0</version> | |
</dependency> | |
<dependency> | |
<groupId>org.geotools</groupId> | |
<artifactId>gt-geojson</artifactId> | |
<version>25.0</version> | |
</dependency> |
在 gis 开发中,前端地图通常使用地理坐标,而后端在计算几何面积等操作时,需要使用投影坐标。这个过程中需要进行坐标转换。下面带来了一个 java 基于 geotools 开发的坐标转换工具类,支持点,线,面等几何图形进行地理坐标与投影坐标间互相转换
# 一、转换效果
下图是使用工具类进行地理坐标转投影坐标,投影坐标转地理坐标,带号投影坐标与无带号投影坐标间转换的示例效果
如下是 转换效果图
# 二、实现过程
为便于使用,定义了通用的几何坐标转换方法 coordinateTransform (Geometry sourceGeometry,int targetSrid),传入源几何对象和目标坐标 gis 即可
# 1、固定坐标系轴方向
通过下面代码固定坐标系轴方向,如果不对坐标系轴方向进行固定,则会使不同运行环境的坐标系 x,y 方向不同,进而可能出现本地开发时坐标转换正常,但是部署到服务器后坐标转换结果异常的迷之 bug
CRSAuthorityFactory factory = CRS.getAuthorityFactory(true); |
# 2、创建转换坐标系
通过下面代码创建源坐标系和目标坐标系,这里从传递进来的源几何参数 (Geometry sourceGeometry) 中获取源坐标系 srid (srid 指空间参照标识符,每个坐标系定义均有一个唯一的标识,通常为 4 位整数值)
CoordinateReferenceSystem source = factory.createCoordinateReferenceSystem("EPSG:" + sourceGeometry.getSRID()); | |
CoordinateReferenceSystem target = factory.createCoordinateReferenceSystem("EPSG:" + targetSrid); |
# 3、建立坐标转换
MathTransform transform = CRS.findMathTransform(source, target,true); |
# 4、进行坐标转换
Geometry res = JTS.transform(sourceGeometry, transform); |
# 5、完整坐标转换方法代码
public static Geometry coordinateTransform(Geometry sourceGeometry,int targetSrid){ | |
if (sourceGeometry == null || sourceGeometry.getSRID() == 0 || targetSrid == 0){ | |
return null; | |
} | |
try { | |
CRSAuthorityFactory factory = CRS.getAuthorityFactory(true); | |
CoordinateReferenceSystem source = factory.createCoordinateReferenceSystem("EPSG:" + sourceGeometry.getSRID()); | |
CoordinateReferenceSystem target = factory.createCoordinateReferenceSystem("EPSG:" + targetSrid); | |
MathTransform transform = CRS.findMathTransform(source, target,true); | |
Geometry res = JTS.transform(sourceGeometry, transform); | |
if (res != null){ | |
res.setSRID(targetSrid); | |
} | |
return res; | |
}catch (FactoryException | TransformException e){ | |
e.printStackTrace(); | |
} | |
return null; | |
} |
# 三、工具类使用
# 1、创建几何对象
这里使用 wkt 格式几何坐标串进行实例演示坐标转换,这里写一个 wkt 转几何对象的通用方法 createGeometry (String wkt,int srid),传入 wkt 和坐标系 srid 即可,实现代码如下:
public static Geometry createGeometry(String wkt,int srid){ | |
if (StringUtil.isEmpty(wkt)){ | |
return null; | |
} | |
try { | |
WKTReader reader = new WKTReader(); | |
Geometry geometry = reader.read(wkt); | |
geometry.setSRID(srid); | |
return geometry; | |
} catch (Exception e){ | |
e.printStackTrace(); | |
} | |
return null; | |
} |
# 2、坐标转换示例
public static void main(String[] args) throws IOException{ | |
String wkt = "POINT (106.61 25.32)"; | |
Geometry source = createGeometry(wkt,4490); | |
Geometry res = coordinateTransform(source, 4524); | |
int x = 1; | |
} |
使用示例代码结果图