MySQL 计算地球两点之间的球面距离

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

其中lat1long1是第一个坐标的纬度和经度,lat2long2是第二个坐标的纬度和经度,Δ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 是需要计算的表,lat1long1 代表我们要计算距离的第一个坐标, lat2long2 代表第二个坐标。这样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来计算地球两点之间的球面距离。这种方法在很多需要处理地理位置信息的场景下非常有用,比如应用于附近地点的搜索和推荐。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程