mysql sql计算经纬度

原文地址:https://stackoverflow.com/questions/1006654/fastest-way-to-find-distance-between-two-lat-long-points

SELECT 
  name, 
   ( 6371 * acos( cos( radians(' 待计算点的纬度') ) * cos( radians( db_table.lat ) ) 
   * cos( radians(db_table.lng) - radians(' 待计算点的经度')) + sin(radians(' 待计算点的纬度')) 
   * sin( radians(db_table.lat)))) AS distance 
FROM  ‘db_table'
WHERE
HAVING distance < 10 
ORDER BY distance;

该方式计算得到的距离结果单位为 KM ,高德地图坐标系下测试经纬度计算与高德经纬度API计算的误差在米的范围内。 计算距离单位为米的的方式 好像不太准确(使用的高德经纬度测试)。

另一种方式,MySQL 5.7以上

Select st_distance_sphere(POINT(longitude1, latitude1), POINT(longitude2, latitude2)) as distcance

单位 米,KM 需要除以1000

### 使用 MySQL 计算经纬度之间的距离MySQL 中可以利用内置的几何函数或者自定义存储过程来实现两个地理坐标间距离计算。对于基于地球表面的大圆路径上的两点间的最短距离,通常会应用 Haversine 公式来进行估。 #### 方法一:使用Haversine公式的手动实现 下面是一个可以直接嵌入到 SQL 查询中的表达方式: ```sql SELECT id, ( 6371 * acos( cos(radians(start_latitude)) * cos(radians(end_latitude)) * cos(radians(end_longitude) - radians(start_longitude)) + sin(radians(start_latitude)) * sin(radians(end_latitude)) ) ) AS distance_km FROM table_name; ``` 这段代码实现了 Haversine 公式的具体运逻辑,并假设地球半径为 6371 千米[^1]。 #### 方法二:创建并调用存储函数 为了简化查询语句,在数据库中预先定义好一个专门用来处理此类问题的函数也是一种不错的选择。这里给出一段适用于 MySQL 的例子: ```sql DELIMITER $$ CREATE FUNCTION get_distance_between_points ( lat1 DOUBLE, lon1 DOUBLE, lat2 DOUBLE, lon2 DOUBLE ) RETURNS DOUBLE DETERMINISTIC BEGIN RETURN ( 6371 * ACOS( COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * COS(RADIANS(lon2)-RADIANS(lon1))+ SIN(RADIANS(lat1))* SIN(RADIANS(lat2)) ) ); END$$ DELIMITER ; ``` 之后就可以像这样轻松获取任意两地点间的直线距离了(单位默认为千米): ```sql SELECT get_distance_between_points(latitude_1, longitude_1, latitude_2, longitude_2); ``` 需要注意的是上述方法均假定地球为完美的球体,实际上它更接近于椭圆形;因此这些法提供的结果可能不是绝对精确的测量值,但对于大多数应用场景来说已经足够准确了[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值