GeoFire 与实时数据库紧密耦合,而地理查询是许多希望迁移到 Firestore 的应用程序的常见功能依赖项。有没有办法在 Firestore 环境中复制位置的散列/检索?
6 回答
编辑(2020 年 12 月 17 日):我们最近发布了一组地理实用程序库和指南,以解释如何使用它们在 Firestore 上实现简单的地理查询!
https://firebase.google.com/docs/firestore/solutions/geoqueries
虽然我们在数据库中仍然没有本地地理查询,但这些 Android、iOS 和 Web 库将帮助您使用 Geohashes 获得地理查询功能。
编辑(2019 年 7 月 1 日):当我最初写下面的答案时,我很乐观地认为原生地理查询很快就会出现在 Cloud Firestore 中,但这显然没有发生。它仍在长期计划中,但目前最好的选择是使用社区构建的库或使用GeoHashes或S2 Geometry库自己制作。
实时数据库的 GeoFire 库是使用 GeoHashes 构建的,将这些库的逻辑移植到 Cloud Firestore 应该相对简单。
来自 Cloud Firestore 团队的 Sam。正如 SUPERCILEX 所说,Cloud Firestore 已经支持 GeoPoint 数据类型。我们正在努力为产品带来本地地理查询。
由于本地地理查询即将到来,我们不会将 GeoFire 移植到 Cloud Firestore。相反,我们将把工程工作重定向到更快地获取本机查询。
如果您现在需要地理查询并且不想构建自己的库,请坚持使用实时数据库!
好消息。现在有一个适用于 iOS 和 Android 的库,可以复制 GeoFire for Firestore。该库称为GeoFirestore。它有完整的文档并且经过了很好的测试。我目前在我的应用程序中使用它并且效果很好。该代码与 GeoFire 的代码非常相似,因此只需几分钟即可学习。
想到的一个解决方案是添加实时数据库,仅用于地理查询,并将两个数据库与 Cloud Functions 同步,就像谷歌建议的存在一样。
就我而言,甚至不需要同步太多。我只是在实时数据库中保留一个 uid 列表及其位置,并在那里进行所有地理查询。
自从原始海报第一次提出这个问题以来,已经引入了一个新项目。该项目称为 GEOFirestore。
使用这个库,您可以在一个圆圈内执行查询,例如查询文档:
const geoQuery = geoFirestore.query({
center: new firebase.firestore.GeoPoint(10.38, 2.41),
radius: 10.5
});
您可以通过 npm 安装 GeoFirestore。您必须单独安装 Firebase(因为它是 GeoFirestore 的对等依赖项):
$ npm install geofirestore firebase --save
正如 Nikhil Sridhar 所说,GeoQuery with Firestore 的 Javascript 解决方案是使用 GeoFirestore。但是很难使用(或者对我来说)。
首先,您必须初始化 GeoFirestore 引用。
var firebase = require('firebase-admin');
var GeoFirestore = require('geofirestore');
// Create a Firestore reference
const firestore = firebase.firestore();
// Create a GeoFirestore reference
const geofirestore = new GeoFirestore.GeoFirestore(firestore);
// Create a collection reference but using geofirestore collections
// this is where you save the geofirestore documents with its structure
const geocollection = geofirestore.collection('userPositions');
初始化集合后,第一步是保存具有指定结构的文档
{
g: string;
l: GeoPoint;
d: DocumentData;
}
geofirestore.collection('userPositions').doc(id).set({ coordinates: new firebase.firestore.GeoPoint(0, 0)}).then(res => {
return res;
}).catch(err => {
console.log(err);
});
只有当您拥有包含 geofirestore 文档的集合时,您才能按照示例所述查询它们。
// Create a GeoQuery based on a location
const query = geocollection.near({ center: new firebase.firestore.GeoPoint(0, 0), radius: 1000 });
// Get query (as Promise)
query.get().then((value) => {
console.log(value.docs); // All docs returned by GeoQuery
});
希望这些步骤对您有所帮助!