【问题标题】:Removing duplicate geometries in Shapely在 Shapely 中删除重复的几何图形
【发布时间】:2015-07-25 03:31:54
【问题描述】:

我有一个 Shapely 多边形列表。从该列表中,我只想提取唯一的多边形来删除重复项。

如何以更快的方式做到这一点? (我的列表包含数千个多边形)

from shapely.geometry import Polygon

lists = [[(1,1),(2,2),(3,3),(4,4)], [(6,6),(7,7),(8,8),(9,9)], [(1,1),(2,2),(3,3),(4,4)]]
polys = [Polygon(item) for item in lists] ##This is given condition

for poly in polys:

    test = [p.intersects(poly) for p in polys] ##Return true or false
    print test


[True, False, True]
[False, True, False]
[True, False, True]

预期结果是:

[[(1,1),(2,2),(3,3),(4,4)], [(6,6),(7,7),(8,8),(9,9)]]

【问题讨论】:

  • 为什么使用intersects?你不应该使用p.equals(poly) 来查找重复的几何图形吗?

标签: python duplicates geometry shapely


【解决方案1】:

请注意,您不应使用intersects(),因为这会将任何完全重叠的多边形识别为重复。请改用equals()

您可以创建一个存储唯一多边形的列表,然后对于列表中的每个多边形,循环存储在外部列表中的多边形,如果它们都不等于新的多边形,则将其添加到列表中,你可以使用any()函数。

例子:

from shapely.geometry import Polygon

lists = [[(1,1),(2,2),(3,3),(4,4)], [(6,6),(7,7),(8,8),(9,9)], [(1,1),(2,2),(3,3),(4,4)]]
polys = [Polygon(item) for item in lists] ##This is given condition
uniqpolies = []
for poly in polys:

    if not any(p.equals(poly) for p in uniqpolies):
        uniqpolies.append(poly)

来自documentation on any()

如果可迭代的任何元素为真,则返回 True。如果可迭代对象为空,则返回False

【讨论】:

  • 是否也可以不收集列表直接返回结果?
  • 如果没有其他列表,您将不得不自己遍历它们。它是正确的 - for p in uniqpoies .
  • 请注意,您不应使用 intersects(),因为这会将任何完全重叠的多边形识别为重复。正如上面的@Mike T 建议的那样,使用equals()。
猜你喜欢
  • 2018-08-26
  • 2019-12-31
  • 2014-08-16
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2018-10-30
  • 1970-01-01
相关资源
最近更新 更多