我们的App最近需要基于当前所在位置获取相应的课程机构信息(我们是教育类产品)。当然了所有的机构信息肯定是已经采集存入数据库了(由于要显示对应机构的坐标点,那么经纬度数据也理所当然的已经采集了)。
接下来,我们就开始思考怎么根据用户的坐标服务器返回对应远近距离的机构信息。这里移动端人员爽了,说我只给一个坐标即可,后台的人员说:那还不简单,拿着坐标与数据库里的机构坐标进行距离计算(其实就是勾股定理,不知道计算距离的同学可以百度,谷歌),我一听,这还得了,我数据库机构坐标越来越多,你算一次得花我多长时间,用户早就不耐烦了。
又有同学提出区分区域,当然,现在很多应用都是划分区域了的,但是不可避免的区域数据量也可能很大呢?
还好以前研究过这类型的需求,当然了我目前也只知道这种方式,采用GeoHash的方式;它的原理比较简单:将一个经纬度坐标信息,转换成一个可以排序,可以比较的字符串。 需要强调的是,这个字符串不代表坐标,而是一个比较小的区域范围。
需要了解GeoHash算法的人员可以自行百度。网上有各个语言版本的转化。如果你看到了将坐标最后进行了base32编码的话,哪么需要注意了,转为base32编码精度会变得更小,误差增大。我建议坐标点转化为2进制串后,继续转化为大整形数据,这样根据用户坐标点得到的大整形与机构大整形进行相见并绝对值,然后进行大小排序(充分利用数据库的优势),这样的精度更大,误差更小。
总结:将机构坐标点通过GeoHash方式得到2进制,再次转化为大整形,后台接口的到用户坐标后也转化为大整形与机构数据比较结果集排序。
还有更简单的,直接利用百度地图,高德地图提供的API进行查询附近的匹配信息(这个API的前提是在对应的地图后台建立相关表结构,将你系统中需要匹配的信息坐标点存入对应的地图后台表中,然后调用相应的方式查询,具体可查看百度,高德地图的管理)。
说到这里,基本结束了,以上为我们公司所采取的方式,至于那些大公司他们是怎么匹配的,我也不知道,我也很希望哪位仁兄可以透露下。