利用Mysql实现经纬度的计算

发布时间 2023-07-18 10:15:18作者: 卧龙戏公瑾

一、问题产生

最近接到一个需求,在地图上展示指定位置的商铺。我想到的第一解决方案时使用redis的GEO数据类型来解决这个问题,但是后来看了数据库中的数据,发现我们系统里面的商铺并不是很多,所以就想偷个懒,直接用mysql处理。于是百度了一下,还真发现mysql提供了这样的功能。

二、st_distance_sphere函数说明

mysql5.7提供工了st_distance_sphere函数,用来计算球体上两个坐标之间的距离。这个函数的输入参数有三个,st_distance_sphere(g1, g2, [radius]), g1、g2是位置坐标,是Point类型的对象,可以通过Point函数构造。radius表示半径,不传默认为地球半径6,370,986米。st_distance_sphere计算出来的单位是米(m)

注意:mysql5.7版本才开始支持st_distance_sphere函数,如果你的mysql版本低于5.7,这个函数是无法使用的。

三、使用实例

这里举个例子,查询经度为118.767413, 纬度为32.041544附近2000米范围内的所有店铺。

-- POINT(lng,lat)表示将数据库中保存的经度、纬度转换成POINT对象
SELECT 
  * 
FROM 
  crm_repair_factory 
WHERE              
  ST_Distance_Sphere(POINT(118.767413, 32.041544 ),POINT(lng,lat)) <= 2000   

四、总结

Mysql5.7及以上版本,提供了st_distance_sphere函数来方便我们进行经纬度的计算。少量数据的情况下,可以直接使用该种方法进行处理。如果数据量过大,还是建议使用redis的GEO数据类型来进行解决。