Algorithm 地理空间查找

Algorithm 地理空间查找,algorithm,data-structures,language-agnostic,lookup,Algorithm,Data Structures,Language Agnostic,Lookup,我正在开发一种算法和数据结构来处理大量二维点的欧几里德距离查找 我曾尝试在google scholar上对此进行研究,但没有发现任何结果(可能是因为我不知道这个问题在文献中通常被称为什么) 以下是我考虑过的两种方法: 方法1: 使用桶创建二维网格。将点插入桶中,保留每个点的桶的引用。 在查找距离为D的点P时,获取其bucket B以及其网格正方形的任何角(到B的距离)小于D的所有bucket。 最后,枚举所有这些桶中的点并计算到P的距离 方法2: 创建两个列表,每个列表中的所有点按一个坐标(x,

我正在开发一种算法和数据结构来处理大量二维点的欧几里德距离查找

我曾尝试在google scholar上对此进行研究,但没有发现任何结果(可能是因为我不知道这个问题在文献中通常被称为什么)

以下是我考虑过的两种方法:

方法1: 使用桶创建二维网格。将点插入桶中,保留每个点的桶的引用。 在查找距离为D的点P时,获取其bucket B以及其网格正方形的任何角(到B的距离)小于D的所有bucket。 最后,枚举所有这些桶中的点并计算到P的距离

方法2: 创建两个列表,每个列表中的所有点按一个坐标(x,y)排序。在查找距离为D的点P时,执行二进制搜索,在每个列表中查找两个点,以查找点与P 不过,我猜最先进的算法将远远优于此?如果您对此有任何想法,我们将不胜感激

以下建议可帮助您:

  • 看看,这是一个k维树(在你的例子中是2d),这是寻找最近邻居的最好方法之一
  • 也许您可以从专门为处理地理空间数据而开发的
  • 您可以将上述任何一项与所需的距离功能结合使用。根据您的应用,您需要地图距离、大圆距离、恒定坡度距离、恒定方位距离等。您应该知道您的距离函数。我用大圆(哈弗森)距离来处理谷歌地图,比如地图和轨道
如果您想要Python实现,可以使用
scipy.spatial
()。在这个模块中,查询球点((px,py),半径)函数似乎就是您要查找的


希望这有帮助

我没有资格回答这个问题,但这个链接可能会有所帮助——它解释了MongoDB的地理空间索引是如何实现的。你是在问还是?@DavidCary似乎没有,不过它更类似于二维范围查询。这个问题可以总结为“找到到点P的欧几里德距离小于D的所有点”@Rich,这很有趣。它看起来类似于我提到的方法1,因为点在网格中弯曲。我在这里有一个类似的问题:特别是,a(2d KDTree的另一个词)将是默认的解决方案,特别是如果在直角坐标上使用欧几里德距离函数(即,如果忽略地球表面的曲率)。@ErikP。我把四叉树想象成一个规则的细分(将正方形单元一分为二以获得一半大小、更小的正方形单元),而KDtree不一定将单元划分为大小相等的子单元。相反,在KDtree中,子单元尺寸将取决于单元内的点分布。这是正确的吗?我倾向于认为细分的(ir)规律性是KDTrees(或四叉树,就这点而言)中的一个(重要的!)实现选择,但我开始相信您是正确的,并且我对这些术语的使用是非标准的。无论如何,在这种情况下,我认为规则细分和不规则细分原则上都可行;这可能取决于点分布,哪种方法最有效。@ErikP。我见过四叉树被用来细分空间,空间可能包含数据,也可能不包含数据,比如webmaps的地图空间。现在,如果您单独细分点云,KDtree方法将使用不规则(优化)细分。当然,如果必须在四叉树空间中引用点的位置,这是另一项任务。所有这些都是令人惊奇和有趣的!K-D树和四叉树看起来非常有趣,只需在需要时进行细分,就可以为网格方法提供极大的优势。现在我只需要实现算法来找到一个圆中的所有点,但它看起来相当简单。谢谢,heltonbiker和Erik P。!