我有很多包含geoPoints的实体存储在Google的数据存储中。 现在,我需要根据发送到Google云功能的位置获取10个最近的位置。
我看到,在谷歌的App Engine中有一个distance((函数,但在谷歌云函数中没有可比性,甚至不可能计算数据库中的任何内容。
是否可以仅使用Google云功能从数据存储中获取10个最近的位置,还是需要使用其他数据库?
最好的问候,
帕斯卡
我们在 AppEngine 上运行一个地理空间密集型服务。
我们的解决方案是将位置存储在Memcache上并直接进行计算,而不是依赖数据库。
这显然取决于位置的数量,但是如果您对如何存储位置很聪明,则可以非常快速地进行搜索。
R树就是一个很好的例子:https://en.wikipedia.org/wiki/R-tree
我也有类似的需求,我用基于网格的聚类方案解决了它。
本质上,我创建了一个计算字符串属性,它是纬度和经度的字符串串联,小数被砍掉。
如果一个实体有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 的建议更强大,但这很容易实现并且足以满足我的需求。
请看下面的帖子
Google App Engine Datastore 中的地理空间查询
不幸的是,无法从谷歌云数据存储本身获取最近的位置。您必须实现自己的逻辑,或者必须使用不同的数据库