为每个点找到最近线段的高效算法

Efficient algorithm to find closest line segments for each point

给定一个多边形细分 S 和一组点 P,为每个点找到 S 中最近的线段(二维 space)。
在我的设置中,我有数十万个段和几千个点。

检查每一行的每一点会花费太长时间。有没有有效的算法?

我正在考虑多种选择,但无法确定哪个是最好的。

  1. 构建一个梯形图并查询每个点所在的面。然后遍历面的边缘(在细分中)找到最近的线。
  2. 构建范围树或线段树。查询围绕该点的一个框,并在其中找到最近的线段。框中必须有一个段才能找到任何内容。
  3. 构建线段维诺图。每个面都描述了最近的线段,但我不知道如何进行点查询,因为边可以是抛物线弧。

解决这个问题的高级方法是什么?

Nearest Neighbor in Postgis

Postgis 的方法是使用具有自定义搜索算法的 R 树。在像常规查询一样沿着树向下移动时,它们会跟踪到它们在树中遇到的边界区域中的对象的最小和最大距离。树的每个遇到的分支都被添加到活动分支列表 (ABL),使用距离度量对其进行修剪。

他们在 ABL 中选择一个分支的边界区域并递归地应用该算法。在叶子(像线段这样的对象)处,它更新变量 nearest。从递归返回时,他们应用 nearest 变量对 ABL 进行更多修剪,重复直到 ABL 为空。

理论上最坏的情况是每个查询是线性的,但在实践中有更好的结果。