Nachfolgende Funktion berechnet die Entfernung zwischen zwei in geographischer Länge und Breite angegebenen Punkten auf der Erde in Kilometer:
drop function if exists entfernung; delimiter // create function entfernung(lat1 double, lon1 double, lat2 double, lon2 double) returns double language sql contains sql comment 'Berechnet die Entfernung zwischen zwei Koordinaten' begin declare erdradius double; declare lambda1 double; declare phi1 double; declare lambda2 double; declare phi2 double; declare x1 double; declare y1 double; declare z1 double; declare x2 double; declare y2 double; declare z2 double; declare entfernung double; set erdradius = 6371; set lambda1 = lon1 * pi() / 180; set phi1 = lat1 * pi() / 180; set lambda2 = lon2 * pi() / 180; set phi2 = lat2 * pi() / 180; set x1 = erdradius * cos(phi1) * cos(lambda1); set y1 = erdradius * cos(phi1) * sin(lambda1); set z1 = erdradius * sin(phi1); set x2 = erdradius * cos(phi2) * cos(lambda2); set y2 = erdradius * cos(phi2) * sin(lambda2); set z2 = erdradius * sin(phi2); set entfernung = 2 * erdradius * asin(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2)) / (2 * erdradius)); return entfernung; end; //
Update:
Folgende Funktion ist ca. 4 Mal schneller (getestet mit der MySQL-Funktion BENCHMARK(), Quelle)
DELIMITER // DROP FUNCTION IF EXISTS DISTANCE; // CREATE FUNCTION DISTANCE( lat1 DOUBLE, lon1 DOUBLE, lat2 DOUBLE, lon2 DOUBLE ) RETURNS DOUBLE NO SQL DETERMINISTIC COMMENT 'counts distance (km) between 2 points on Earth surface' BEGIN DECLARE dtor DOUBLE DEFAULT 57.295800; RETURN (6371 * acos(sin( lat1/dtor) * sin(lat2/dtor) + cos(lat1/dtor) * cos(lat2/dtor) * cos(lon2/dtor - lon1/dtor))); END; // DELIMITER ;