有没有办法将 GeoFire 与 Firestore 一起使用?
Is there a way to use GeoFire with Firestore?
GeoFire 与实时数据库紧密耦合,而地理查询是许多希望迁移到 Firestore 的应用程序的常见功能依赖项。有什么方法可以复制 Firestore 环境中的 hashing/retrieval 个位置?
想到的一个解决方案是为地理查询添加实时数据库,并使用 Cloud Functions 同步两个数据库,就像 Google 建议的 presence 一样。
在我的例子中,甚至不需要同步太多;我只是保留一个 uid 列表及其在实时数据库中的位置,并在那里进行所有地理查询。
Cloud Firestore 原生支持地理点。查看支持的 data types. And you'll find the GeoPoint
class,您可以使用它来设置数据并查询它:
query.whereEqualTo("location", GeoPoint(lat, long))
编辑(2020 年 12 月 17 日):我们最近发布了一组地理实用程序库和指南,以解释如何使用它们在 Firestore 上实现简单的地理查询!
https://firebase.google.com/docs/firestore/solutions/geoqueries
虽然我们在数据库中还没有本地地理查询,但这些Android、iOS和网络库将帮助您使用Geohashes获取地理查询功能。
编辑(2019 年 7 月 1 日):当我最初写下面的答案时,我很乐观地认为原生地理查询很快就会出现在 Cloud Firestore 中,但这显然没有发生。它仍在长期计划中,但目前最好的选择是使用社区构建的库或使用 GeoHashes or the S2 Geometry 库创建自己的库。
实时数据库的 GeoFire 库是使用 GeoHashes 构建的,将这些库的逻辑移植到 Cloud Firestore 应该相对简单。
这里是 Cloud Firestore 团队的 Sam。正如 SUPERCILEX 所说,Cloud Firestore 已经支持 GeoPoint 数据类型。我们正在努力将本地地理查询引入产品。
因为本地地理查询即将到来,我们不会将 GeoFire 移植到 Cloud Firestore。相反,我们会将工程工作重定向到更快地获取本机查询。
如果您现在需要地理查询并且不想构建自己的库,请坚持使用实时数据库!
自从楼主第一次问这个问题后,又引入了一个新项目。该项目称为 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
好消息。 iOS 和 Android 现在都有一个库,它为 Firestore 复制了 GeoFire。该库名为 GeoFirestore。它有完整的文档并且经过了很好的测试。我目前在我的应用程序中使用它并且效果很好。该代码与 GeoFire 的代码非常相似,因此只需几分钟即可学习。
GeoQuery with Firestore 的 Javascript 解决方案是使用 GeoFirestore,正如 Nikhil Sridhar 所说。但是很难用(或者对我来说)。
首先你必须初始化一个 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
});
希望以上步骤对您有所帮助!
GeoFire 与实时数据库紧密耦合,而地理查询是许多希望迁移到 Firestore 的应用程序的常见功能依赖项。有什么方法可以复制 Firestore 环境中的 hashing/retrieval 个位置?
想到的一个解决方案是为地理查询添加实时数据库,并使用 Cloud Functions 同步两个数据库,就像 Google 建议的 presence 一样。
在我的例子中,甚至不需要同步太多;我只是保留一个 uid 列表及其在实时数据库中的位置,并在那里进行所有地理查询。
Cloud Firestore 原生支持地理点。查看支持的 data types. And you'll find the GeoPoint
class,您可以使用它来设置数据并查询它:
query.whereEqualTo("location", GeoPoint(lat, long))
编辑(2020 年 12 月 17 日):我们最近发布了一组地理实用程序库和指南,以解释如何使用它们在 Firestore 上实现简单的地理查询!
https://firebase.google.com/docs/firestore/solutions/geoqueries
虽然我们在数据库中还没有本地地理查询,但这些Android、iOS和网络库将帮助您使用Geohashes获取地理查询功能。
编辑(2019 年 7 月 1 日):当我最初写下面的答案时,我很乐观地认为原生地理查询很快就会出现在 Cloud Firestore 中,但这显然没有发生。它仍在长期计划中,但目前最好的选择是使用社区构建的库或使用 GeoHashes or the S2 Geometry 库创建自己的库。
实时数据库的 GeoFire 库是使用 GeoHashes 构建的,将这些库的逻辑移植到 Cloud Firestore 应该相对简单。
这里是 Cloud Firestore 团队的 Sam。正如 SUPERCILEX 所说,Cloud Firestore 已经支持 GeoPoint 数据类型。我们正在努力将本地地理查询引入产品。
因为本地地理查询即将到来,我们不会将 GeoFire 移植到 Cloud Firestore。相反,我们会将工程工作重定向到更快地获取本机查询。
如果您现在需要地理查询并且不想构建自己的库,请坚持使用实时数据库!
自从楼主第一次问这个问题后,又引入了一个新项目。该项目称为 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
好消息。 iOS 和 Android 现在都有一个库,它为 Firestore 复制了 GeoFire。该库名为 GeoFirestore。它有完整的文档并且经过了很好的测试。我目前在我的应用程序中使用它并且效果很好。该代码与 GeoFire 的代码非常相似,因此只需几分钟即可学习。
GeoQuery with Firestore 的 Javascript 解决方案是使用 GeoFirestore,正如 Nikhil Sridhar 所说。但是很难用(或者对我来说)。
首先你必须初始化一个 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
});
希望以上步骤对您有所帮助!