Python Shapely.contains()方法,但是否包含边界?
我正在处理Shapely多边形,我需要一种删除较大多边形中所有较小多边形的方法。我尝试使用Shapely提供的Python Shapely.contains()方法,但是否包含边界?,python,shapely,Python,Shapely,我正在处理Shapely多边形,我需要一种删除较大多边形中所有较小多边形的方法。我尝试使用Shapely提供的.contains()方法,但如果较小的多边形不完全在较大的多边形内,则该方法不会返回True 基本上,我想要一个像.contains()这样的方法,但如果多边形位于外部多边形的边界上,它将返回True,如图所示 以下是以wkt格式呈现的图片中的多边形: 绿色的: POLYGON Z ((14.4265764858233823 45.3396418051734784 0.0000000
.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
。要获取所有数字,请使用withtrim=False
参数并将它们添加到问题中?因此,它将是:来自shapely import wkt;wkt.dumps(polygon,trim=False)
我添加了wkt.dumps的输出。是的,我刚用了polygon.wkt。(我对使用shapely不太有经验)。感谢您提供的信息。您提供的第一个解决方案就可以解决这个问题。谢谢第二个解决方案确实有效,但我不确定它是否有时会返回True
用于更大多边形附近的多边形。至于第三个解决方案,它在我的例子中不起作用,因为它返回True
,用于靠近较大多边形的外部多边形,这在我的例子中是不需要的。@kfilipcic查看