用红宝石计算多边形的面积
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 计算几何-----利用叉积计算多边形的面积
c语言 请编写程序让用户输入凸五边形的五个顶点坐标,计算出该凸五边形的面积
ArcGIS怎么分别计算每个重叠的缓冲区与其他多边形的重叠面积?