Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何对地理数据进行排序以进行快速搜索_Algorithm_Search_Sorting_Geolocation_Latitude Longitude - Fatal编程技术网

Algorithm 如何对地理数据进行排序以进行快速搜索

Algorithm 如何对地理数据进行排序以进行快速搜索,algorithm,search,sorting,geolocation,latitude-longitude,Algorithm,Search,Sorting,Geolocation,Latitude Longitude,我有一些地理定位的对象(我有每个对象的纬度+经度)。 我的应用程序需要显示距离移动设备GPS位置3公里的物体。 我有数千个对象,它们分布在大片区域(例如,几个美国州,几个小国),这意味着在我的对象列表中,我可以有一个位于纽约,另一个位于迈阿密,但我也可以有非常近的对象(几米) 目前,我的应用程序执行迭代搜索。对于每个对象,我用GPS位置计算距离,如果距离听起来像a,但不是用最大数量的邻居(如kNN),而是用最大距离阈值 一种常见的方法是将对象放入一个特殊的数据结构中,以便快速排除大部分搜索空间。

我有一些地理定位的对象(我有每个对象的纬度+经度)。 我的应用程序需要显示距离移动设备GPS位置3公里的物体。 我有数千个对象,它们分布在大片区域(例如,几个美国州,几个小国),这意味着在我的对象列表中,我可以有一个位于纽约,另一个位于迈阿密,但我也可以有非常近的对象(几米)

目前,我的应用程序执行迭代搜索。对于每个对象,我用GPS位置计算距离,如果距离听起来像a,但不是用最大数量的邻居(如kNN),而是用最大距离阈值

一种常见的方法是将对象放入一个特殊的数据结构中,以便快速排除大部分搜索空间。 然而,这些通常是考虑欧几里德空间,而不是球面(lat/lon-)平面(环绕问题)。 因此,您可能需要将坐标转换为笛卡尔坐标系中相对于球体中心的三维坐标,然后才能应用以下数据结构之一高效地搜索对象:


提到空间索引的其他答案是正确的,但不一定是最简单的解决方案

我会考虑更简单的事情: 将项目按国家、州、地区、城市进行分组,最后按密集城市中的几个地标(在这些城市中有很多对象)进行分组


然后您只需要执行一些查询(检查我在哪个国家、哪个州、哪个地区等),将自己限制在一个非常小的对象集,没有在移动应用程序中实现高级数据结构。

如果没有专门的数据结构,一种方法似乎是对数据的两个副本进行排序,一个按经度排序,一个按纬度排序。任何在lat和long上进行二进制搜索的结果都是接近的

类似地,您可以使用通常的treap(快速)或红黑树(低可变性)


但使用r树或kd树可能有一些优点。我所描述的可能只是为了避免获取新的依赖项或避免从头开始编写新的数据结构。

如果我靠近区域边界,该怎么办?@smocking:搜索所有这些依赖项。这可能很少见,也不会让你太慢。我认为lat/lon中的四叉树几乎适用于所有场景。如果经度是0-360,那么我会更改它,使数据中的“接缝”位于日期线上,而不是零处(因此所有问题将仅限于北极、南极和太平洋)。真的谢谢,我将研究八叉树和kd树。如果对我的小脑袋来说不是太复杂的话,它也许可以用它做些什么!