nimotea 发表于 2024-1-31 10:21:10

【锋利的SQL】计算经纬度点之间的物理距离

背景

有些业务场景下,我们需要计算一个经纬度点到另一个经纬度点的实际物理距离。在进行距离计算时,一般地图服务商会提供专门的 api 来计算点位距离。但实际上是存在着公开的公式可以自己来计算出经纬度点位之间的距离 —— 哈弗辛公式。


实操


不同的数据库针对于地理位置计算有着自己的计算函数,这里以mysql 为例,计算两点坐标距离只需要使用:
select ST_DISTANCE_SPHERE( POINT(108.960617,34.27311),POINT(108.98272659129834,34.2825339432422)) FROM table limit 1可以看到 ST_DISTANCE_SPHERE 函数就是专门用来处理地球经纬度距离的计算函数,我们只需要使用两个点的经纬度坐标即可得到结果。


一般的SQL 方案
但是并不是所有的数据库都有自己的地理信息计算函数,一般的数据库中我们该怎么计算点位距离呢,这里就提供以下公式:
select a.*,
ACOS(
                COS(RADIANS(34.27311)) *
                COS(RADIANS(a.纬度)) *
                COS(RADIANS(a.经度) - RADIANS(108.960617)) +
                SIN(RADIANS(34.27311)) *
                SIN(RADIANS(a.纬度))
      ) * 6378000 as distance
from table a这段sql 通过使用了最基本的函数就得到 点位距离,我们只需要根据自身需求来替换上述公式中的经纬度坐标即可,最后的 6378000 为常数参数,不需要修改,最后得到的距离就是以米为单位的点位距离了。熟悉地理信息的小伙伴也了解,现在我们使用的经纬度坐标是有不同的坐标系的,比如 GPS使用的坐标系和高德地图使用的坐标系就不一样,不过上述公式不受坐标系切换的影响,目前所有的坐标系下该公式都能以极小的精度计算出点位物理距离。有相关需求场景的小伙伴赶快去试试吧。




页: [1]
查看完整版本: 【锋利的SQL】计算经纬度点之间的物理距离