用红宝石计算多边形的面积

Posted

技术标签:

【中文标题】用红宝石计算多边形的面积【英文标题】:calculate the area of a polygon in ruby 【发布时间】:2011-06-23 15:52:53 【问题描述】:

我有一组表示多边形的纬度/经度坐标对。我正在尝试确定该多边形内的总面积。我将如何在 Ruby 中做到这一点?

这是一个多边形数组示例:

[[37.7663613767094, -122.452969210084], [37.7674219449606, -122.444718340349], [37.7701838510542, -122.445330289514], [37.7709974013834, -122.439159589248], [37.7700761930893, -122.438861402472], [37.7703501163684, -122.436868738421], [37.7712650571321, -122.437078116573], [37.7736056746515, -122.437533130227], [37.7714671036087, -122.453964210266], [37.7663613767094, -122.452969210084]]

【问题讨论】:

输入的单位是什么?弗隆? 【参考方案1】:

这在语言上可能并不重要。您可以使用此处提到的公式来计算多边形的面积:

http://mathworld.wolfram.com/PolygonArea.html

假设您的点是 (x1, y1) (x2, y2) .. (xn, yn) 并且它们包围了一个小区域:

Area = 0.5 * (x1 * y2 - x2 * y1 + x2 * y3 - x3 * y2 ..... + xn * y1 - x1 * yn)

注意:这不适用于较大的区域,您需要使用更复杂的方法来计算面积,其中涉及角度坐标。但是,这适用于可以假定为平面的小区域。

编辑:

要获得以平方英里为单位的面积,您可以执行以下操作,从那里转换为您想要的任何单位。

areaInSqMiles = Area * (60 * 60 * 1.15 * 1.15)

【讨论】:

再说一次,除非是赤道附近很小的区域,否则不适用于经纬度坐标。 @Spacedman 确切地说,纬度/经度是角坐标,不是线性的,因此除非涉及沿赤道的非常短的距离,否则它们将不起作用。离赤道越远,你的准确度就越低。为此,您需要大圆或正弦函数。【参考方案2】:

语言无关的解决方案:

给定:一个多边形总是由 n-2 个不重叠的三角形组成(n = 点数或边数)。 1 个三角形 = 3 边多边形 = 1 个三角形; 1 个正方形 = 4 个多边形 = 2 个三角形;等等恶心的QED

因此,可以通过“切掉”三角形来缩小多边形,总面积将是这些三角形面积的总和。用一张纸和剪刀试一试,最好先把这个过程形象化,然后再跟进。

如果您在多边形路径中选取任意 3 个连续点并使用这些点创建一个三角形,您将遇到以下三种可能情况中的一种且只有一种:

    生成的三角形完全在原始多边形内 生成的三角形完全在原始多边形之外 生成的三角形部分包含在原始多边形中

我们只对属于第一个选项(完全包含)的案例感兴趣。

每次我们找到其中一个时,我们将其切掉,计算它的面积(简单易懂,这里不会解释公式)并制作一个边少的新多边形(相当于切掉这个三角形的多边形)。直到我们只剩下一个三角形。

如何以编程方式实现:

创建一个点数组。运行从点 x、x+1 和 x+2 制作三角形的数组。将每个三角形从一个形状转换为一个区域,并将其与从多边形创建的区域相交。如果得到的交点与原始三角形相同,则所述三角形完全包含在多边形中并且可以被切掉。从数组中删除 x+1 并从 x=0 重新开始。否则,移动到数组中的下一个点 x+1。

此外,如果您希望与地图集成并从地理点开始,则必须从地理点转换为屏幕点。这需要确定地球形状的模型和公式(尽管我们倾向于将地球视为一个球体,但它实际上是一个不规则的卵形(蛋形),带有凹痕。那里有很多模型,请参阅 wiki。

【讨论】:

【参考方案3】:

您可以使用这个包装 GEOS 的库(C 地理空间库本身是 JTS 的一个端口)。 https://github.com/dark-panda/ffi-geos

这个库可以处理坐标空间中的计算并处理近似值。

根据您需要的准确度,我会首先将数据投影到适当的投影(不是墨卡托)。然后计算你的面积

【讨论】:

【参考方案4】:

有一个关于如何乘法顶点的很棒的例子。基本上就是你想做的!

http://www.wikihow.com/Calculate-the-Area-of-a-Polygon

【讨论】:

如果您有经纬度坐标并且想要以平方米为单位的面积,则不会。此外,如果您正在处理球体,则多边形会将球体分成两个区域。你想要哪一个?大陆面积还是海洋面积?【参考方案5】:

为此的一些技术包括积分(将多边形分成纬度条并积分。您也可以投影到平面上并计算该面积。

【讨论】:

@user368937 假设你是一个成功的 ruby​​ 程序员(如果不是,我会从更简单的东西开始),那么最好的方法是分析算法(希望以某种与语言无关的方式)并使用您选择的语言和语法应用相同的算法。这与您在工程中必须解决的任何其他问题确实没有什么不同 - 识别问题,识别潜在解决方案,在您选择的框架中实施解决方案。抱歉含糊其辞,但您要求我们为您编写程序:)。

以上是关于用红宝石计算多边形的面积的主要内容,如果未能解决你的问题,请参考以下文章

改革春风吹满地 HDU - 2036 计算几何-----利用叉积计算多边形的面积

79-多边形的面积-计算几何

c语言 请编写程序让用户输入凸五边形的五个顶点坐标,计算出该凸五边形的面积

ArcGIS怎么分别计算每个重叠的缓冲区与其他多边形的重叠面积?

POJ 3907 Build Your Home | 计算多边形面积

多边形面积公式