搜索Datastore中最近的10个地点

时间:2017-07-28 16:23:21

标签: google-app-engine google-cloud-datastore google-cloud-platform google-compute-engine google-cloud-functions

我有很多实体包含存储在Google数据存储区中的geoPoints。 现在,我需要根据发送到Google Cloud功能的位置获取最近的10个位置 我看到,Google的App Engine中有一个 distance()功能,但在Google Cloud Functions中没有任何可比性,甚至无法计算数据库中的任何内容。

是否可以仅使用Google Cloud Functions从数据存储中获取10个最近的位置,还是需要使用其他数据库?

最诚挚的问候,
帕斯卡

3 个答案:

答案 0 :(得分:2)

我们在AppEngine上运行地理空间繁重的服务。

我们的解决方案是将位置存储在Memcache上并直接进行计算,而不是依赖于数据库。

这显然取决于地点的数量,但如果您对如何存储地点非常聪明,则可以非常快速地进行搜索。

R-Trees是一个很好的例子:https://en.wikipedia.org/wiki/R-tree

答案 1 :(得分:2)

我有类似的需求,我用基于网格的聚类方案解决了它。

基本上我创建了一个Computed String Property,它是纬度和放大器的字符串连接。经度小数被砍掉。

如果某个实体有obj.latitude = 37.123456& obj.longitude = 45.234567然后obj.grid_id="37:45"

执行搜索时,我会确定搜索范围&的网格。经度以及其他8个周围的网格,并查询所有居住在这9个网格中的实体。

#  for search latitude = 37.456 & longitude = 45.67

query = SomeModel.query(SomeModel.grid_id.IN([
'36:44', '36:45', '36:46',
'37:44', '37:45', '37:46',
'38:44', '38:45', '38:46',
]))

然后,您将在代码中找到最近的10个。

根据您的需要,您可能希望使网格ID包含小数位(obj.grid_id="37.1:45.2")或使其不那么精确(obj.grid_id="30:40"

根据您的数据点的分布情况,这可能会或可能不会对您有用,在这种情况下,Zebs建议使用R-Tree更加强大,但这很容易实现并且足以满足我的需求。

答案 2 :(得分:0)

请看下面的帖子

Geospatial Query at Google App Engine Datastore

不幸的是,无法从谷歌云数据存储区本身获取最近的位置。您必须实现自己的逻辑,或者必须使用不同的数据库