web-dev-qa-db-ja.com

ポイントから半径内の特定の長さのジオハッシュを見つける

与えられた緯度とその周囲の距離を持つポイントがあります-例: {40.6826048、-74.0288632:20マイル、51.5007825、-0.1258957:100マイル}。固定のジオハッシュの長さ(たとえば、〜1x1mileに等しい)を選択した場合、各ポイントから指定された半径を持つその長さのすべてのジオハッシュエントリを見つけるにはどうすればよいですか?

背景を追加するために-私がそれをしたい理由は、指定されたジオハッシュが半径内にある(そしていくつかのカスタム適格性ルールにも一致する)ポイントのリストの値でジオハッシュIDによってキー設定されたキャッシュを保存できるようにするためです。次に、ユーザーの場所のジオハッシュをすばやく検索して、ユーザーの周囲のすべての適格なポイントを見つけることができます。

11
naumcho

これは私がやろうとする方法です:

入力:関心のあるポイント(緯度、経度)クエリ半径

ステップ1: 'MINIMUM' BOUNDING RECTANGLE(MBR)を完全に含むQUERY CIRCLE

ステップ2:最小境界長方形を作成するには、最初に、入力パラメーターを使用して、その最小および最大緯度を計算します。 最小および最大緯度経度の計算–正しい方法のセクション3.1および3.3を参照してください。

ステップ3:(minLat, minLon), (maxLat, maxLon)を使用して、MBRの四隅を計算しますNorthWest(maxLat, minLon)SouthWest(minLat, minLon)SouthEast(minLat, maxLon)NorthEast(maxLat, maxLon)

ステップ4: MBRの四隅すべてのジオハッシュを計算します

例:ニューヨークのポイントの場合、たとえば(40.75798、-73.991516)、距離:800メートル、ジオハッシュの長さ:12

  • NorthWestdr5ruj4477kd
  • SouthWestdr5ru46ne2ux
  • SouthEastdr5ru6ryw0cp
  • NorthEastdr5rumpfq534

ステップ5:これらのGeoHashから、クエリ境界ボックス(MBR)プレフィックスを計算します。dr5r

これにより、MBR、つまりクエリ領域を完全に含む、より粗いGeoHashが得られます。言い換えると、dr5rでインデックス付けされたすべてのポイントは、dr5ru0 - dr5ruzから32個のジオハッシュで生成されます。

最終段階:

クエリサークル(正確にはSquare(MBR))に対応する正確なグリッド(または)GeoHashを見つけるには、2D配列を使用して繰り返し(4X8)マトリックスを表すことにより、これらの32のGeoHashから選択する必要があります。

この例では、dr5ru + J, M, H, K, 5, 7, 4, 6を取得します。これらのGeoHashはすべて、中央クエリポイントからwithin 800メートルのポイントを表しています。ただし、完全な円ではなくMBRを考慮しているため、回避できなかったGeoHashはごくわずかです。


単一のGIFでの全体的なプロセス:(ステップ1〜5)

Overall Process


最終段階:

GeoHash

重要:GeoHash用の4 x8グリッドの使用を見つけてください。これは、GeoHashの長さに沿って文字ごとに異なります。 ODDの長さの場合は8x 4であり、転置の場合でも4 X 8。この場合、内部にありますdr5ru(5 + 1、6番目の解像度)したがって、使用します4 X 8

32

これを見てください-> ProximityHash

ProximityHashは、中心座標と半径を指定して、円形領域をカバーする一連のジオハッシュを生成します。また、GeoRaptorを使用する追加オプションがあり、最高レベルから開始して最適なブレンドが作成されるまで、さまざまなレベルでジオハッシュの最適な組み合わせを作成して円を表します。結果の精度は開始ジオハッシュレベルと同じままですが、データサイズが大幅に減少するため、速度とパフォーマンスが向上します。

3
Ashwin Nair