【问题标题】:Datastore query for locations within a region区域内位置的数据存储查询
【发布时间】:2017-04-22 19:40:16
【问题描述】:

问题一:

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

我的位置实体如下所示:

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:

如果我将纬度/经度组合存储为谷歌数据存储中的地理点,我如何检查纬度和经度?

例如,如果位置是这样存储的:

Location
  - location (Geopoint)

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

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

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

【问题讨论】:

    标签: google-cloud-datastore gql


    【解决方案1】:

    有关如何执行此操作的示例,请查看 Python 中的“geomodel”库。

    基本前提:

    将您的纬度和经度值划分为离散值(例如,1 度块),然后定义包含该值的“单元格”。然后将它们组合/散列在一起,这样您就有了一个值。

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

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

    【讨论】:

    • 我不太明白你所说的这个策略是什么意思。我使用 1 度单元格,单元格 0 代表纬度:-90.0 到 -89.0 和长:-180.0 到 -179.0。每次 lat 增加时,单元格数量都会增加,一旦 lat 达到 89.0 到 90.0,它会回到 -90.0 到 -89.0 并且 long 增加 1 度。然后位置 (0, 0) 表示为在单元格 32,399 内(该位置是四个不同单元格的角。它在哪个单元格中?)。这是你的建议吗?如果边界框是一个非常小的框,那么单元格是否必须非常具体? (0.0001 度块)
    • 我一直在努力思考这个问题,但我仍然没有完全掌握你的解决方案。您能否再扩展一点,并展示一个示例解决方案?谢谢!
    【解决方案2】:

    查看 Datastore 的 REST API。地理点有一个明确的值类型,您可以在下面的链接中找到它:

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

    您需要做的就是在实体上创建一个地理点值属性(我们称之为 geo),然后您就可以编写如下 GQL 查询:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      相关资源
      最近更新 更多