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

its*_*sme 7 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
Run Code Online (Sandbox Code Playgroud)

(摘自Yuichiro MASUI的lib)

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

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

phi*_*dad 1

这取决于您所说的邻居是什么意思。我假设这是在邻近搜索的上下文中使用的。在这种情况下,我认为最好的选择是从最外层的环向内搜索。

假设您可以在可搜索的宇宙中找到最外层的集合(最长的接近度)。将其存储为新的宇宙,然后找到该宇宙中的下一个内部集合。这个搜索应该从宇宙中减去那个内部集合。存储旧的宇宙(最外层的环)并重复此过程,直到到达中心。第一次搜索后的每次搜索都会缩小您的搜索范围,并给您响铃。