【问题标题】:Geospatial queries over Google Cloud Datastore通过 Google Cloud Datastore 进行地理空间查询
【发布时间】:2020-01-27 14:24:13
【问题描述】:

Google Cloud Datastore 的文档详细介绍了 地理点 数据类型 [1]。虽然 Java 库中没有严格对应的类,但有一个 LatLng 类 [2] 似乎是规范的等价物。

虽然我可以很好地存储值,但我可以通过提供一个完全构造的 LatLng 实例来查询 准确 位置,如下所示:

ofy.load().type(Site.class) // Site is a custom class, whose latLng field is a LatLng-type
        .filter("latLng", LatLng.of(26.329,127.744))
        .first()
        .now()

我似乎无法在本地进行 inexact 查询,至少不能在控制台上进行。虽然我可以在 Objectify 中某种做类似的事情:

ofy.load().type(Site.class)
        .filter("latLng >", LatLng.of(26.0,127.0))
        .filter("latLng <", LatLng.of(90,127.750))
        .first()
        .now()

我的问题是:数据存储区中是否有对地理空间查询的原生/一流支持?还是这种坐标几何——“hackery”是进行此类搜索/查询的唯一可接受的方式?


[1]https://cloud.google.com/datastore/docs/concepts/entities#geographical_point [2]https://googleapis.dev/java/google-cloud-clients/0.111.0-alpha/com/google/cloud/datastore/LatLng.html

【问题讨论】:

    标签: java google-cloud-datastore geospatial objectify


    【解决方案1】:

    根据以下文档,GQL 有两种风格。 Python NDB/DB 中使用的风格具有执行空间查询的 GEOPT 功能。但是控制台中使用的风味没有这个和其他一些功能。

    https://cloud.google.com/datastore/docs/reference/gql_reference

    来自上述参考的确切陈述

    "Python GQL 支持函数 DATETIME、DATE、TIME、KEY、USER 和 GEOPT。Cloud Datastore GQL 支持函数 DATETIME 和 KEY,但参数不同。Cloud Datastore GQL 支持函数 BLOB。Cloud Datastore GQL 不支持 GEOPT。 "

    【讨论】:

      【解决方案2】:

      所以它看起来像 Datastore 确实,实际上,它原生处理 LatLng 类型,允许您对其进行不精确的查询。不精确查询的所有各种限制都适用(只能有一个不精确查询的属性,它必须被索引等),并且该类型的索引大小(16 字节)建议一对double 的内部表示s,实验似乎表明该查询首先过滤 latitudes,然后过滤 longitudes

      但是,它目前处理不正确,并且作为开始问题中的一个边界框查询也返回仅满足其中一个约束的点(在我的情况下,纬度一些点满足约束但不满足经度)。

      我已通过问题跟踪器向 Google 报告了该问题,他们已在内部重现该问题,并将其转发给 Datastore 团队进行解决。收到他们的回复后,我会更新此答案。

      【讨论】:

      猜你喜欢
      • 2017-01-16
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多