ST_DISTANCE_SPHERE
功能概述
按球面模型计算两个经纬度坐标之间的大圆距离,单位为米。适合计算门店与用户的距离、轨迹点之间的移动距离等,精度满足城市级别的业务分析。地球半径取 6371010 米;需要测绘级精度的场景应使用椭球模型的专业 GIS 工具。
语法
ST_DISTANCE_SPHERE(<lon1>, <lat1>, <lon2>, <lat2>)
参数说明
-
<lon1>
<lon1>
、<lat1>
<lat1>
:DOUBLE 类型,第一个点的经度和纬度,单位为度。
-
<lon2>
<lon2>
、<lat2>
<lat2>
:DOUBLE 类型,第二个点的经度和纬度,单位为度。
⚠️ 注意:参数顺序是“经度在前、纬度在后”。经度超出 [-180, 180] 或纬度超出 [-90, 90] 时返回 NULL,不报错。
任一参数为 NULL 时返回 NULL。返回 DOUBLE 类型。
使用示例
计算北京两个坐标点之间的距离,保留 6 位小数:
SELECT CAST(st_distance_sphere(116.35620117, 39.939093, 116.4274406433, 39.9020987219) AS DECIMAL(20, 6)) AS meters;
同一点距离为 0,坐标越界返回 NULL:
SELECT st_distance_sphere(0, 0, 0, 0) AS same_point,
st_distance_sphere(181, 0, 0, 0) AS bad_lon,
st_distance_sphere(0, 91, 0, 0) AS bad_lat;
| same_point | bad_lon | bad_lat |
|---|
| 0.0 | NULL | NULL |
查找距离用户 5 公里以内的门店:
SELECT store, round(st_distance_sphere(s_lon, s_lat, 116.397128, 39.916527) / 1000, 2) AS km
FROM VALUES
('王府井店', 116.410886, 39.913720),
('西单店', 116.374072, 39.913423),
('望京店', 116.481069, 39.996794) AS t(store, s_lon, s_lat)
WHERE st_distance_sphere(s_lon, s_lat, 116.397128, 39.916527) <= 5000
ORDER BY km;
望京店距离超过 5 公里,被过滤掉。
注意事项
- 结果单位是米。
- 输入坐标需与业务数据使用同一坐标系。国内地图服务(高德、腾讯等)返回的通常是 GCJ-02 坐标,GPS 设备返回的是 WGS-84 坐标,可用 ST_WGS84_TO_GCJ02 统一。
相关文档