计算ruby中多边形的面积

我有一组代表多边形的纬度/经度坐标对。 我正在尝试确定该多边形内的总面积。 我将如何在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]] 

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

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

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

语言独立解决方案

GIVEN:多边形总是可以由不重叠的n-2个三角形组成(n =点数或边数)。 1个三角形= 3个边多边形= 1个三角形; 1平方= 4边多边形= 2个三角形; 等令人厌恶的QED

因此,可以通过“切掉”三角形来减少多边形,并且总面积将是这些三角形的面积之和。 尝试使用一张纸和一把剪刀,最好是在跟随之前将过程可视化。

如果您在多边形路径中连续3个点并使用这些点创建三角形,则您将只有三个可能的场景之一:

  1. 结果三角形完全在原始多边形内
  2. 结果三角形完全在原始多边形之外
  3. 结果三角形部分包含在原始多边形中

我们只对第一个选项(完全包含)中的情况感兴趣。

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

如何以编程方式实现:

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

另外,如果您希望与mappping集成并从geopoints开始,则必须从geopoints转换为screenpoints。 这需要决定地球形状的建模和公式(虽然我们倾向于认为地球是一个球体,它实际上是一个不规则的卵形(egghape),有凹痕。有很多模型,为了进一步的信息维基。

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

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) 

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

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

一些技术包括集成(将多边形划分为纬度条并进行积分。您还可以投影到平面上并计算该区域。