gpt4 book ai didi

python - 匀称的 .contains() 方法但包括边界?

转载 作者:行者123 更新时间:2023-12-04 00:25:57 40 4
gpt4 key购买 nike

我正在使用 Shapely 多边形,我需要一种方法来删除较大多边形中包含的所有较小多边形。我尝试使用 .contains() Shapely 提供的方法,但该方法不返回 True如果给定的较小多边形不完全位于较大的“父”多边形内。
基本上,我想要一个像 .contains() 这样的方法但它返回 True如果内部多边形与外部多边形共享边界,如下图示例所示。
here .
以下是以 wkt 格式呈现的图片中的多边形:
绿色的:

POLYGON Z ((14.4265764858233823 45.3396418051734784 0.0000000000000000, 14.4267228266679606 45.3395430970275015 0.0000000000000000, 14.4266753563381904 45.3394727193694536 0.0000000000000000, 14.4265290154936121 45.3395714275154376 0.0000000000000000, 14.4265764858233823 45.3396418051734784 0.0000000000000000))`  
红色的:
POLYGON Z ((14.4265450394689161 45.3395951840357725 0.0000000000000000, 14.4265695507109317 45.3395786509942837 0.0000000000000000, 14.4265802185605700 45.3395944667317679 0.0000000000000000, 14.4265982245953417 45.3395823215079616 0.0000000000000000, 14.4265715327703994 45.3395427492501426 0.0000000000000000, 14.4265290154936121 45.3395714275154376 0.0000000000000000, 14.4265450394689161 45.3395951840357725 0.0000000000000000))
我也尝试使用 .intersects()方法,但它返回 True对于给定多边形之外的多边形,这些多边形具有一些我不想要的共同边界。
我希望您了解我的需求,如果有人知道解决方案,我将不胜感激。

最佳答案

通常 contains 当测试一个多边形是否在另一个多边形内并且它们具有共同的边界时,该方法应该起作用。例如,如果您采用以下简单示例,它将按预期工作:

from shapely.geometry import Polygon

a = Polygon([(0, 0), (2, 0), (2, 2), (0, 2)])
b = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
a.contains(b)
# True

enter image description here

但经常发生的情况是,由于精度误差,内部多边形仅从外部出现一点点,测试失败。

例如,在这里,我绘制了您的多边形并放大了左上角的交点:
import matplotlib.pyplot as plt

plt.plot(*green.exterior.xy, c='g')
plt.plot(*red.exterior.xy, c='r')

您可以看到线条并不完美地相互重叠:

enter image description here

有几种方法可以解决这个问题。例如,第一个是在 How to deal with rounding errors in Shapely 中提出的。在一些 Shapely issues on GitHub :
  • 缩小较小的多边形或扩展较大的多边形:
    big.contains(small.buffer(-1e-14))
    # True
    big.buffer(1e-14).contains(small)
    # True
  • 检查位于较大多边形之外的较小多边形的面积是否接近于零:
    small.difference(big).area < 1e-14
    # True
  • 检查较小多边形的每个顶点到较大多边形的距离是否接近于零:
    from shapely.geometry import Point

    vertices = map(Point, small.exterior.coords)
    distances = map(big.distance, vertices)
    all(distance < 1e-14 for distance in distances)
    # True

  • 可能有更多的方法来执行测试,但我认为这些就足够了。

    关于python - 匀称的 .contains() 方法但包括边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56913408/

    40 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com