mysql 计算两点之间距离
MySQL 可以通过以下公式计算两点之间的距离:
SELECT
ROUND(6378.138 * 2 * ASIN(SQRT(POW(SIN((lat1 * PI() / 180 - lat2 * PI() / 180) / 2), 2) + COS(lat1 * PI() / 180) * COS(lat2 * PI() / 180) * POW(SIN((lng1 * PI() / 180 - lng2 * PI() / 180) / 2), 2))), 2) AS distance
FROM
table_name
WHERE
...
其中,lat1
、lng1
和 lat2
、lng2
分别表示两个经纬度点的纬度和经度,table_name
是要查询的表名,...
是查询条件。
公式中的 6378.138
是地球半径的公里数,可以根据实际需要进行修改。ASIN
表示反正弦函数,SIN
和 COS
表示正弦和余弦函数,POW
表示幂函数,PI
表示圆周率。ROUND
函数用于将计算结果保留两位小数。
需要注意的是,这个公式是基于球体模型的计算,对于近地面的计算结果可能会有一定误差。
mysql计算两点之间距离函数
你可以在 MySQL 中自定义函数来计算两点之间的距离,这样可以方便地在查询中使用。以下是一个基于 Haversine 公式的 MySQL 自定义函数:
DELIMITER $$
CREATE FUNCTION `distance`(lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT)
RETURNS FLOAT
DETERMINISTIC
BEGIN
DECLARE R INT DEFAULT 6371;
DECLARE dLat FLOAT DEFAULT RADIANS(lat2 - lat1);
DECLARE dLon FLOAT DEFAULT RADIANS(lon2 - lon1);
DECLARE a FLOAT;
DECLARE c FLOAT;
DECLARE d FLOAT;
SET a = SIN(dLat/2) * SIN(dLat/2) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * SIN(dLon/2) * SIN(dLon/2);
SET c = 2 * ATAN2(SQRT(a), SQRT(1-a));
SET d = R * c;
RETURN d;
END$$
DELIMITER ;
该函数接受四个参数,分别是两个经纬度点的纬度和经度,返回值是它们之间的距离,单位为千米(km)。
需要注意的是,由于 MySQL 的限制,自定义函数必须使用 DELIMITER
命令来改变语句结束符,默认为分号(;
),否则会出现语法错误。在 DELIMITER
命令之后,我们定义了一个名为 distance
的函数,它使用了 Haversine 公式来计算两点之间的距离,并将结果返回。在函数体中,我们使用了 DECLARE
命令来定义变量,SET
命令来赋值,RETURN
命令来返回函数结果。最后,我们使用 DELIMITER
命令将语句结束符改回分号。
mysql计算两个坐标经纬度之间的距离
可以使用MySQL内置的地理空间函数ST_Distance_Sphere来计算两个经纬度坐标之间的距离,示例如下:
假设我们有一个名为location的表,其中包含id、longitude和latitude字段,分别表示地点的唯一标识、经度和纬度。
首先,需要为location表的longitude和latitude字段创建一个地理空间索引,命令如下:
ALTER TABLE location ADD SPATIAL INDEX(lonlat);
接下来,可以使用ST_Distance_Sphere函数来计算两个经纬度坐标之间的距离,如下所示:
SELECT ST_Distance_Sphere(point(longitude1, latitude1), point(longitude2, latitude2)) AS distance
FROM location
WHERE id = 1;
其中,point(longitude, latitude)函数用于将经度和纬度转换为地理坐标点,distance表示两个坐标点之间的距离,单位为米。
注意:在MySQL 8.0以前的版本中,建议使用ST_Distance函数来计算两个经纬度坐标之间的距离。
相关推荐













