JTS包下Geometry子类(Polygon、CircularRing、LineString等)都重写getArea、distance、getLength等方法实现面积距离周长等计算,但是当我们在使用时往往发现计算出来的值很奇怪,不知道其具体单位是什么。

这里我们先要搞清楚JTS包下的Geometry等类其实是代表的空间几何,它所提供的几何计算只是单纯的值计算,而我们提到的根据GIS经纬度等获取面积周长等其实是需要放到对应坐标系中才有意义。

而我们默认使用经纬度构建的Geometry对象一般都是使用WGS84坐标系初始化的,这时计算出来的值当然很奇怪。所以我们一般在计算面积、距离、周长等值时一般单位都是米,所以我们需要做的第一步是把坐标系转换为墨卡托投影,这时计算出来的单位才是米。

一、引入相应jar包

<!-- geo tools -->
<dependency>
  <groupId>org.locationtech.jts</groupId>
  <artifactId>jts-core</artifactId>
  <version>1.16.1</version>
</dependency>
<dependency>
  <groupId>org.geotools</groupId>
  <artifactId>gt-geojson</artifactId>
  <version>21.2</version>
</dependency>
<!-- epsg 查询 -->
<dependency>
	<groupId>org.geotools</groupId>
	<artifactId>gt-epsg-hsql</artifactId>
	<version>23.0</version>
</dependency>

二、坐标转换和相关计算

public void test(Geometry geometry) throws FactoryException, TransformException {
	// WGS84(一般项目中常用的是CSR:84和EPSG:4326)
	CoordinateReferenceSystem sourceCRS = CRS.decode("CRS:84");
	// Pseudo-Mercator(墨卡托投影)
	CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:3857");
	MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, false);
	Geometry geometryMercator = JTS.transform(geometry, transform);

	// 面积、周长
	System.out.println(geometryMercator.getArea());
	System.out.println(geometryMercator.getLength());
}