60

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

4

6 回答 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库自己制作。

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


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

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

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

于 2017-10-03T23:40:13.323 回答
21

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

于 2018-07-10T06:19:13.027 回答
11

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

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

于 2017-10-03T21:25:21.813 回答
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
于 2018-06-27T02:30:46.320 回答
-1

正如 Nikhil Sridhar 所说,GeoQuery with Firestore 的 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
  });

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

于 2019-02-13T18:28:17.240 回答
-2

Cloud Firestore 原生支持地理位置。请参阅支持的数据类型。您将找到GeoPoint可用于设置数据并查询数据的类:

query.whereEqualTo("location", GeoPoint(lat, long))
于 2017-10-03T22:06:22.073 回答