Google app engine 谷歌应用引擎:查询geohash
我有一个geohash的db.StringProperty(),通过给定一个hashcode,如何找到更接近10的结果 我在下面试过,但似乎不对Google app engine 谷歌应用引擎:查询geohash,google-app-engine,Google App Engine,我有一个geohash的db.StringProperty(),通过给定一个hashcode,如何找到更接近10的结果 我在下面试过,但似乎不对 pois = POI.all().filter('geohash <', h_latlng).order('-geohash').fetch(10) pois=POI.all().filter('geohashgeohash无法完成查找n个最近结果的任务。您可以通过前缀查找任何正方形区域的内容。但要查找包含n个最近结果的可靠结果,您需要获取至少
pois = POI.all().filter('geohash <', h_latlng).order('-geohash').fetch(10)
pois=POI.all().filter('geohashgeohash无法完成查找n个最近结果的任务。您可以通过前缀查找任何正方形区域的内容。但要查找包含n个最近结果的可靠结果,您需要获取至少9个前缀,这使得查询成本相当高。更复杂的是,需要计算9个正方形的前缀。
在我看来,这个问题目前是一个很难在app engine上有效解决的问题。到目前为止,我已经研究了一年了,还没有找到一个复杂而快速的解决方案。一个带有地理索引或2个不等式的关系数据库将更好更快地执行这些任务。但我也对好的解决方案感兴趣。:-)
引用大卫·特洛伊:
Geohash还具有如下属性:
位数减少(从
右图),精确度下降。这
属性可用于进行边界处理
框搜索,作为靠近一的点
另一个将共享类似的Geohash
前缀
但是,因为给定的点可能
出现在给定Geohash的边缘
边界框,有必要
在中生成Geohash值的列表
以执行真正的接近
搜索一个点。因为
Geohash算法使用base-32
编号系统,可以
派生周围的Geohash值
使用
简单的查找表
请参阅:为什么是9?您可以从覆盖感兴趣点的最小正方形开始,然后从那里展开。您必须获取的数字取决于该点周围的点密度。9(或者可能只有4)实际上已经假设您知道“缩放”保存足够数据且数据均匀分布的级别。如果不这样做,情况会更糟。问题是边界情况:如果查询p=(lat,lng)=(0.001,-0.001),并且在伦敦有100个poi,lng>0,而lng<0,则没有。您的查询点散列在(二进制)00*而你的数据是01*你会怎么做?是的,所以如果它靠近一个角落,你可能需要4个,但不是9个。我认为你的假设也非常乐观。:)