数据存储区查询区域内的位置

时间:2016-12-07 18:22:41

标签: google-cloud-datastore gql

问题1:

我正在使用带有App Engine Flex的Google Datastore(Java客户端库),我正在存储位置数据。我想查询矩形区域内的位置列表。

我的位置实体如下所示:

Location
  - lat (eg. -56.1)
  - long (eg. 45.6)

Google数据存储区在查询不同属性的多个不等式方面存在局限性,因此无法使用GQL进行查询:

SELECT * FROM Location WHERE lat <= @maxLat AND lat >= @minLat AND long <= @maxLong AND long >= @minLong

maxLatminLatmaxLongminLong代表搜索地点的边界矩形。

目前我只使用一个过滤器进行查询:

SELECT * FROM Location WHERE lat <= @maxLat AND lat >= @minLat

从返回的结果中,我也过滤出经度范围内的那些。如果不采用这种策略,有没有更好的方法呢?

问题2:

如果我将纬度/经度组合存储为Google Datastore中的Geopoint,我该如何检查纬度和经度?

例如,如果位置存储如下:

Location
  - location (Geopoint)

我无法使用Java客户端库过滤Geopoint中的纬度/经度。

SELECT * FROM Location WHERE location.long <= @maxLong

Datastore Geopoint属性是否有解决方法?

2 个答案:

答案 0 :(得分:2)

有关如何执行此操作的示例,请查看&#39; geomodel&#39; Python中的库。

基本前提:

将纬度和经度值划分为离散值(例如,1度块),通过定义&#39;单元格&#39;该值包含在。合并/散列然后一起,所以你有一个值。

现在,您可以通过对这些单元格执行相等过滤来转换对有界矩形中位置的查询。如果您的有界矩形没有与单元格边缘完全对齐,则在末尾过滤后。

与时间相关的相关示例是:Is datastore good for storing hr shifts?

答案 1 :(得分:-1)

查看Datastore的REST API。地理位置有一个显式值类型,您可以在以下链接中找到它:

https://cloud.google.com/datastore/docs/reference/rest/v1/projects/runQuery#Value

然后你需要做的就是在一个实体上创建一个geopoint值属性(让我们称它为geo)然后你就可以编写这样的GQL查询了:

SELECT * FROM Address WHERE geo.latitude <= @maxLat AND geo.latitude >= @minLat