【实战总结】根据地图经纬度及范围查询坐标点信息

使用地图经纬度及范围查询坐标点信息的场景,在现实开发中还是有很多机会遇到的,比如地图导航类应用计算两点之间的距离及范围、大众点评美团等点餐按照买家和商家的坐标点进行计算距离,等等。

最近在项目中的一个需求和以上问题类似,需要按照用户的地图坐标经纬度查询一定范围内的商户信息。静下心来思考下,把问题拆解分析下就是,已知一个坐标点,按照距离求设定范围的所有坐标点集合。

1、知识准备

计算两点之间的直线距离,想到的最朴素的计算方法就是使用勾股定理,即:

如果把两个坐标点放置在同一平面内,按照地图坐标(x1,y1)到(x2,y2)的距离求解,即:

sqrt((x2-x1)² + (y2-y1)²)

然而众所周知,地球是一个不规则的球体并不是一个平面,因此除了勾股定理之外,还要充分考虑球面弧度带来的距离变化,如下图:

把上面的立体图横切成切面来观察会更加直观,如下图:

clipboard.png

通过上面的图例,我们可以把这个问题再转换下,变成了一道数学题。 

A、B是两个目标坐标点,已存在A的坐标经纬度(lngA,latA),B的坐标经纬度(lngB,latB)

c是A、B同一平面内最短直线距离,这个可以通过勾股定理获取,即sqrt((lngA - lngB)² + (latA - latB)²)

2、实现方法

当我们通过知识储备弄清了问题的本质,掌握了原理,也就解决了问题,接下来我们还需要通过具体实现和途径来解决它。

按照勾股定理自己实现业务逻辑

简单计算平面两点之间的距离,比较简单忽略

使用mysql自带函数st_distance实现

select st_distance(POINT (#latitude#,#longitude#),POINT(latitude,longitude))*111195 from table

利用mysql自带函数计算结果单位是度,需要乘111195(地球半径6371000*PI/180)是将值转化为米即可

借助redis提供的地理空间计算能力实现

还没研究,再有复杂的再去研究下。#TODO

3、参考文章:

https://segmentfault.com/a/1190000016237750

https://blog.csdn.net/YoungLee16/article/details/88540436

猜你喜欢

转载自blog.csdn.net/u013161278/article/details/104162380