问题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
其中 maxLat
, minLat
, maxLong
和 minLong
表示搜索位置的边界矩形 .
目前我只使用一个过滤器查询:
SELECT * FROM Location WHERE lat <= @maxLat AND lat >= @minLat
从返回的结果中,我也过滤出经度范围内的那些 . 有没有更好的方法来做到这一点,而不采取这种策略?
问题2:
如果我将纬度/经度组合存储为Google Datastore中的Geopoint,我该如何检查纬度和经度?
例如,如果位置存储如下:
Location
- location (Geopoint)
我无法使用Java客户端库过滤Geopoint中的lat / long .
SELECT * FROM Location WHERE location.long <= @maxLong
是否有数据存储区Geopoint属性的解决方法?
2 回答
有关如何执行此操作的示例,请查看Python中的“geomodel”库 .
基本前提:
将纬度和经度值除以离散值(例如,1度块),通过定义包含值的“单元格” . 然后将组合/哈希组合在一起,这样就可以得到单个值 .
现在,您可以通过对这些单元格执行相等过滤来转换对有界矩形中位置的查询 . 如果您的有界矩形不完全与单元格边缘对齐,则在末尾过滤后 .
与时间一起执行此操作的相关示例是:Is datastore good for storing hr shifts?
查看Datastore的REST API . 地理位置有一个显式值类型,您可以在以下链接中找到:
https://cloud.google.com/datastore/docs/reference/rest/v1/projects/runQuery#Value
您需要做的就是在实体上创建一个geopoint值属性(让我们称之为geo)然后您将能够编写如下的GQL查询: