使用Python减少多边形中的节点数 [英] Reducing number of nodes in polygons using Python
本文介绍了使用Python减少多边形中的节点数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个包含几个连续多边形的shapefile,我希望减少它们的节点数,以保持相邻多边形在拓扑上的一致性。 我在考虑根据节点两边两个线段所产生的角度来删除节点;特别是删除形成角度<;180º和>175º的节点。
我看到一条评论提到了同样的想法,但我对编码有非常基本的了解。如何在Python中实现此功能?
https://stackoverflow.com/a/2624475/8435715
推荐答案
下面是一个示例,说明如何根据两个条件执行此操作-顶点之间的距离和上面描述的角度:
import numpy as np
def reduce_polygon(polygon, angle_th=0, distance_th=0):
angle_th_rad = np.deg2rad(angle_th)
points_removed = [0]
while len(points_removed):
points_removed = list()
for i in range(0, len(polygon)-2, 2):
v01 = polygon[i-1] - polygon[i]
v12 = polygon[i] - polygon[i+1]
d01 = np.linalg.norm(v01)
d12 = np.linalg.norm(v12)
if d01 < distance_th and d12 < distance_th:
points_removed.append(i)
continue
angle = np.arccos(np.sum(v01*v12) / (d01 * d12))
if angle < angle_th_rad:
points_removed.append(i)
polygon = np.delete(polygon, points_removed, axis=0)
return polygon
示例:
from matplotlib import pyplot as plt
from time import time
tic = time()
reduced_polygon = reduce_polygon(original_polygon, angle_th=5, distance_th=4)
toc = time()
plt.figure()
plt.scatter(original_polygon[:, 0], original_polygon[:, 1], c='r', marker='o', s=2)
plt.scatter(reduced_polygon[:, 0], reduced_polygon[:, 1], c='b', marker='x', s=20)
plt.plot(reduced_polygon[:, 0], reduced_polygon[:, 1], c='black', linewidth=1)
plt.show()
print(f'original_polygon length: {len(original_polygon)}
',
f'reduced_polygon length: {len(reduced_polygon)}
'
f'running time: {round(toc - tic, 4)} secends')
产生以下结果:
这篇关于使用Python减少多边形中的节点数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文