ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-29 09:59:09  阅读:1502  来源: 互联网

标签:shapefile python geometry geolocation


我有一个多边形(在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)]

解决方法:

术语“内部质心”在计算几何中并不是一个定义明确的术语,但从你的帖子中可以清楚地看出,你想要计算一个完全在多边形内部的点(在它和它附近的边缘之间有一些边界),以及这与真正的质心相当接近.

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

算法A.

>生成多边形的所有内部对角线.
>对于每个内部对角线,考虑中点,并根据距离最近边缘的距离以及它与质心的接近程度给出一个分数.
>选择得分最高的中点.

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

算法B.

>三角形多边形.
>对于三角剖分中的每个三角形,考虑三角形的质心(或者可能是incenter?),并根据距离最近边缘的距离以及它与多边形质心的距离给出一个分数.
>选择得分最高的三角形中心.

具有n个顶点的简单多边形可以使用基于分解为单调多边形due to Chazelle的算法在O(n)中进行三角剖分,或者使用诸如“ear clipping”的更简单的方法在O(n2)中进行三角剖分.

标签:shapefile,python,geometry,geolocation
来源: https://codeday.me/bug/20190729/1570069.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有