我有一个多边形作为wkt格式的字符串:
polygon_as_string = 'POLYGON ((1190500.159499999 7144386.067199998, 1190487.2751 7144390.519699998,...,1190500.159499999 7144386.067199998))'
我将其转换为Shapely的Polygon
对象:
import shapely.wkt
polygon = shapely.wkt.loads(polygon_as_string)
然后我用within()
或contains()
函数检查该点是否在多边形中。
from shapely.geometry import Point, Polygon
point = Point(1190500.159499999, 7144386.067199998)
polygon.contains(point)
point.within(polygon)
两个函数都返回False
,尽管我认为这实际上是在polygon
内部。这可能是什么问题?
within
位于对象的外部,并且[至少一个点
其他的[[interior位于对象的如果对象的边界或内部以任何方式相交,则返回interior。相反,当您的点位于边界上时,应使用
object.contains(other)
:True
intersects
。换句话说,如果几何对象具有任何边界,则它们相交
或内部共同点。(重点是我的。)>
可复制的小示例:
intersects
object.intersects(other)
但是请注意,由于精度错误,您确实可能会得到意想不到的结果:True
在这种情况下,您可以考虑如上所述检查到多边形的距离,或者使用>>> from shapely.geometry import Point, Polygon
>>> Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]).contains(Point(1, 1))
False
>>> Point(1, 1).within(Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]))
False
>>> Point(1, 1).intersects(Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]))
True
稍微扩展多边形:
原因可能是您要测试的点正好位于一个顶点的顶部,并且由于舍入误差,该点实际上稍微移动了一点,不再位于多边形的边缘上。
要检查该假设,请尝试将测试点移至多边形中心一点。
within
位于对象的外部,并且[至少一个点
其他的[[interior位于对象的如果对象的边界或内部以任何方式相交,则返回interior。相反,当您的点位于边界上时,应使用
object.contains(other)
:True
intersects
。换句话说,如果几何对象具有任何边界,则它们相交
或内部共同点。(重点是我的。)>
可复制的小示例:
intersects
object.intersects(other)
但是请注意,由于精度错误,您确实可能会得到意想不到的结果:True
在这种情况下,您可以考虑如上所述检查到多边形的距离,或者使用>>> from shapely.geometry import Point, Polygon
>>> Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]).contains(Point(1, 1))
False
>>> Point(1, 1).within(Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]))
False
>>> Point(1, 1).intersects(Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]))
True
稍微扩展多边形: