现今互联网确实从方方面面影响我们的生活。现在我们可以足不出户就能买到我们心仪的衣服,找到附近的美食。当我们点开一个外卖的app就能看到自己附近的餐厅,那我们有没有想过这是怎么实现的呢?
首先我们能想到的就是把所有餐厅的经纬度存下来,然后当用户选择附近餐厅是,我们先获取用户的经纬度,然后到数据库中查出所有的经纬度,依次计算它们和用户间的距离。最后根据用户输入的距离范围过滤出合适的餐厅,并根据距离做一个升序排列。这样貌似能查出附近的餐厅,但是餐厅的数量这么多,直接全查出来内存也要爆掉,即使分批处理计算量也十分大。这样用户等待的时间就会特别长。那有什么办法能减少我们的计算量呢?很简单,我们应该只计算用户关心的那一片数据,而不是计算所有的。例如用户在北京,那完全没必要计算海南,黑龙江,新疆,浙江等其它地区的数据。如果我们能快速定位到北京直至某个区,那么我们的计算量将大大减少。我们发现这其实就是索引的功能,但是MySQL对这种二维的地理位置的索引支持并不友好(mongodb有直接的地理位置索引),它对一维的像字符串这样的支持很好。那如果我们的数据在MySQL中,有没有什么方法能将我们的二维坐标转换为一种可比较的字符串呢?这就是我们今天要介绍的geohash算法。
geohash简单来说就是将一个地理坐标转换为一个可比较的字符串的算法。不过生成的字符串表示的是一个矩形的范围,并不是一个点。比如西二旗地铁附近这一片矩形区域就可以用wx4eyu82这个字符串表示,并且越靠前的编码表示额范围越大,比如中国绝大部分地区可以用w这个字母表示的矩形区域内。像wx4eyu82表示的区域一定在wx4e表示的区域范围内。利用这些特性我们就可以实现附近餐厅的功能了,比如我们希望查看西二旗地铁附近的餐厅就可以这样查询