使用MySQL计算两点间距离(mysql 两点间距离)
使用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 distanceFROM geotable a
CROSS JOIN geotable bWHERE 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应用中的位置分析和空间可视化来说相当实用。