我有很多实体包含存储在Google数据存储区中的geoPoints。 现在,我需要根据发送到Google Cloud功能的位置获取最近的10个位置 我看到,Google的App Engine中有一个 distance()功能,但在Google Cloud Functions中没有任何可比性,甚至无法计算数据库中的任何内容。
是否可以仅使用Google Cloud Functions从数据存储中获取10个最近的位置,还是需要使用其他数据库?
最诚挚的问候,
帕斯卡
答案 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
不幸的是,无法从谷歌云数据存储区本身获取最近的位置。您必须实现自己的逻辑,或者必须使用不同的数据库