通过JTS(Geometry[Polygon]) getArea计算多边形面积、距离、周长等(单位米)
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()); }