私は現在、ジオハッシュ アルゴリズム ( http://www.geohash.org ) を使用して隣人の隣人を再帰的に見つけるためのエレガントなアルゴリズムを探しています。
基本的に、中央の geohash を取り、その周りに同じサイズのハッシュ (8 要素) の最初の「リング」を取得し、次のステップで、最初のリングの周りに次のリングを取得します。そうする方法?
力ずくで各隣人を取得し、その隣人に大規模な重複を単純に無視させることができます。1 つの中央 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
(増井雄一郎のlibより抜粋)
リング 2 または 3 に入ると方向が見にくくなるため、このアプローチはすぐに見苦しくなると思います。アルゴリズムは、理想的には単純に 2 つのパラメータを取ります。中央の領域と 0 からの距離は、中央のジオハッシュのみです ( ["u0m"]
1 は、周囲に同じサイズの 8 つのジオハッシュで構成される最初のリングです。2 は、(=> [["u0t", "u0w"], ["u0q", "u0n"], ["u0j", "u0h"], ["u0k", "u0s"]])
周囲に 16 の領域を持つ 2 番目のリングです)。ファーストリングなど
ビットからエレガントな方法で「リング」を推測する方法はありますか?