我使用jts.jar,包是com.vividsolutions.jts.geom,以获得几何区域。但是方法getArea()不能给我正确的结果。我的代码是

public static void main(String[] args) throws ParseException {
        GeometryFactory geometryFactory = new GeometryFactory();
        WKTReader reader = new WKTReader(geometryFactory);
        String s = "MULTIPOLYGON (((114.273193 40.480272, 114.274645
        MultiPolygon mpolygon = null;
            mpolygon = (MultiPolygon) reader.read(s);
            System.out.println(mpolygon.getArea());
    }

最佳答案

在寻找类似问题的答案时找到了这个问题之后,我想我会分享我的发现:

从博客文章中获得的描述,因为它解释了您要解决的问题:

GIS stackexchange上经常出现的问题之一是“什么单位是
由JTS getArea()计算的面积“。这似乎无关紧要
很多时候人们说这不是答案,因为这取决于
数据的投影。这个问题不会死,所以我煮熟了
一些对大多数多边形应该给出近似答案的代码。

与大多数这些问题一样,技巧是转换多边形
到平面直角坐标平面(这是JTS最有效的地方)。我们可以用
GeoTools自动投影(假设多边形足够小)
然后只需调用.getArea()方法。

解:

public static void main(String[] args) throws Exception {
  GeometryFactory geometryFactory = new GeometryFactory();
  WKTReader reader = new WKTReader(geometryFactory);
  String s = "MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))";
  MultiPolygon mpolygon = (MultiPolygon) reader.read(s);
  Point centroid = mpolygon.getCentroid();
  String autoCode = "AUTO:42001," + centroid.getX() + "," + centroid.getY();
  CoordinateReferenceSystem auto = CRS.decode(autoCode);
  MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);
  MultiPolygon projed = (MultiPolygon) JTS.transform(mpolygon, transform);
  Measure<Double, Area> measure = Measure.valueOf(projed.getArea(), SI.SQUARE_METRE);
  System.out.println(measure);
}

输出:
8.146055550674082E12 m²

参考:https://blog.ianturton.com/geotools,/projections/2017/08/01/area-of-a-polygon.html

09-25 22:54