Geohashing - 以递归方式查找邻居的邻居

时间:2010-06-10 20:45:03

标签: ruby algorithm geohashing

我现在正在寻找一种优雅的算法,通过geohashing算法(http://www.geohash.org)递归查找邻居的邻居。
基本上采用中心geohash,然后获得围绕它的第一个“环”相同大小的哈希(8个元素),然后,在下一步中,获得围绕第一个等的下一个环等。 你听说过一种优雅的方式吗?

蛮力可能是让每个邻居和他们的邻居完全忽略大量重叠。围绕一个中心geohash的邻居已经解决了很多次(例如在Ruby中:http://github.com/masuidrive/pr_geohash/blob/master/lib/pr_geohash.rb

编辑以澄清: 当前解决方案,传入中心键和方向,如下所示(使用相应的查找表):

  def adjacent(geohash, dir)
    base, lastChr = geohash[0..-2], geohash[-1,1]
    type = (geohash.length % 2)==1 ? :odd : :even
    if BORDERS[dir][type].include?(lastChr)
      base = adjacent(base, dir)
    end
    base + BASE32[NEIGHBORS[dir][type].index(lastChr),1]
  end

(从Yuichiro MASUI的lib中提取)

我说这种做法很快就会变得丑陋,因为一旦我们进入第二或第三圈,方向就会变得丑陋。该算法理想地简单地采用两个参数,中心区域和距离0的距离仅为中心地理位置(["u0m"],而1是由围绕其(=> [["u0t", "u0w"], ["u0q", "u0n"], ["u0j", "u0h"], ["u0k", "u0s"]])的相同大小的8个地理位置构成的第一个环。两个是第二个环,第一个环周围有16个区域等。

你有没有办法以优雅的方式从位中推断出'戒指'?

2 个答案:

答案 0 :(得分:1)

这取决于你对邻居的意思。我假设这是在邻近搜索的上下文中使用。在这种情况下,我认为你最好的选择是从最外圈向内搜索。

假设您可以在可搜索的Universe中找到最外层的组(最长的邻近区域)。将其存储为新Universe,然后在该Universe中找到下一个内部集。此搜索应从Universe中减去该内部集。存放旧宇宙(最外圈)并重复此过程直到您到达中心。第一个搜索后的每次搜索都会减少您的搜索区域并给您一个响铃。

答案 1 :(得分:0)

首先构建紧邻中心地理位置的侧面,即顶部,右侧,底部和左侧,最初这些侧面中的每一个将仅包括单个地理位置和角落。然后使用相邻函数递归地迭代边,其中方向对应于该边(即,向左扩展左侧),同时保持适当的结果集和用于下一次迭代的边。您还需要处理每一侧的对角线/角落地理位置(例如,左侧为顶部,右侧为顶部,如果使用顺时针关联)。有关该过程的示例,请参阅this implementation I did in LuaJavascript(但具有其他功能),以调用Grid()开始。