【问题标题】:Reducing number of nodes in polygons using Python使用 Python 减少多边形中的节点数
【发布时间】:2018-02-01 12:24:48
【问题描述】:

我有一个包含多个连续多边形的 shapefile,我想减少它们的节点数,以保持相邻多边形的拓扑一致。 我正在考虑根据节点两侧的 2 段产生的角度删除节点;特别是删除形成角度 175º 的节点。

我看到一个评论提到了同样的想法,但我对编码有非常基本的了解。这如何在 Python 中实现?

https://stackoverflow.com/a/2624475/8435715

【问题讨论】:

  • 欢迎来到 SO。请向我们展示您的代码 sn-p。
  • 您是要算法还是要实际代码?恕我直言,您已经定义了您的算法,并且 SO 不是代码编写服务。所以我不明白,你的问题是什么。
  • 我明白,对不起,我不熟悉这个论坛,而且我的编码知识太基础了,无法实现我的算法。我会再次询问我何时可以设法编写代码。谢谢

标签: algorithm python-2.7 nodes polygon level-of-detail


【解决方案1】:

下面是一个示例,说明如何根据两个标准执行此操作 - 顶点之间的距离和您上面描述的角度:

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)}\n', 
      f'reduced_polygon length: {len(reduced_polygon)}\n'
      f'running time: {round(toc - tic, 4)} secends')

产生以下结果:

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2018-04-08
    相关资源
    最近更新 更多