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 コメント