【问题标题】:How to implement proximity search for latitude and longitude values?如何实现纬度和经度值的邻近搜索?
【发布时间】:2011-07-22 02:04:38
【问题描述】:

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

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

  1. 我应该使用什么数据结构来存储 lat+long+description(我想到了一个哈希......但我不知道如何组合 long+lat 来形成一个键)

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    您将不得不尝试哪一种更适合您。我在那篇论文中实现了算法,但它并不能很好地解决我的问题(可能是因为我的数据点分布不是很均匀)。您的情况可能会有所不同,因此您必须尝试一下。

    【讨论】:

      【解决方案2】:

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

      点的数据类型

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

      内部节点(非叶节点)的数据类型

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

      叶子节点的数据类型

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

      动态生成二叉树并在插入更多点时划分节点。如果节点的高度是偶数,则根据纬度划分它,否则根据经度划分。

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

      这是一个流行的问题 - http://en.wikipedia.org/wiki/Nearest_neighbor_search#Approximate_nearest_neighbor

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-16
        • 2014-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多