微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用GeoHash进行地理空间查询

如何解决使用GeoHash进行地理空间查询

假设我有这些GeoHash编码的地理位置坐标

位置1

1110001100111000010001010111101001010000100010000000111000010000-> (14.580919034779072,120.97617074847221)-> (14.580918867141008,120.97617108374834)-> wdw4bykhj071

位置#2

1110001100111000010001001010110101101001111100010000010011100000-> (14.5118791423738,121.01672273129225)-> (14.511878974735737,121.01672306656837)-> wdw49cc9y42f

位置#3

1110001100111000010001010111101001010111111110110100001100000000-> (14.581578020006418,120.9766186773777)-> (14.581577852368355,120.97661901265383)-> wdw4bykrze1h

Long值和String哈希都存储在数据库中。而且我知道位置#1和位置#2都位于以下位置的1KM半径之内:

1110001100111000010001010111101001010111111110110100001100000000-> (14.581578020006418,120.97661901265383)-> wdw4bykrze1h

我正在尝试查看是否可以使用startsWith进行数据库查询


txn.findStartsWith("Stores","geoHash",queryHash);

但是位置#1和#2都看起来像这样:“ wdw4bykrze1h”,“ wdw4bykhj071”,显然是“ wdw4bykrze1h”,因为它是完全相同的位置,但是,hash应该是什么以GeoHash表示的“半径1公里内”的值?是queryHash = "wdw4byk"吗?还是其他?

String hash = "wdw4bykrze1h"; // this is the reference point query
String queryHash = geohash.toBase32().substring(0,3); 

这里的substring的值应该是什么才能使其成为“ 1 KM”半径查询

解决方法

这不是那么容易。

Wikipedia article on Geohash列出了两个问题:边缘情况和非线性。

边缘情况意味着,如果您恰好靠近Geohash后面的拼贴系统的某些边界,则半径1公里内的某些位置的前缀可能会非常不同。

非线性是指例如靠近赤道的4个字符的前缀表示区域为20km * 40km,而靠近两极的则为20km * 1km。

平均最接近1平方公里的前缀长度为6个字符。但是,您应该考虑计算邻居前缀以覆盖边缘情况和经度跨度(非线性),尤其是在极点附近。

而且,由于查询覆盖的矩形或多或少,并且您要一个圆,因此应过滤结果以使其真正位于所需的圆之内。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。