检查多边形是否包含Shapely中的多点会返回意外结果



你能解释Shapelycontains方法的行为吗?为什么第一个结果低于False,而第二个结果是True

from shapely.geometry import Polygon, Point, MultiPoint
poly = Polygon([[0,0], [2, 0], [2, 2], [0, 2]])
poly.contains(MultiPoint([Point(2,2)]))
Out[3]: False
poly.contains(MultiPoint([Point(2,2), Point(1,1)]))
Out[4]: True
poly.contains(MultiPoint([Point(2,2), Point(1,1), Point(3,3)]))
Out[5]: False

引用object.contains(other):上的文档

如果other的任何点都不位于object的外部,并且other的内部至少有一个点位于object的内部,则返回True

所以,事实上,一切都按预期进行。

1( 检查poly.contains(MultiPoint([Point(2,2)]))时,点不在poly的内部,而是在其边界上。因此它返回CCD_ 12。

2( 检查poly.contains(MultiPoint([Point(2,2), Point(1,1)]))时,MultiPoint对象的任何点都不位于poly的外部,只有一个点位于其内部。这满足了给定的条件。

3( 对于poly.contains(MultiPoint([Point(2,2), Point(1,1), Point(3,3)]))的情况,有一个点位于poly的外部,因此是False


p.S.:你在评论中写道:

关于2(点Point(2,2)位于多边形的外部,即poly.exterior.contains(Point(2,2))返回True

多边形的exterior属性实际上意味着多边形的外部LinearRing。并且它不等于外部点集。Polygon上的文档显示:

通过exteriorinteriors属性访问组件环。

内部、边界和外部点集的定义如下:

曲面有一个由内部无限多个点组成的内部集(想象一条曲线在空间中拖动以覆盖一个区域(,一个由一条或多条曲线组成的边界集,以及一个由所有其他点组成的外部集,包括曲面中可能存在的孔内的点。

最新更新