使用MySQL计算两点间距离
在传统的GIS(地理信息系统)应用中,计算两点之间的距离通常需要使用专业的地图软件或者GPS设备。然而,随着互联网的普及,越来越多的应用需要在Web环境下获取两点之间的距离,这时候MySQL数据库提供的地理信息函数便可以起到不小的作用。
1. 准备工作
我们需要准备一个地理坐标表。该表包含3个字段:id、lat、lng,分别表示地理坐标点的唯一ID以及对应的经度和纬度。创建代码如下:
CREATE TABLE `geotable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lat` decimal(10,8) DEFAULT NULL,
`lng` decimal(11,8) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后我们往表里面加入一些地理坐标点:
INSERT INTO `geotable` (`id`, `lat`, `lng`) VALUES
(1, '31.230416', '121.473701'),
(2, '31.238557', '121.499168'),
(3, '31.215345', '121.428687'),
(4, '31.223807', '121.454199'),
(5, '31.245282', '121.449542'),
(6, '31.216615', '121.452091'),
(7, '31.243115', '121.463413'),
(8, '31.228772', '121.440966'),
(9, '31.203437', '121.441495'),
(10, '31.247104', '121.476976');
这些经纬度是上海市内的一些标志性建筑物。
2. 计算两点之间的距离
MySQL提供了一个地理信息函数ST_DISTANCE_SPHERE(),可以计算地球上两点之间的距离。该函数的语法如下:
ST_DISTANCE_SPHERE(point1, point2)
其中,point1和point2都是POINT类型的字面量,表示纬度和经度。下面是一个例子:
SELECT ST_DISTANCE_SPHERE(POINT(31.23, 121.47), POINT(31.24, 121.50));
这条SQL语句的输出结果是:
1929.659944665127
单位是米。
如果要计算两个表中所有地理坐标点之间的距离,可以使用以下语句:
SELECT
a.id AS id1,
b.id AS id2,
ROUND(ST_DISTANCE_SPHERE(POINT(a.lat, a.lng), POINT(b.lat, b.lng))) AS distance
FROM geotable a
CROSS JOIN geotable b
WHERE a.id
这条SQL语句利用了CROSS JOIN,生成了所有可能的点对组合,并且使用WHERE子句去除了两个ID相同的组合。输出结果如下:
+-----+-----+----------+
| id1 | id2 | distance |
+-----+-----+----------+
| 1 | 2 | 2859 |
| 1 | 3 | 6393 |
| 1 | 4 | 3781 |
| 1 | 5 | 2627 |
| 1 | 6 | 4426 |
| 1 | 7 | 2765 |
| 1 | 8 | 2121 |
| 1 | 9 | 6487 |
| 1 | 10 | 5055 |
| 2 | 3 | 9339 |
| 2 | 4 | 6327 |
| 2 | 5 | 5065 |
| 2 | 6 | 7505 |
| 2 | 7 | 1964 |
| 2 | 8 | 4913 |
| 2 | 9 | 10098 |
| 2 | 10 | 2349 |
| 3 | 4 | 4326 |
| 3 | 5 | 8587 |
| 3 | 6 | 2720 |
| 3 | 7 | 7388 |
| 3 | 8 | 10058 |
| 3 | 9 | 1697 |
| 3 | 10 | 10877 |
| 4 | 5 | 2450 |
| 4 | 6 | 8279 |
| 4 | 7 | 3850 |
| 4 | 8 | 6340 |
| 4 | 9 | 6035 |
| 4 | 10 | 7655 |
| 5 | 6 | 5907 |
| 5 | 7 | 5084 |
| 5 | 8 | 8793 |
| 5 | 9 | 8613 |
| 5 | 10 | 2797 |
| 6 | 7 | 6706 |
| 6 | 8 | 4679 |
| 6 | 9 | 7366 |
| 6 | 10 | 5151 |
| 7 | 8 | 2953 |
| 7 | 9 | 9023 |
| 7 | 10 | 2328 |
| 8 | 9 | 6907 |
| 8 | 10 | 3994 |
| 9 | 10 | 9692 |
+-----+-----+----------+
可以看到,该SQL语句返回了所有可能组合的地理坐标点之间的距离,可以用于后续的分析和应用。
3. 总结
本文介绍了如何使用MySQL计算两点之间的距离,通过ST_DISTANCE_SPHERE()函数和CROSS JOIN,我们可以很方便地计算任意两个地理坐标点之间的距离。这对于Web应用中的位置分析和空间可视化来说相当实用。