MySql根据经纬度算距离

本文深入探讨了SQL中用于计算两点间地理距离的复杂公式,该公式基于经纬度使用球面三角公式计算地球上两点间的实际距离。通过分析SQL查询语句,详细解释了公式中的数学原理,包括正弦、余弦及平方根等运算的应用。

SELECT (ROUND(6378.138*2*ASIN(SQRT(POW(SIN((#{latitude}*PI()/180-a.shop_latitude*PI()/180)/2),2)+COS(#{latitude}*PI()/180)*COS(a.shop_latitude*PI()/180)*POW(SIN((#{longitude}*PI()/180-a.shop_longitude*PI()/180)/2),2)))))

as distance from shop a

### 使用 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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值