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

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

【问题讨论】:

标签: firebase firebase-realtime-database google-cloud-firestore geofire


【解决方案1】:

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

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

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


编辑(2019 年 7 月 1 日):当我最初在下面写答案时,我很乐观地认为原生地理查询很快就会出现在 Cloud Firestore 中,但这显然没有发生。它仍在长期计划中,但目前最好的选择是使用社区构建的库或使用GeoHashesS2 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,这适用于范围吗? (例如查询一个城市并获取该城市的所有餐厅)不是特定的
    • 但是对于像“位置”这样的字段的基于范围的查询呢?这些查询不会失败,但不清楚它们实际上在做什么......
    • 这完全忽略了问题的重点。没有查询,数据类型实际上是无用的。
    猜你喜欢
    • 2016-11-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多