我使用jts.jar,package是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());
}
答案 0 :(得分: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