FirestoreからGeolocationを範囲で取得したい

どうも

自分への東京出張のお土産として、Nintendoストアで買ったスーパーマリオのハテナブロック型収納ボックスが邪魔すぎて頭を抱えている今日この頃です


はじめに

現在個人で開発中のNuxt.js+FirebaseのWebアプリではDBにFirestoreを使っているんですが、 位置情報が絡むアプリなのでgeopoint型のフィールドを持つドキュメントが登録されているコレクションが存在します

で、このコレクションから特定の緯度・経度の範囲にあるデータを取ってきたかったんですが、 調べたところ今のfirebaseのnodeパッケージではこれができませんでした…

githubのissueにそれっぽい話があったんですが、 解決に至ってないっすね・・・

ではどうするか?

というところにこんな記事が…
GeoFireXというライブラリがあって、緯度と経度を1つのハッシュ文字列で扱って良い感じにしてくれるそう

このライブラリを使うと、指定座標を中心に半径x km内にヒットするデータが取得できます

import firebase from "firebase"
import * as geofirex from "geofirex"

firebase.initializeApp({ /* firebase configurations ... */ })

const parkings = firebase.firestore().collection("parkings")
const gfx = geofirex.init(firebase)
const center = gfx.point(34.6934575, 135.1952188)  // 三宮駅の座標

// Firestoreのparkingsコレクションから三宮駅の座標を中心に2km圏内の駐車場を取得
geofirex.get(gfx.query(parkings).within(center, 2, "Point")))
  .then(datas => {
    datas.forEach(data => {
      // hoge fuga piyo...
    })
  })

フィールドの型として位置情報があるのに範囲で取得できないってのは正直なんでやねんって気がしますが、しゃーないっすね

あと紹介しておいてなんなんですが、GeoFireXも現時点(2020/11/17)で1年以上更新が入っていないので ぶっちゃけ位置情報を扱うならgeopoint型のフィールド使わないという選択をした方がいいかもしれないですね

FirestoreのNumber型で浮動小数点使った方がええんやろか…?