【问题标题】:Finding points of a cascaded union of polygons in python在python中查找级联多边形的点
【发布时间】:2015-05-02 12:28:27
【问题描述】:

我正在尝试在 Python 中找到靠近的点并删除某些形状数据(坐标)的重复点。我将坐标节点命名为 1,2,3.. 等等,我使用 shapely 包并在节点点 1,2,3.. 周围创建多边形

polygons = [Point([nodes[i]).buffer(1) for i in range(len(nodes))]

并找到我使用的级联

cascade = cascaded_union(多边形)

返回的级联是一个多面体并且列出了许多坐标,我想确切地知道我的节点中的哪些点是级联的(基于 1 的缓冲区值),以便我可以将它们替换为新节点。我怎么知道这个??

【问题讨论】:

  • 据我从文档中了解到,级联并集是所有输入多边形的并集,因此将包括所有输入点。我错过了什么吗?

标签: python gis shapefile shapely


【解决方案1】:

与其使用 cascaded_union 方法,不如编写自己的方法来检查任何两个多边形是否相交可能更容易。如果我理解您想要正确执行的操作,您需要确定两个多边形是否重叠,然后删除其中一个并相应地编辑另一个。

你可以这样(不是最好的解决方案,我会解释原因):

def clean_closely_lying_points(nodes):
    polygons = [Point([nodes[i]).buffer(1) for i in range(len(nodes))]
    for i in range(len(polygons) - 1):
        if polygons[i] is None:
            continue
        for j in range(i + 1, len(polygons)):
            if polygons[j] is None:
                continue
            if polygons[i].intersects(polygons[j]):
                polygons[j] = None
                nodes[j] = None
                # now overwrite 'i' so that it's whatever you want it to be, based on the fact that polygons[i] and polygons[j] intersect
                polygons[i] = 
                nodes[i] = 

但是,总的来说,我觉得多边形的创建非常耗时且没有必要。同时更新多边形列表和节点列表也很乏味。相反,您可以只使用节点本身,并使用 shapely 的距离方法来检查两个点是否在 2 个单位内。 这在数学上应该是等价的,因为两个半径均为 1 的圆之间的交点意味着它们的中心点至多相距 2。在这种情况下,您的 for 循环将采用类似的结构,只是它们会遍历节点。

def clean_closely_lying_points(nodes):
    point_nodes = [Point(node) for node in nodes]  # Cast each of the nodes (which I assume are in tuple form like (x,y), to shapely Points)
    for i in range(len(point_nodes) - 1):
        if point_nodes[i] is None:
            continue
        for j in range(i + 1, len(point_nodes)):
            if point_nodes[j] is None:
                continue
            if point_nodes[i].distance(point_nodes[j]) < 2:
                point_nodes[j] = None
                point_nodes[i] = # Whatever you want point_nodes[i] to be now that you know that point_nodes[j] was within a distance of 2 (could remain itself)
     return [node for node in point_nodes if node is not None]

此方法的结果将是一个形状匀称的点对象列表,并消除了靠近的点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2015-06-01
    • 2018-01-23
    • 2021-07-20
    • 1970-01-01
    • 2013-04-23
    • 2013-07-18
    相关资源
    最近更新 更多