# 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 开发的坐标转换工具类,支持点,线,面等几何图形进行地理坐标与投影坐标间互相转换

# 一、转换效果

下图是使用工具类进行地理坐标转投影坐标,投影坐标转地理坐标,带号投影坐标与无带号投影坐标间转换的示例效果

如下是 转换效果图

image-20240528171256811

# 二、实现过程

为便于使用,定义了通用的几何坐标转换方法 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;
}

使用示例代码结果图

image-20240528172022861