【问题标题】:Polygon touches in more than one point with Shapely多边形与 Shapely 接触不止一个点
【发布时间】:2010-12-29 23:28:29
【问题描述】:

我有一个 Python 中的 Shapely 多边形列表。使用.touches() 方法可以轻松找出哪个多边形触摸。但是,只有当多边形共享 more 一个点(换句话说共享一个边界)时,我才需要返回 True 的东西。让我举例说明:

In [1]: from shapely.geometry import Polygon
In [2]: polygons = [Polygon([(0,0),(0,1),(1,1),(1,0)]), Polygon([(1,0),(1,1),(2,1),(2,0)]), Polygon([(2,1),(2,2),(3,2),(3,1)])]

In [3]: polygons[0].touches(polygons[1])
Out[3]: True

In [4]: polygons[0].touches(polygons[2])
Out[4]: False

In [5]: polygons[1].touches(polygons[2])
Out[5]: True

在这种情况下,多边形 0 和 1 共享两个点(整个边界)。多边形 1 和 2 仅共享一个点。我正在寻找的是一个函数,它会给我上面的例子中的TrueFalseFalse,或者只是返回接触点数量的函数,然后我可以自己完成其余的逻辑。

当然,任何不涉及手动迭代所有点的解决方案都是最佳的 - 如果我需要这样做,它有点违背了使用 Shapely 的目的:-)

【问题讨论】:

  • 共享两个点并不等同于共享一个边界 - 只有当点在两个多边形上都相邻时才会如此。
  • @andrew Cooke:好点子。我得考虑一下。

标签: python polygon shapely


【解决方案1】:

如果您真的想检查两个多边形是否共享超过 x 个点,您可以这样做:

p0,p1,p2 = polygons
x = 2
len(set(p1.boundary.coords).intersection(p2.boundary.coords))>=x

但我认为您可能想要确定两条边是否共线(并且重叠)。

Andrew 建议的这种实现可能正是您要寻找的:

>>> type(p0.intersection(p1)) is geometry.LineString
True
>>> type(p1.intersection(p2)) is geometry.LineString
False

【讨论】:

  • 谢谢 :-) 我已经从 Andrew 的帖子中扣除了这一点,但无法回答。不过还是谢谢一堆:-)
  • 仅作记录(可能对其他人有帮助):它应该检查geometry.MultiLineString,而不是geometry.LineString
【解决方案2】:

我没用过shapely,但是你试过看看两个多边形的交点是不是一条线吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多