App后台获取自己的地图位置P,计算所在位置P与北京所有餐馆的距离,然后返回距离<=1000米的餐馆。但是北京的餐馆何其多啊,这样计算不得了,于是想了,既然知道经纬度了,那应该知道自己在朝阳区,那应该计算所在位置P与朝阳区所有餐馆的距离啊,但是朝阳区也很多餐馆啊,应该计算所在位置P与所在街道所有餐馆的距离,这样计算量又小了,效率也提升了。就是通过过滤的方法来减小参与计算的餐馆数目,从某种角度上讲,这里使用索引技术。
一提到索引,大家脑子里马上浮现出B树索引,因为大量的数据库(如MySQL、oracle、PostgreSQL等)都在使用B树。B树索引本质上是对索引字段进行排序,然后通过类似二分查找的方法进行快速查找,即它要求索引的字段是可排序的,一般而言,可排序的是一维字段,比如时间、年龄、薪水等等。但是对于空间上的一个点(二维,包括经度和纬度),如何排序呢?又如何索引呢?解决的方法很多,下文介绍一种方法来解决这一问题。
思想:如果能通过某种方法将二维的点数据转换成一维的数据,那样不就可以继续使用B树索引了嘛。那这种方法真的存在嘛,答案是肯定的。目前很火的GeoHash算法就是运用了上述思想,GeoHash将二维的经纬度转换成字符串,每一个字符串代表了某一地图区域,通过对比字符串来计算距离。不仅外卖app,地图app,大众点评等生活商圈app,都是这样来给用户推荐附近商家的。
关于GeoHash的学习,我这里有一套葵花宝典,赠送给大家
————————–
GeoHash算法能完美的解决地图定位功能中关于按距离排序的需求,比如App中摇一摇附近的人,推荐附近商户等功能是怎么实现的?在用户图像中,如何有效地获取用户的商圈,生活圈等商业兴趣?
1)GeoHash用一个字符串表示经度和纬度两个坐标,比如我现在所在位置的GeoHash值为 wx4sv61q;
2)GeoHash标识的并不是一个点,而是一个区域,比如 wx4sv61q 对应的就是一个矩形区域;
3)编码的前缀可以标识更大的区域,比如 wx4sv61 编码代表的区域要大于 wx4sv61q 代表的区域,但是 wx4sv61q 代表的区域一定在 wx4sv61 代表的区域内。
因此我们再去做距离检索的时候,只需要对GeoHash进行前缀匹配即可,具体的实现请看视频
视频重点:
GeoHash算法应用的具体场景,GeoHash算法的实现原理与常见的问题,Base32编码的用法,百度地图GeocodingAPI的应用与实战,GeoHash算法在用户画像上的实战应用
===============课程目录===============
更多视频详见腾讯视频-小牛学堂

评论(0)