2011-08-22 134 views
0

Trover是一款出色的应用程序:它显示了人们上传的发现(POI)流 - 按距离您指定的任何位置(通常是您当前的位置)排序。你越过饲料滚动,显示的发现越远。一个指标非常准确地告诉你目前显示的发现有多远(见网站截图)。按距离当前位置排序POIs

这与大多数其他基于位置的应用程序不同,这些应用程序基于固定的区域提供结果(POI)(例如,给我半径10公里的所有Pizzerias),可以使用单个空间数据结构(或支持SQL引擎空间数据类型)。以Trover的方式交付结果相当困难:

  • 您可以查询任意位置的POI。给特洛弗在俄罗斯远东的一个位置,它将发现第一个距离2000公里并且从那里不断增加的发现。

  • POI的结果列表不受某个空间范围的限制。如果您在Feed中滚动得足够长,您可能会看到位于地球另一端的发现。

  • 以上几点要求对任何位置的POI进行半严格排序。事实上,您可以向下滚动并重新载入更多发现,这意味着他们可以提供已排序数据的特定部分(例如,向我提供接下来的20个发现,这些发现距离我目前的位置至少100公里)。

  • 速度很快,抓取和距离指示是即时的。发现必须预先分类。我不知道他们在数据库中有多少发现,但它必须超过您想要特别排序的数量。

我发现这些特性相当了不起,并且很奇怪这是如何实现的。任何建议可以使用什么样的数据结构,算法或缓存?

回答

0

我不明白这个问题。什么需要答案?

编辑: 他们可能会使用图形数据库,其中一个边表示节点之间的距离。这样你就可以通过附近POI的关系来获得距离。你会计算距离并创建边缘到附近的节点。要获得任意点的距离,只需执行圆距计算,对于另一个节点,只需将边缘值加起来即可表示距离(这用于获取步行,骑车或汽车计算的情况)。加起来可能不是最接近的方式,但会给出它们似乎使用的相对指示。

+0

这是一个答案?我编辑了这个问题,希望现在更清楚。我不期望得到一个答案,更多的技术可以组合起来实现上述特点。 – fivanski

+0

这更像是一个答案!你的意思是节点是POI吗?计算当前位置与POI之间的距离我认为比较简单,因为每个POI都有经纬度。假设有许多节点,最棘手的部分就是选择最接近当前位置的节点(POI)。如果我理解正确,你建议从最近的节点开始进行某种广度优先搜索以找到下一个最近的节点? – fivanski

+0

你想要预先计算好它,你需要一个聪明的数据结构来存储。 – Gustav