mysql geohash_算法:geohash

现今互联网确实从方方面面影响我们的生活。现在我们可以足不出户就能买到我们心仪的衣服,找到附近的美食。当我们点开一个外卖的app就能看到自己附近的餐厅,那我们有没有想过这是怎么实现的呢?

首先我们能想到的就是把所有餐厅的经纬度存下来,然后当用户选择附近餐厅是,我们先获取用户的经纬度,然后到数据库中查出所有的经纬度,依次计算它们和用户间的距离。最后根据用户输入的距离范围过滤出合适的餐厅,并根据距离做一个升序排列。这样貌似能查出附近的餐厅,但是餐厅的数量这么多,直接全查出来内存也要爆掉,即使分批处理计算量也十分大。这样用户等待的时间就会特别长。那有什么办法能减少我们的计算量呢?很简单,我们应该只计算用户关心的那一片数据,而不是计算所有的。例如用户在北京,那完全没必要计算海南,黑龙江,新疆,浙江等其它地区的数据。如果我们能快速定位到北京直至某个区,那么我们的计算量将大大减少。我们发现这其实就是索引的功能,但是MySQL对这种二维的地理位置的索引支持并不友好(mongodb有直接的地理位置索引),它对一维的像字符串这样的支持很好。那如果我们的数据在MySQL中,有没有什么方法能将我们的二维坐标转换为一种可比较的字符串呢?这就是我们今天要介绍的geohash算法。

geohash简单来说就是将一个地理坐标转换为一个可比较的字符串的算法。不过生成的字符串表示的是一个矩形的范围,并不是一个点。比如西二旗地铁附近这一片矩形区域就可以用wx4eyu82这个字符串表示,并且越靠前的编码表示额范围越大,比如中国绝大部分地区可以用w这个字母表示的矩形区域内。像wx4eyu82表示的区域一定在wx4e表示的区域范围内。利用这些特性我们就可以实现附近餐厅的功能了,比如我们希望查看西二旗地铁附近的餐厅就可以这样查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值