27 lines
576 B
SQL
27 lines
576 B
SQL
DELIMITER $$
|
|
|
|
CREATE FUNCTION haversine (
|
|
lat1 FLOAT, lon1 FLOAT,
|
|
lat2 FLOAT, lon2 FLOAT
|
|
) RETURNS FLOAT
|
|
NO SQL DETERMINISTIC
|
|
BEGIN
|
|
DECLARE r FLOAT unsigned DEFAULT 6372.8;
|
|
DECLARE dLat FLOAT unsigned;
|
|
DECLARE dLon FLOAT unsigned;
|
|
DECLARE a FLOAT unsigned;
|
|
DECLARE c FLOAT unsigned;
|
|
|
|
SET dLat = ABS(RADIANS(lat2 - lat1));
|
|
SET dLon = ABS(RADIANS(lon2 - lon1));
|
|
SET lat1 = RADIANS(lat1);
|
|
SET lat2 = RADIANS(lat2);
|
|
|
|
SET a = POW(SIN(dLat / 2), 2) + COS(lat1) * COS(lat2) * POW(SIN(dLon / 2), 2);
|
|
SET c = 2 * ASIN(SQRT(a));
|
|
|
|
RETURN (r * c);
|
|
END$$
|
|
|
|
DELIMITER ;
|