Google 云数据存储区的地理空间查询

Geospatial queries over Google Cloud Datastore

Google 云数据存储的文档详细介绍了 地理点 数据类型 [1]。虽然 strictly 在 Java 库中没有相应的 class,但有一个 LatLng class [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()

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

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

我的问题是:数据存储中是否 native/first-class 支持地理空间查询?还是这种坐标几何-"hackery"是唯一被接受的方法searches/queries?


[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

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

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

上述参考文献中的确切陈述

"Python GQL supports functions DATETIME, DATE, TIME, KEY, USER, and GEOPT. Cloud Datastore GQL supports function DATETIME and KEY, but with different arguments. Cloud Datastore GQL supports function BLOB. Cloud Datastore GQL does not support GEOPT."

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

进行操作

但是,它目前处理不正确,边界框查询,如开头问题中的那个,也 returns 点只满足一个约束(在我的例子中, latitude部分点满足约束但longitude)。

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