有没有办法将GeoFire与Firestore一起使用?

问题描述 投票:47回答:6

GeoFire与实时数据库紧密耦合,而地理查询是许多希望迁移到Firestore的应用程序的常见功能依赖。有没有办法在Firestore环境中复制散列/检索位置?

firebase firebase-realtime-database google-cloud-firestore geofire
6个回答
16
投票

好消息。现在有一个iOS和Android库,可以复制GeoFire for Firestore。该库名为GeoFirestore。它有完整的文档,并经过充分测试。我目前在我的应用程序中使用它,它的工作非常出色。代码与GeoFire的代码非常相似,因此只需几分钟即可学习。


54
投票

编辑(2019年7月1日):当我最初编写下面的答案时,我很乐观地认为本地地理查询很快就会到达Cloud Firestore,这显然没有发生。它仍然是长期计划,但目前最好的选择是使用社区建立的库或使用GeoHashesS2 Geometry库自己创建。

实时数据库的GeoFire库是使用GeoHashes构建的,将这些库的逻辑移植到Cloud Firestore应该相对简单。


Sam来自Cloud Firestore团队。正如SUPERCILEX所说,Cloud Firestore已经支持GeoPoint数据类型。我们正在努力为产品提供原生地理查询。

由于原生地理查询即将到来,我们不会将GeoFire移植到Cloud Firestore。相反,我们会将该工程工作重定向到更快地获取本机查询。

如果您今天需要地理查询并且不想构建自己的库,请坚持使用实时数据库!


11
投票

想到的解决方案是在实时数据库中添加地理查询,并将两个数据库与云功能同步,就像Google建议使用presence一样。

就我而言,它甚至不需要同步很多;我只是在实时数据库中保留一个uid列表及其位置,并在那里进行所有地理查询。


7
投票

自最初的海报首先提出这个问题以来,已经引入了一个新项目。该项目名为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

1
投票

Cloud Firestore本身支持地理点。请参阅支持的data types。您将找到GeoPoint类,您可以使用它来设置数据并查询它:

query.whereEqualTo("location", GeoPoint(lat, long))

-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
  });

希望这个步骤可以帮到你!

© www.soinside.com 2019 - 2024. All rights reserved.