确定 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 多边形点在地理位置上不准确

从 Shapely 中的多边形中提取点/坐标

用 shapely 从 Coordinate-Tuple-List 创建点

在Shapely中查找路径起点的坐标距离

如何处理 Shapely 中的舍入误差

如何使用Python镜像多边形?