确定 Shapely 点是不是在 LineString/MultiLineString 内
Posted
技术标签:
【中文标题】确定 Shapely 点是不是在 LineString/MultiLineString 内【英文标题】:Determine if Shapely point is within a LineString/MultiLineString确定 Shapely 点是否在 LineString/MultiLineString 内 【发布时间】:2014-02-13 00:43:25 【问题描述】:我正在尝试使用 Shapely 的 within
函数对 LineString 和 Point 文件进行“空间连接”(仅供参考,点文件是使用 LineString
上的 interpolate
函数生成的)。问题是 - 没有返回任何内容。
# this condition is never satisfied
if point.within(line):
# here I write stuff to a file
地点:
point = POINT (-9763788.9782693591000000 5488878.3678984242000000)
line = LINESTRING (-9765787.998118492 5488940.974948905, -9748582.801636808 5488402.127570709)
我错过了什么?
【问题讨论】:
【参考方案1】:在直线上查找点时会出现浮点精度错误。改为使用具有适当阈值的距离。
from shapely.geometry import Point, LineString
line = LineString([(-9765787.9981184918, 5488940.9749489054), (-9748582.8016368076, 5488402.1275707092)])
point = Point(-9763788.9782693591, 5488878.3678984242)
line.within(point) # False
line.distance(point) # 7.765244949417793e-11
line.distance(point) < 1e-8 # True
【讨论】:
嗨。我们如何选择合适的阈值呢?我面临同样的问题,只有当我选择 1e-4 时它才对我有用。我们应该根据什么来选择它?我正在使用 wgs84 纬度长点 我的意思是对于某些行,line.distance(point) 在我使用 @ds_user 这真的取决于你如何获得数据,或者它代表什么分辨率(例如,参见decimal degrees)。您需要检查 GIS 中的未投影数据才能了解您的情况。 实际上我正在尝试查找地址的道路名称。我有两个数据集,一个是地址的地理点,另一个是道路的线串。我需要根据最接近我的地址点的线串来获取道路名称。我对此有一个关于 GIS 堆栈交换的问题。 不应该这样。shapely
应该自己处理精度错误,而不是让用户担心这一点。 python 应该是一种高级语言,它从用户那里抽象出机器精度。此外,这使得 inside 和 contains 方法对于 shapely
中的线串和点毫无用处@以上是关于确定 Shapely 点是不是在 LineString/MultiLineString 内的主要内容,如果未能解决你的问题,请参考以下文章
shapely 和 matplotlib 多边形点在地理位置上不准确