有没有一种使用GeoFire与Firestore的方法?

60

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


2
有关原生Firestore地理查询支持的任何消息吗?不管怎样,我都会尝试使用GeoFirestore。 - Claus
请查看已接受的答案。 - Nikhil Sridhar
当前状态:Firebase 原生支持处于悬而未决状态。第三方 GeoFirestore 已在 (Swift) https://github.com/imperiumlabs/GeoFirestore 和 (JS) https://www.npmjs.com/package/geofirestore 中实现。 - user
6个回答

55

编辑(2020年12月17日):我们最近发布了一组地理实用程序库和指南,以解释如何使用它们在Firestore上实现简单的地理查询!

https://firebase.google.com/docs/firestore/solutions/geoqueries

虽然数据库中仍没有原生的地理查询,但这些 Android、iOS 和 Web 库将帮助您使用 Geohashes 来获取地理查询功能。


编辑(2019年7月1日):当我最初撰写下面的答案时,我对原生地理查询很乐观,认为它很快就会出现在Cloud Firestore中,但显然并没有发生。虽然仍在长期计划中,但目前最好的选择是使用社区构建的库或使用GeoHashesS2 Geometry库自己制作。

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


Cloud Firestore团队的Sam在此。正如SUPERCILEX所说,Cloud Firestore已经支持GeoPoint数据类型。我们正在努力使本地geo查询成为产品功能。

由于本地geo查询即将推出,我们将不会将GeoFire移植到Cloud Firestore。相反,我们将把工程努力集中在更快地实现本地查询上。

如果您需要今天进行geo查询,而且不想建立自己的库,请使用实时数据库!


28
那么Firestore将成为去的地方,我们离实现还有多远?几天?几周?几年? - erickva
4
好的,一个大致的时间表会非常有帮助。我们现在正在启动一个带有地理数据的大型应用程序,如果我们很快就能获得类似 Geofire 的功能,那么我们将开放地采用Firestore进行实现。 - The Lone Coder
6
我无法分享任何时间表。可能需要一段时间!如果这是您的应用程序的关键功能,请使用现有的工具而不是等待我们完成此任务。 - Sam Stern
5
四月已经到了,风轻吹着我的希望。有更新了吗?:( - b-fg
11
早上好2019年,仍然没有地理查询。 - Cristi Băluță
显示剩余18条评论

21

好消息!现在有一个库适用于iOS和Android,可以复制Firestore中的GeoFire。这个库叫做GeoFirestore。它有完整的文档并经过了充分的测试。我目前在我的应用程序中使用它,它表现得非常出色。该代码与GeoFire非常相似,所以只需花费几分钟学习即可。


5
网页(JavaScript)怎么办?:( - iMDroid
@iMDroid 看起来有 JavaScript 支持。这里有更多的文档 https://geofirestore.com/#example-usage - emjrose
Nikhil Sridhar 是这个产品团队的成员。 - Jean-François Fabre

11
一个可行的解决方案是添加实时数据库以进行地理查询,并使用Cloud Functions将两个数据库同步,就像Google在presence中建议的那样。
在我的情况下,甚至不需要进行太多同步;我只需在实时数据库中保留一个uid及其位置的列表,并在那里执行所有地理查询。

很遗憾,我不能这样做。你所需要做的就是在主Firestore数据库中删除UID时,在实时数据库中也删除相应的UID。对于查询,你只需将你的位置写入实时数据库,并使用GeoFire检索UID列表。 - urgentx

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

这几乎没有什么用,因为它只在Javascript中起作用。 - Nikhil Sridhar
1
作为一名JavaScript开发人员,我不同意 :). 顺便说一下,看起来有人可能正在开发移动版本:https://github.com/imperiumlabs/Geofirestore - ZenPylon
1
我在Firestore中有一个用户集合,每个文档引用都是userId。在每个用户文档中,都存储了一个GeoPoint位置信息。我需要修改我的Firestore结构才能使用GeoFirestore吗? - channae

-1

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

希望这些步骤能对你有所帮助!

-2

Cloud Firestore原生支持地理位置点。请参见支持的数据类型。您将找到{{link2:GeoPoint}}类,您可以使用它来设置数据并查询它:

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

6
你好,SUPERCILEX,这个能够支持范围吗?(例如查询一个城市并获取该城市内的所有餐厅,而不是特定的一个) - foufrix
1
但是对于像“位置”这样的字段进行基于范围的查询呢?这些查询不会失败,但实际上它们在做什么并不清楚... - Sam Storie
6
这完全偏离了问题的核心。没有这些查询,数据类型就变得无效了。 - ra9r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接