GeoFire与实时数据库紧密耦合,而地理查询是许多希望迁移到Firestore的应用程序的常见功能依赖项。是否有任何方法可以在Firestore环境中复制位置的哈希/检索?
GeoFire与实时数据库紧密耦合,而地理查询是许多希望迁移到Firestore的应用程序的常见功能依赖项。是否有任何方法可以在Firestore环境中复制位置的哈希/检索?
编辑(2020年12月17日):我们最近发布了一组地理实用程序库和指南,以解释如何使用它们在Firestore上实现简单的地理查询!
https://firebase.google.com/docs/firestore/solutions/geoqueries
虽然数据库中仍没有原生的地理查询,但这些 Android、iOS 和 Web 库将帮助您使用 Geohashes 来获取地理查询功能。
编辑(2019年7月1日):当我最初撰写下面的答案时,我对原生地理查询很乐观,认为它很快就会出现在Cloud Firestore中,但显然并没有发生。虽然仍在长期计划中,但目前最好的选择是使用社区构建的库或使用GeoHashes或S2 Geometry库自己制作。
Realtime Database的GeoFire库是使用GeoHashes构建的,将这些库的逻辑移植到Cloud Firestore应该相对简单。
Cloud Firestore团队的Sam在此。正如SUPERCILEX所说,Cloud Firestore已经支持GeoPoint数据类型。我们正在努力使本地geo查询成为产品功能。
由于本地geo查询即将推出,我们将不会将GeoFire移植到Cloud Firestore。相反,我们将把工程努力集中在更快地实现本地查询上。
如果您需要今天进行geo查询,而且不想建立自己的库,请使用实时数据库!
好消息!现在有一个库适用于iOS和Android,可以复制Firestore中的GeoFire。这个库叫做GeoFirestore。它有完整的文档并经过了充分的测试。我目前在我的应用程序中使用它,它表现得非常出色。该代码与GeoFire非常相似,所以只需花费几分钟学习即可。
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
使用GeoFirestore是Nikhil Sridhar提供的用于在Firestore中进行地理查询的JavaScript解决方案。但对我来说它相当难以使用。
首先,您必须初始化一个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
});
Cloud Firestore原生支持地理位置点。请参见支持的数据类型。您将找到{{link2:GeoPoint
}}类,您可以使用它来设置数据并查询它:
query.whereEqualTo("location", GeoPoint(lat, long))