MySQL 计算地球两点之间的球面距离
阅读更多:MySQL 教程
什么是Great Circle Distance?
Great Circle Distance(大圆距离),是地球上两点之间在球面上的最短弧线,也叫做球面距离(spherical distance)或者是大圆中心角(central angle)。
Haversine formula
Haversine公式是基于大圆中心角(Central angle)来计算球面距离的,公式如下:
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c
其中lat1
和long1
是第一个坐标的纬度和经度,lat2
和long2
是第二个坐标的纬度和经度,Δlat
和Δlong
分别是两个坐标纬度和经度的差值。而R
是地球的半径,一般使用6371km
表示。
MySQL实现Great Circle Distance的Haversine公式
在MySQL中,我们可以使用以下语句实现Great Circle Distance的Haversine公式
SELECT id,
(6371 * ACOS( COS( RADIANS(lat1) ) * COS( RADIANS(lat2) ) * COS( RADIANS(long2) - RADIANS(long1)) + SIN( RADIANS(lat1) ) * SIN( RADIANS(lat2) ) ) ) AS distance FROM table_name;
其中 table_name
是需要计算的表,lat1
和 long1
代表我们要计算距离的第一个坐标, lat2
和 long2
代表第二个坐标。这样MySQL就会返回你需要的对应距离。
示例
假设我们现在有一张名为 locations
的表,表中存放了一些坐标。表结构如下:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
lat DECIMAL(10,8),
long DECIMAL(11,8)
);
在这个表中我们有三条数据,分别代表三个位置和对应的经纬度。
INSERT INTO locations (name, lat, long) VALUES ("New York", 40.7128, -74.0060);
INSERT INTO locations (name, lat, long) VALUES ("Los Angeles", 34.0522, -118.2437);
INSERT INTO locations (name, lat, long) VALUES ("London", 51.5074, -0.1278);
现在我们想要计算伦敦和纽约之间的距离,我们只需要执行以下语句:
SELECT id,
(6371 * ACOS( COS( RADIANS(51.5074) ) * COS( RADIANS(40.7128) ) * COS( RADIANS(-74.0060) - RADIANS(-0.1278)) + SIN( RADIANS(51.5074) ) * SIN( RADIANS(40.7128) ) ) ) AS distance
FROM locations WHERE name IN ("New York", "London");
这样我们就能得到伦敦和纽约之间的距离是 5588.69
公里。
总结
通过Haversine公式,我们可以用MySQL来计算地球两点之间的球面距离。这种方法在很多需要处理地理位置信息的场景下非常有用,比如应用于附近地点的搜索和推荐。