如何获取WKT区域?

3

我使用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());
    }

1
你得到了什么结果,又期望得到什么?看起来你有经纬度坐标,所以笛卡尔区域的单位应该是平方度,这是无意义的。如果你期望其他面积单位,你需要使用其他库。 - Mike T
1个回答

1

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

以下是从博客文章中摘取的描述,因为它解释了您要解决的问题:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接