用于地理空间点搜索的 kdtree

Posted

技术标签:

【中文标题】用于地理空间点搜索的 kdtree【英文标题】:kdtree for geospatial point search 【发布时间】:2015-01-12 01:40:24 【问题描述】:

我正在尝试使用我可用的经纬度信息为点几何找到最近的邻居。经过大量搜索后,我得出结论,使用基于 kd-tree 的方法将是最佳选择。到目前为止,我已经用 kd-tree 尝试了三种不同的方法,但都没有奏效。

    使用墨卡托 (UTM) 投影。这是最没用的,因为距离计算结果完全错误,特别是因为这些点遍布全球。

    使用经纬度坐标系统本身。 KdTree 在 lat 和 long 之间交替用于分割平面。这有一个固有的问题,因为纬度是平行的,因此等距,但经度不是。因此计算与分裂平面的距离是纬度的函数。但是根据定义,分裂平面只带有一个维度——它在其上分裂的那个维度。

    通过将 lat-long 转换为 xyz 来使用笛卡尔坐标。笛卡尔坐标不会产生与使用 lat-longs 计算的距离相同的最近邻。在 xyz 平面上距离较近的点在 lat-long 平面上距离较远,反之亦然。

有没有人知道解决这个问题的另一种方法和一种有效的方法?非常感谢!

编辑:我对第三种方法有误。它实际上工作得很好。

【问题讨论】:

其实这是一个非常有趣的问题。我已经实现了 kd-trees,但仅适用于单个国家的投影坐标。您关于纬度/经度在任何地方(赤道除外)都不相等的观点是一个很好的观点。 【参考方案1】:

我已经成功实现了墨卡托投影和四键。将 x 和 y 坐标转换为二进制并交错。然后将其视为以 4 为底的数字。

【讨论】:

以上是关于用于地理空间点搜索的 kdtree的主要内容,如果未能解决你的问题,请参考以下文章

PCL学习总结KdTree搜索

数组索引的kdtree建立及简明快速的k近邻搜索方法

KdTree && Octree 原理学习对比以及可视化分析--"索引树"

bzoj2648SJY摆棋子(kdtree)

如何在普通mysql中进行地理空间搜索

Apache点燃地理空间查询示例