有效地从另一个点找到最近点

时间:2017-04-11 19:56:39

标签: algorithm apache-spark geolocation haversine bigdata

我有一个坐标列表A(坐标,十进制形式的长度)和~10,000点以及第二个相同类型坐标的列表B,其中约有100万个点。

我想在列表B中为列表B中的每个元素找到最接近的点。

我已经做的是创建两个列表的笛卡尔积,并使用半正公式找到所有组合的距离。

然后我得到列表A中的点,列表B中每个点的距离最小。

由于总组合超过100亿,计算距离所用的时间太长。

有没有办法确保列表B中的每个点都与列表A中的点匹配,但也能提高性能?

2 个答案:

答案 0 :(得分:1)

如果您已经创建了交叉产品并计算了所有的半径距离,那么您已经完成了大部分工作,因此我将假设问题是如果您有新的集合A和B该怎么办。

要重复找到A中的最近点,我将构建某种包含A中的点的树结构,并在树的每个节点处存储信息,这些信息相当于包围其所有后代的边界框或等效物。然后,当试图在A中找到最近的点时,您递归搜索包含A的树,当您到达节点时从递归调用返回,并且您可以根据存储在那里的信息计算出它的所有后代都远离目标点比目前为止最接近的比赛。

要使此代码起作用,边界框信息必须准确,但如果树是愚蠢的,它将减慢搜索速度,但不会阻止它们找到正确的答案。这尤其意味着,当你建造树木时,你可以放心地忽略180W = 180E环绕经度的不便习惯。您可以假装lat-long是一个矩形网格并构建一个kd树,您可以组合纬度和经度并对它们进行位交织并在结果上构建一维搜索树,您可以计算https://en.wikipedia.org/wiki/Geohash和基于此建立一个搜索树,或者你可以计算很多的半身像并构建一个https://en.wikipedia.org/wiki/Cover_tree - 所有这些都应该有用,我不知道哪个最好 - 它可能取决于你的数据和你拥有的库可用。

答案 1 :(得分:0)

spatstat包中的nncross函数可用于查找来自两个不同数据集的点的距离。使用此函数将在很大程度上减少所需的时间。 https://www.rdocumentation.org/packages/spatstat/versions/1.53-2/topics/nncross