Geometry.getarea()和Polygon.getarea()有哪些单位?

时间:2013-07-11 17:11:21

标签: java jts

所以我正在处理一组图像,其中角落是地图上的长度。我正在创建多边形以检查给定图像是否重叠。我需要知道与Polygon和几何体的.getarea()方法相关的单位。我正在使用以下对象来创建我的多边形和几何

http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/geom/Geometry.html#getArea() http://www.vividsolutions.com/jts/javadoc/com/vividsolutions/jts/geom/Polygon.html

当使用上述两个对象时,我得到了一个数字但是我没有发现与该数字相关的单位是什么的指示。我们这么说米,公里,英里?

我正在使用的cordinates样本 +30.658739 -086.345670,+ 30.659997 -086.34002,+ 30.664041 -086.345082,+ 30.662783 -086.342750我正在寻找这4点之间的区域。
我从.getArea()返回的值是1.31039680000139E-5这些点是真正接近的,所以我想它的米数是1310.4米

3 个答案:

答案 0 :(得分:9)

如果不知道底层坐标系是什么,这很难说清楚。在快速浏览一下您链接到的Javadoc API后,我怀疑您的几何包可能处理原始笛卡尔坐标,并且与所使用的测量单位无关。如果是这种情况,那你就是一个很滑的斜坡。这是问题所在:

并非所有学位都是平等的

纬度上的度数都具有相同的空间分辨率。每个纬度对应于大约111km的距离。经度不是这种情况。在赤道,经度对应于111km的距离,但在极点,1度经度具有ZERO km的距离。换句话说,如果你有一个Lat / Lon盒子,左上角为10:0,右下角为0:10,它的表面积将大于Lat / Lon盒子,左上角为20:0及更低 - 正好在10:10,即使这些盒子的两边都是10度长。

第二个问题是地球的曲率。由于地球的曲率,地球表面上100km乘100km的方形将具有比10000km ^ 2更大的表面积,因为从地球表面上的一个点到另一个点的最短距离实际上不是直线,而是弧形。 / p>

第三个也经常被忽视但不那么重要的问题是地球实际上不是一个球体,而是一个椭圆体。它往往在赤道附近膨胀,这打破了我们的假设,即地球上任何地方的纬度与其他任何地方的纬度相同。然而,这个问题并没有像前两个那样在我们的表面积估计中引入那么多的误差。

换句话说,球形(或实际上,椭圆形)表面区域不是一个容易解决的问题,至少不像映射到笛卡尔坐标并使用它们来查找欧几里德测量那么容易表面积。如果你正在处理的表面区域跨越一个非常小的角距离,你可以侥幸逃脱它,但你的纬度/经度盒越大,你得到的失真就越多。

可能的解决方案

这仅适用于图像为矩形且图像的顶部/底部从左到右具有恒定纬度的情况。这仍然会引入更大范围的纬度误差,因为它仍然忽略了地球的曲率,但是比假设在笛卡尔坐标系中创建所有度数相等做得更好。如果是这种情况,那么您的图像的交点将受到以下坐标的限制:

topLat :* leftLon *, bottomLat :* rightLon *

计算平均纬度,然后用它来查找该平均纬度的每度经度距离 kmPerLon 。我们现在有以下等式:

区域 =(( topLat - bottomLat )* 111km)*( rightLon - leftLon )* kmPerLon

你从这里得到的区域将以平方公里为单位进行测量,但我再次重申,如果你的图像与平行纬度矩形对齐并且不会跨越很大的角距离,这只会相当有效。

答案 1 :(得分:0)

CodeBlind是正确的,该库与单元无关。这些单位不在Javadoc中,因为JTS对此主题没有任何意见。你可以使用你想要的任何单位。如果您的单位是英寸,则面积将以平方英寸为单位。如果你正在使用脚,区域将是平方英尺......依此类推。如果你的数字是度数,那么你的面积是度数平方。

答案 2 :(得分:0)

What are the distance units in com.vividsolutions.jts.geom.Geometry class?

从那篇文章中,距离是弧度(我已经证实了)。然后我想知道该区域是否也是弧度。所以我尝试了这个:

Math.toRadians(polygon1.getArea()) * 6371000 * 100 => this one become square kilometers.

我不知道这是否准确。但它非常接近