Python Shapely - 检查线是否包含点
Python Shapely - Checking if line contains a point
我在使用 Shapely 库检查 LineString
是否包含因与 Polygon
相交而产生的 Point
时遇到问题。
示例代码:
l = LineString([(5.653154885795476, 6.418676641285647), (6.132921674075812, 5.995573963137367)])
o = LineString([(5, 7.5), (6, 6)])
p = l.intersection(o)
# --> p = Point(5.817513045918756, 6.273730431121867)
但是当 运行 l.intersects(p)
或 l.contains(p)
或 l.touches(p)
时,我总是得到 False
,这没有多大意义,因为 p
是相交的结果。
我阅读了有关浮点不精确的信息,在进行上述检查之前添加了以下代码段:
ll = list(line.coords)
for i, v in enumerate(ll):
ll[i] = Point(np.round(np.array(v), 4))
l = LineString(ll)
p = Point(np.round(np.array(p), 4))
但无济于事。
我需要这个来检查 LineString
的哪一部分与该点相交;这是错的吗?有更好的方法吗?
你说的对,是浮点精度问题。您可以使用此解决方法:
from shapely.geometry import LineString
l = LineString([(5.653154885795476, 6.418676641285647), (6.132921674075812, 5.995573963137367)])
o = LineString([(5, 7.5), (6, 6)])
p = l.intersection(o)
print(l.distance(p)<1e-8)
print(o.distance(p)<1e-8)
输出:
True
True
我在使用 Shapely 库检查 LineString
是否包含因与 Polygon
相交而产生的 Point
时遇到问题。
示例代码:
l = LineString([(5.653154885795476, 6.418676641285647), (6.132921674075812, 5.995573963137367)])
o = LineString([(5, 7.5), (6, 6)])
p = l.intersection(o)
# --> p = Point(5.817513045918756, 6.273730431121867)
但是当 运行 l.intersects(p)
或 l.contains(p)
或 l.touches(p)
时,我总是得到 False
,这没有多大意义,因为 p
是相交的结果。
我阅读了有关浮点不精确的信息,在进行上述检查之前添加了以下代码段:
ll = list(line.coords)
for i, v in enumerate(ll):
ll[i] = Point(np.round(np.array(v), 4))
l = LineString(ll)
p = Point(np.round(np.array(p), 4))
但无济于事。
我需要这个来检查 LineString
的哪一部分与该点相交;这是错的吗?有更好的方法吗?
你说的对,是浮点精度问题。您可以使用此解决方法:
from shapely.geometry import LineString
l = LineString([(5.653154885795476, 6.418676641285647), (6.132921674075812, 5.995573963137367)])
o = LineString([(5, 7.5), (6, 6)])
p = l.intersection(o)
print(l.distance(p)<1e-8)
print(o.distance(p)<1e-8)
输出:
True
True