Firebase 位置情報から指定範囲内のユーザーを取得する方法

前回、Firebaseに位置情報を保存する方法をご紹介しましたが、 今回はその保存した位置情報から指定範囲内に存在するユーザーの取得についてです。 例えば、現在の位置から3km圏内にいるユーザーIDを取得する。などよくマッチングアプリではありがちな機能の実装です。

Firebase 位置情報を保存する

リファレンスの取得

今回もまずは比較するユーザーの位置情報が格納されているDBのリファレンスを取得します。

let geoFirestoreRef = Firestore.firestore().collection(Config.COLLECTION_USER_LOCATIONS)
let geoFirestore = GeoFirestore(collectionRef: geoFirestoreRef)


クエリーから取得

引数として入れるのは "今回比較する位置情報(CLLocation)" と "範囲(km)" だけです。

geoFirestore.query(withCenter: CLLocation(latitude: 緯度, longitude: 経度, radius: 指定範囲(km) ).observe(.documentEntered) { (key, location) in
    if let key = key, let location = location {
        debugPrint("key(id): \(key), location: \(location)")
    }
}

実際のログにはこの様に表示されます。

"key: 86j7H3QQ4mHp6k6we609, location: <+35.91475949,+139.48335255> +/- 0.00m (speed -1.00 mps / course -1.00) @ 2019/02/07 0:18:21 Japan Standard Time"



リアルタイムで行う場合

例えば Uber の様にリアルタイムで位置情報を常に更新しながらやる場合は、 先ほどの query()observe() に取得するタイミングを指定します。

geoFirestore.query(withCenter: CLLocation(latitude: 緯度, longitude: 経度, radius: 指定範囲(km) ).observe(.documentEntered) { (key, location) in
    // ユーザーが指定範囲内に入ってきた時...
}

geoFirestore.query(withCenter: CLLocation(latitude: 緯度, longitude: 経度, radius: 指定範囲(km) ).observe(.documentMoved) { (key, location) in
    // ユーザーが動いている時...
}

geoFirestore.query(withCenter: CLLocation(latitude: 緯度, longitude: 経度, radius: 指定範囲(km) ).observe(.documentExited) { (key, location) in
    // ユーザーが指定範囲外に行った時...
}


まとめ

以上が位置情報から指定範囲内のユーザーを取得する方法です。 この記事が誰かの役に立ってくれると嬉しいです。

0 コメント