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

Posted

技术标签:

【中文标题】有没有办法将 GeoFire 与 Firestore 一起使用?【英文标题】:Is there a way to use GeoFire with Firestore? 【发布时间】:2018-03-15 04:29:46 【问题描述】:

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

【问题讨论】:

有任何关于原生 Firestore 地理查询支持的消息吗?无论如何我都会去 GeoFirestore 看看接受的答案 当前状态:Firebase 原生支持处于不确定状态。第 3 方 GeoFirestore 在 (Swift) github.com/imperiumlabs/GeoFirestore 和 (JS) npmjs.com/package/geofirestore 中实现。 【参考方案1】:

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

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

虽然我们在数据库中仍然没有本机地理查询,但这些 androidios 和 Web 库将帮助您使用 Geohashes 获得地理查询功能。


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

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


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

由于即将推出原生地理查询,我们不会将 GeoFire 移植到 Cloud Firestore。相反,我们将把工程工作重心转移到更快地获取本机查询。

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

【讨论】:

Firestore 将成为我们要去的地方,我们离这个实现还有多远?几天?周?年? 是的,大概的时间表会非常有帮助。我们现在正盯着一个带有地理数据的大型应用程序,如果我们很快有类似 Geofire 的功能,我们将开放使用 Firestore 来实现它。 我无法分享任何时间表。不过可能需要一段时间!如果这是您应用的关键功能,请使用现有工具,而不是等待我们这样做。 四月了。风轻轻地吹着口哨,带着我的希望。任何更新...? :( 2019 年早上好,仍然没有地理查询【参考方案2】:

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

【讨论】:

网页(javascrip)呢? :( @iMDroid 似乎有 javascript 支持这里有更多文档geofirestore.com/#example-usage Nikhil Sridhar 在这个产品的团队中【参考方案3】:

想到的一个解决方案是添加仅用于地理查询的实时数据库,并将两个数据库与 Cloud Functions 同步,就像 Google 建议的 presence 一样。

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

【讨论】:

很遗憾,我不能。您需要做的就是在 Realtime DB 中删除主 Firestore DB 中的 UID。对于查询,您只需将您的位置写入 Realtime DB 并使用 GeoFire 检索您的 UID 列表。【参考方案4】:

自从最初的发帖人第一次提出这个问题以来,一个新的项目已经被引入。该项目名为 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 @NikhilSridhar 作为 javascript 开发人员,我不同意 :)。 FWIW,看起来有人可能正在开发移动版本:github.com/imperiumlabs/Geofirestore 我在 firestore 中有一个 users 集合,每个 doc ref 都是 userId。在每个用户文档中都有一个存储在 GeoPoint 中的位置。我是否需要更改我的 Firestore 结构才能使用 GeoFirestore?【参考方案5】:

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

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

【讨论】:

【参考方案6】:

Cloud Firestore 原生支持地理位置。请参阅支持的data types。您会发现 GeoPoint 类,您可以使用它来设置数据并查询它:

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

【讨论】:

您好 SUPERCILEX,这适用于范围吗? (例如查询一个城市并获取该城市的所有餐厅)不是特定的 但是对于像“位置”这样的字段的基于范围的查询呢?这些查询不会失败,但不清楚它们实际上在做什么...... 这完全忽略了问题的重点。没有查询,数据类型实际上是无用的。

以上是关于有没有办法将 GeoFire 与 Firestore 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如果没有创建Geofire,我如何检查Geofire是否将用户注销?

Flutter Geofire 和 Firestore 读取问题

如果没有创建 Geofire,我如何检查 Geofire 以注销用户?

如何将 GeoFire 坐标与 Firebase 数据库中的其他项目一起保存?

GeoFire 结构与文档不匹配

如何在没有 Geofire 的情况下将位置对象保存在 Firebase 中?