GeoFire与实时数据库紧密耦合,而地理查询是许多希望迁移到Firestore的应用程序的常见功能依赖。有没有办法在Firestore环境中复制散列/检索位置?
答案 0 :(得分:52)
Sam来自Cloud Firestore团队。正如SUPERCILEX所说,Cloud Firestore已经支持GeoPoint数据类型。我们正在努力为产品提供原生地理查询。
由于原生地理查询即将到来,我们不会将GeoFire移植到Cloud Firestore。相反,我们会将工程工作重定向到更快地获取本机查询。
如果您今天需要地理查询并且不想建立自己的库,请坚持使用实时数据库!
答案 1 :(得分:11)
想到的解决方案是在实时数据库中添加仅用于地理查询并使用云功能同步两个数据库,就像Google建议使用presence一样。
在我的情况下,它甚至不需要同步很多;我只是在实时数据库中保留一个uid列表及其位置,并在那里进行所有地理查询。
答案 2 :(得分:11)
重大新闻。现在有一个适用于iOS和Android的库,可复制GeoFire for Firestore。该库称为GeoFirestore。它具有完整的文档,并且已经过测试。我目前在我的应用程序中使用它,并且效果很好。该代码与GeoFire非常相似,因此只需几分钟即可学习。
答案 3 :(得分:6)
自原始海报首先问这个问题以来,就引入了一个新项目。该项目称为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
答案 4 :(得分:2)
Cloud Firestore本身支持地理位置。请参阅支持的data types。您将找到GeoPoint
类,您可以使用它来设置数据并查询它:
query.whereEqualTo("location", GeoPoint(lat, long))
答案 5 :(得分:-1)
Nikhil Sridhar表示,带Firestore的GeoQuery的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
});
希望此步骤对您有所帮助!