如何实现纬度和经度值的邻近搜索?

时间:2011-03-24 12:04:47

标签: c++ qt data-structures hash approximation

我的应用程序(基于Qt的移动应用程序)以下列格式从服务器获取数据:纬度,经度,描述。

我需要将这些数据存储在数据结构中,以便以后快速检索。现在我有一张地图,当用户点击地图中的一个点时,我得到该点的纬度,经度。使用这两个值我需要快速扫描我的数据结构并检索相关的描述。我的问题是......我在地图上点击的纬度和经度是一个近似值(它是一个触摸设备所以我永远不会得到精确的纬度+长),所以如果我对数据结构进行线性搜索我永远不会找到这些价值观。此外,如果数据太多,线性搜索将会非常慢。

  1. 我应该使用什么数据结构存储lat + long + description(哈希出现在我的脑海中......但我不知道如何将long + lat组合成一个键)

  2. 如何对数据结构进行近似搜索?

  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

您要查找的数据结构是kd-tree。如果你真的想要散列,并且可以接受一些小错误,你可以查看this paper(pdf),它描述了基于距离散列的方法。

你必须尝试哪一种更适合你。我在那篇论文中实现了算法,并且它对我的问题不起作用(可能是因为我的数据点分布不均匀)。在您的情况下,这可能会有所不同,因此您必须尝试。

答案 1 :(得分:1)

由于您的问题只包含2个维度,因此我们可以使用二叉树。每片叶子最多可以有“N”个点(以纬度,经度为点)。只有叶子节点才有点。

点的数据类型

class Point
{
  float Latitude;
  float Longitude;
  string Description;
}

内部节点的数据类型(NonLeaf节点)

class Node
{
   Float MaxLatitude;
   Float MinLatitude;
   Float MaxLongitude;
   Float MinLongitude;
}

leafnode的数据类型

class LeafNode
{
   Point points[K]; // Array of points
}

动态生成二叉树,并在插入更多点时划分节点。如果节点的高度为均匀,则根据纬度除以基于经度的除法。

搜索输入点时,找到相关的叶节点,该叶节点中的所有点都将是与输入点最近的点。

这是一个受欢迎的问题 - http://en.wikipedia.org/wiki/Nearest_neighbor_search#Approximate_nearest_neighbor