【问题标题】:Firestore: Query geopoints using bounds (lessThan/moreThan)Firestore:使用边界查询地理点(小于/大于)
【发布时间】:2019-06-06 10:45:31
【问题描述】:

我想使用从地图中获取的边界框按地理点查询文档集合。我有界限:

北:50.730

东:-1.861

南部:50.700

西部:-1.893

这是我的实际文档结构(基于我希望它返回的值):

document: {
  d: {
    coordinates: GeoPoint [50.72, -1.87]
  }
}

这是我正在尝试的,但它不起作用:

db
  .collection('exploreMap')
  .where('d.coordinates.latitude', '<=', NORTH)
  .where('d.coordinates.latitude', '>=', SOUTH)
  // .where('d.coordinates.longitude', '<=', EAST)
  // .where('d.coordinates.longitude', '>=', WEST)
  .limit(80)
  .get()

它只返回一个空查询,没有错误。我已经尝试过 EAST/WEST 查询和 NORTH/SOUTH,结果都相同。

我知道我不能做一个完整的框查询,因为 Firestore 不支持多个字段的 .where(),所以做一个简单的纬度或经度查询就可以了。然后我可以在返回结果时手动过滤。

有人可以告诉我我做错了什么吗?

【问题讨论】:

  • 我之前没有尝试过 GeoPoint 对象,但不知怎的,我在 YouTube 上遇到了关于 Geoquery 的 this video。希望这会有所帮助。

标签: javascript firebase google-cloud-firestore


【解决方案1】:

我还没有找到只查询经度或纬度的方法。但是,如果您使用正确的纬度创建 GeoPoint,它对我有用。

这将返回我的集合中纬度在 35 到 40 之间的所有文档:

var NORTH = new firebase.firestore.GeoPoint(40, 0);
var SOUTH = new firebase.firestore.GeoPoint(35, 0);

db
  .collection('10k')
  .where('location', '<=', NORTH)
  .where('location', '>=', SOUTH)

工作样本:https://jsbin.com/yatisun/edit?js,console

由于 Firestore 按纬度和经度排序地理点,因此您不能仅根据经度进行过滤。一旦知道要返回的纬度的确切值(因此不是范围),您就只能过滤经度​​。

【讨论】:

  • 啊!按实际地理点搜索!效果惊人,谢谢。我刚刚编辑了您的 jsbin 以尝试进行 EAST-WEST 搜索,但我无法使其正常工作。由于多个字段(纬度和经度)限制不再适用,因为它正在查询地理点本身,我们是否也应该能够进行完整的 NESW 有界搜索?
  • 对不起,我在回答中混淆了纬度和经度。地理点在 Firestore 中按经度和纬度排序,这意味着您只能对经度进行范围查询。目前不支持完整的地理查询。有关这方面的更多信息,请参阅之前的 questions on the topic,或我的(警告:长!)video on the topic
  • 啊,我明白了。您能想出任何方法来完成 NESW 边界查询吗?我今天早上看了你的视频,我们当前的应用程序正在进行半径搜索。但我们真正想做的是边界搜索,而不是使用中心点。这可能吗?
  • Geohash 查询过滤范围,然后在我的视频中,我还按距离过滤(在客户端代码中),因为这是更常见的用例。但我希望视频能很好地解释为什么边界框查询(当前)在 Firestore 中是不可能的:索引是单维/方向的,即使在复合索引的情况下也是如此。请注意,我们已经摆脱了您最初关于如何仅查询经度或纬度的问题,我的回答显示了如何做到这一点。
  • @FrankvanPuffelen 自从您制作视频以来,这有什么变化吗? Firestore 是否获得了任何可能有所帮助的新功能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
相关资源
最近更新 更多