1. ホーム
  2. firebase

[解決済み] firestoreでジオ "near "クエリを実行するには?

2023-03-18 15:29:02

質問

firebase の新しい firestore データベースは、位置情報ベースのジオクエリをネイティブにサポートしていますか? 例えば、10マイル以内の投稿を検索したり、50件の最寄りの投稿を検索したりできますか?

リアルタイムのfirebaseデータベースのために、geofireのような既存のプロジェクトがあるようですが、それらをfirestoreに適応させることは可能でしょうか?

どのように解決するのですか?

UPDATE: Firestore は現在、実際の GeoPoint クエリをサポートしていません。そのため、以下のクエリは正常に実行されますが、緯度によってのみフィルタリングされ、経度によってではないため、近くにない結果が多数返されます。最良の解決策は geohashes . 似たようなことを自分でやるには、次のものを見てください。 ビデオ .

これは、バウンディングボックス less than greater than クエリを作成することで可能です。 効率に関しては、私は言及することができません。

なお、~1マイルの緯度/経度オフセットの精度は見直す必要がありますが、ここでは手っ取り早い方法を紹介します。

SWIFT 3.0 バージョン

func getDocumentNearBy(latitude: Double, longitude: Double, distance: Double) {

    // ~1 mile of lat and lon in degrees
    let lat = 0.0144927536231884
    let lon = 0.0181818181818182

    let lowerLat = latitude - (lat * distance)
    let lowerLon = longitude - (lon * distance)

    let greaterLat = latitude + (lat * distance)
    let greaterLon = longitude + (lon * distance)

    let lesserGeopoint = GeoPoint(latitude: lowerLat, longitude: lowerLon)
    let greaterGeopoint = GeoPoint(latitude: greaterLat, longitude: greaterLon)

    let docRef = Firestore.firestore().collection("locations")
    let query = docRef.whereField("location", isGreaterThan: lesserGeopoint).whereField("location", isLessThan: greaterGeopoint)

    query.getDocuments { snapshot, error in
        if let error = error {
            print("Error getting documents: \(error)")
        } else {
            for document in snapshot!.documents {
                print("\(document.documentID) => \(document.data())")
            }
        }
    }

}

func run() {
    // Get all locations within 10 miles of Google Headquarters
    getDocumentNearBy(latitude: 37.422000, longitude: -122.084057, distance: 10)
}