Python Shapely.contains()方法,但是否包含边界?

Python Shapely.contains()方法,但是否包含边界?,python,shapely,Python,Shapely,我正在处理Shapely多边形,我需要一种删除较大多边形中所有较小多边形的方法。我尝试使用Shapely提供的.contains()方法,但如果较小的多边形不完全在较大的多边形内,则该方法不会返回True 基本上,我想要一个像.contains()这样的方法,但如果多边形位于外部多边形的边界上,它将返回True,如图所示 以下是以wkt格式呈现的图片中的多边形: 绿色的: POLYGON Z ((14.4265764858233823 45.3396418051734784 0.0000000

我正在处理Shapely多边形,我需要一种删除较大多边形中所有较小多边形的方法。我尝试使用Shapely提供的
.contains()
方法,但如果较小的多边形不完全在较大的多边形内,则该方法不会返回
True

基本上,我想要一个像
.contains()
这样的方法,但如果多边形位于外部多边形的边界上,它将返回
True
,如图所示

以下是以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
,这些多边形具有一些我不想要的公共边界

我希望你能理解我的需求,如果有人知道解决方案,我也很感激。

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

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

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

例如,在这里,我绘制了多边形并放大了左上交点:

import matplotlib.pyplot as plt

plt.plot(*green.exterior.xy, c='g')
plt.plot(*red.exterior.xy, c='r')
您可以看到,这些线并不是完美地相互重叠:

有几种方法可以解决这个问题。例如,第一个建议是在一些国家提出的:

  • 缩小较小的多边形或稍微延伸较大的多边形:

    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
    
    小差异(大)。面积<1e-14
    #真的
    
  • 检查较小多边形的每个顶点到较大多边形的距离是否接近零:

    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
    
    从shapely.geometry导入点
    顶点=贴图(点、小.外部.坐标)
    距离=贴图(大距离、顶点)
    全部(距离小于1e-14表示距离单位)
    #真的
    

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

    包含的
    应该正常工作。例如,创建两个简单的方形多边形,一个在另一个内部,共享一个边,以查看其是否工作。在您的情况下,可能存在精度问题。你能提供两个多边形的定义吗,这样我们就可以重现这个问题了?我在问题中添加了wkt多边形字符串。我想关于多边形的信息足够了吧?精度可能会有问题,但我需要这种特殊的精度。另外,感谢您和@eyllanesc的回复和编辑。这是我在这里的第一个问题,所以我不太确定我在做什么。您提供的wkt格式的示例多边形实际上是修剪过的,并且没有显示所有的数字(您可能刚刚做了
    polygon.wkt
    ,对吧?)。因为如果我加载它们并使用
    green.contains(red)
    ,它将显示
    True
    。要获取所有数字,请使用with
    trim=False
    参数并将它们添加到问题中?因此,它将是:
    来自shapely import wkt;wkt.dumps(polygon,trim=False)
    我添加了wkt.dumps的输出。是的,我刚用了polygon.wkt。(我对使用shapely不太有经验)。感谢您提供的信息。您提供的第一个解决方案就可以解决这个问题。谢谢第二个解决方案确实有效,但我不确定它是否有时会返回
    True
    用于更大多边形附近的多边形。至于第三个解决方案,它在我的例子中不起作用,因为它返回
    True
    ,用于靠近较大多边形的外部多边形,这在我的例子中是不需要的。@kfilipcic查看