2017-04-11 8 views
6

私はFirebaseを使用して、最後にスキャンした緯度と経度でユーザーを保管しています。近くの場所への問い合わせ

エントリは次のようになります。ユーザーは、特定の「検索」ボタンを押すたび

"Bdhwu37Jdmd28DmenHahd221" : { 
    "country_code" : "at", 
    "firstname" : "John", 
    "gender" : "m", 
    "lat" : 11.2549387, 
    "lon" : 17.3419559 
} 

、私は、要求を送信した人に最も近い人々を取得するために私のFirebase機能が欲しいです。

Firebaseは1つのフィールドの後にクエリーを許可するだけなので、いくつかの範囲制限とそのフィールドのクエリを持つ種類のcountry_codeを追加することにしました。しかし、特定の国のすべてのユーザーを読み込んだ後、特定のユーザーと同じ国の他のすべてのユーザーとの間の最小距離を確認すると、それはまだ非常に遅いです。

既に5人のユーザーがいる場合、関数は結果を得るのに40秒かかる。

私は複合インデックスについても読んだことがありますが、何とか緯度と経度を組み合わせて両方のフィールドを照会する必要があります。

ここで2番目と3番目のクエリを取得する方法はありますか(たとえば、同じcountry_codeを検索してから同様の緯度と経度を検索する)か、サーバーコード内でこれを解決する必要がありますか?

+4

https://github.com/firebase/geofire – cartant

答えて

12

Firebaseデータベースは、1つのプロパティでしか照会できません。したがって、緯度と経度の値をフィルタリングする方法は、それらを1つのプロパティに結合することです。その結合プロパティは、範囲をフィルタリングする機能など、数値に必要なフィルタリング特性を保持する必要があります。

これは最初は不可能に思えるかもしれませんが、実際にはGeohashesという形で行われています。その形質の数:

  1. そのように格子状のバケットに

の空間を細分階層空間データ構造である:Geohashesはバケットのグリッドにスペースを分割し、各バケットは文字列で識別されます。

  • Geohashesは、そのサイズを小さくする(徐々に精度を失う)する任意精度徐々にコードの末尾の文字を削除する可能性のような特性を提供します。

  • 漸進的精度劣化の結果として文字列、バケットが

    をカバーする大きな領域
  • 、近くの場所であろう長いですしばしば(常にではないが)類似のプレフィックスを提示する。共有プレフィックスが長いほど、2つの場所が近くなります。同じ文字で始まる

  • 文字列は、互いに近接しています。

    これらの特性を組み合わせると、これらのGeohashesはなぜFirebaseデータベースで使用するのが魅力的であるかを知ることができます。つまり、場所の緯度と経度を1つの文字列に結合します。それらは物理的に互いに近接している。マジック!

    FirebaseにはGeohireというライブラリが用意されています.Giofireはジオハッシュを使用してリアルタイムデータベースの上にジオロケーションシステムを実装します。図書館はJavaScript,JavaおよびObjective-C/Swiftで利用可能です。

    Geofireの詳細については、チェックアウト:

    +0

    ありがとう、私はこれを読み、試します。それは可能ですか、クラウド機能は超低速ですか? 3人のクエリだけが毎回40秒(私だけでなく)のように私を連れて来て、私は2つのデータベースにアクセスします。 – Thomas

    +0

    クラウド機能がベータ版であるとみなしても、不合理であると思われるパフォーマンスが一貫している場合は、その問題を再現する最小限のコードで質問を開きます(http://stackoverflow.com/help/mcve) 。 –

    +0

    GeoFireは正常に動作しますが、ユーザーの場所がユーザーデータ内にネストされている場合は動作させることができません。 「/ user」と私のgeoFireの参照ポイントは/ user/$ uid/locationにありますが、geoFireはネストされたフィールドを自動的に検索しますか、「g」の値がどこかに定義する必要がありますか?アルゴリズムは、「場所」ではなく、「/ユーザー」の項目のすぐ下にある「g」を探しているようです。 – Thomas

    関連する問題