Python:找到一种计算多边形“内质心”(X,Y)的方法

Posted

技术标签:

【中文标题】Python:找到一种计算多边形“内质心”(X,Y)的方法【英文标题】:Python: find a method to calculate the "inner centroid" (X,Y) of a polygon 【发布时间】:2012-12-06 13:28:12 【问题描述】:

我有一个多边形(转换为Shapely 对象)。我的目标是按照图形示例计算“内部质心”(也称为“表面上的点”)(返回 x,y 值)和“质心”(返回 x,y 值):

from shapely.geometry import Polygon

ref_polygon = Polygon(points)
# get the x and y coordinate of the centroid
ref_polygon.centroid.wkt
'POINT (558768.9293489187300000 6361851.0362532493000000)'

我的问题是一些程序员已经在 Python 中开发了一个函数来计算内部质心,或者知道一些模块可以做到这一点。

提前致谢

使用的点(多边形的顶点)是:

points = [(560036.4495758876, 6362071.890493258),
          (560036.4495758876, 6362070.890493258),
          (560036.9495758876, 6362070.890493258),
          (560036.9495758876, 6362070.390493258),
          (560037.4495758876, 6362070.390493258),
          (560037.4495758876, 6362064.890493258),
          (560036.4495758876, 6362064.890493258),
          (560036.4495758876, 6362063.390493258),
          (560035.4495758876, 6362063.390493258),
          (560035.4495758876, 6362062.390493258),
          (560034.9495758876, 6362062.390493258),
          (560034.9495758876, 6362061.390493258),
          (560032.9495758876, 6362061.390493258),
          (560032.9495758876, 6362061.890493258),
          (560030.4495758876, 6362061.890493258),
          (560030.4495758876, 6362061.390493258),
          (560029.9495758876, 6362061.390493258),
          (560029.9495758876, 6362060.390493258),
          (560029.4495758876, 6362060.390493258),
          (560029.4495758876, 6362059.890493258),
          (560028.9495758876, 6362059.890493258),
          (560028.9495758876, 6362059.390493258),
          (560028.4495758876, 6362059.390493258),
          (560028.4495758876, 6362058.890493258),
          (560027.4495758876, 6362058.890493258),
          (560027.4495758876, 6362058.390493258),
          (560026.9495758876, 6362058.390493258),
          (560026.9495758876, 6362057.890493258),
          (560025.4495758876, 6362057.890493258),
          (560025.4495758876, 6362057.390493258),
          (560023.4495758876, 6362057.390493258),
          (560023.4495758876, 6362060.390493258),
          (560023.9495758876, 6362060.390493258),
          (560023.9495758876, 6362061.890493258),
          (560024.4495758876, 6362061.890493258),
          (560024.4495758876, 6362063.390493258),
          (560024.9495758876, 6362063.390493258),
          (560024.9495758876, 6362064.390493258),
          (560025.4495758876, 6362064.390493258),
          (560025.4495758876, 6362065.390493258),
          (560025.9495758876, 6362065.390493258),
          (560025.9495758876, 6362065.890493258),
          (560026.4495758876, 6362065.890493258),
          (560026.4495758876, 6362066.890493258),
          (560026.9495758876, 6362066.890493258),
          (560026.9495758876, 6362068.390493258),
          (560027.4495758876, 6362068.390493258),
          (560027.4495758876, 6362068.890493258),
          (560027.9495758876, 6362068.890493258),
          (560027.9495758876, 6362069.390493258),
          (560028.4495758876, 6362069.390493258),
          (560028.4495758876, 6362069.890493258),
          (560033.4495758876, 6362069.890493258),
          (560033.4495758876, 6362070.390493258),
          (560033.9495758876, 6362070.390493258),
          (560033.9495758876, 6362070.890493258),
          (560034.4495758876, 6362070.890493258),
          (560034.4495758876, 6362071.390493258),
          (560034.9495758876, 6362071.390493258),
          (560034.9495758876, 6362071.890493258),
          (560036.4495758876, 6362071.890493258)]

【问题讨论】:

对不起Sheena,我添加了问题 你有“内质心”的定义吗? 亲爱的@Chronial。老实说,我没有找到“内质心”的官方定义。我正在关注这个例子georeference.org/forum/t37396 如果您不确定它是什么,为什么需要它? :) 不确定这是否能回答您的问题,但 GRASS 的 v.centroids 正是这样做的。除非你已经在草地上工作,否则打包他们的代码会很麻烦。 【参考方案1】:

“内部质心”一词在计算几何中不是一个定义明确的术语,但从您的帖子中可以清楚地看出您想要计算一个位于多边形内部的点(在它和附近边缘之间有一些边距),并且相当接近真实的质心。

您可以尝试以下几个想法:

算法A

    生成多边形的所有内对角线。

    对于每个内部对角线,考虑中点,并根据它与最近边的距离以及与质心的距离为其打分。

    选择得分最高的中点。

多边形的内部对角线是连接两个完全位于多边形内的不相邻顶点的线。具有 n 个顶点的多边形的 m 个内部对角线集可以在 O(m + n log log n) 使用相当复杂的算法due to Hershberger,或者在 O(n2) 中使用更直接的算法。

算法 B

    对多边形进行三角剖分。

    对于三角剖分中的每个三角形,考虑三角形的质心(或者可能是incenter?),并根据它与最近边的距离以及距离的距离为它打分多边形的质心。

    选择得分最高的三角形中心。

具有 n 个顶点的简单多边形可以使用基于分解为单调多边形due to Chazelle 的算法在 O(n) 或 O(n2) 使用更简单的方法,例如“ear clipping”。

【讨论】:

亲爱的 Gareth, 感谢您的重播和建议。在此链接gis.stackexchange.com/questions/11200/… 中,您可以阅读(ArcGIS 软件的)“内质心”算法似乎表明它是一个黑盒子。 亲爱的@Gareth。您知道用于三角剖分多边形的内置模块吗? Python 没有内置几何代码。但是poly2tri 库有一个 Python 接口。

以上是关于Python:找到一种计算多边形“内质心”(X,Y)的方法的主要内容,如果未能解决你的问题,请参考以下文章

matlab计算多边形面积polyarea函数

在arcgis中如何生成一个凹多边形或面域的形心?

计算几何常用的函数/方法

java计算四边形中心点和两条线段交点算法

计算几何线,点,多边形,位置关系较全模板

多边形的布尔运算