2

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

5 回答 5

3

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

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)
于 2011-02-08T19:17:35.137 回答
3

语言无关的解决方案:

给定:多边形总是由不重叠的 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。

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

于 2011-08-21T14:41:44.620 回答
2

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

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

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

于 2011-02-28T00:45:13.927 回答
0

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

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

于 2011-02-08T19:19:56.180 回答
0

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

于 2011-02-08T19:50:04.793 回答