Entfernungen berechnen – als SQL-Funktion

Nachfolgende Funktion berechnet die Entfernung zwischen zwei in geographischer Länge und Breite angegebenen Punkten auf der Erde in Kilometer:

 1drop function if exists entfernung;
 2delimiter //
 3create function entfernung(lat1 double, lon1 double, lat2 double, lon2 double)
 4	returns double
 5	language sql
 6	contains sql
 7	comment 'Berechnet die Entfernung zwischen zwei Koordinaten'
 8begin
 9	declare erdradius double;
10
11	declare lambda1 double;
12	declare phi1 double;
13
14	declare lambda2 double;
15	declare phi2 double;
16
17	declare x1 double;
18	declare y1 double;
19	declare z1 double;
20
21	declare x2 double;
22	declare y2 double;
23	declare z2 double;
24
25	declare entfernung double;
26
27	set erdradius = 6371;
28
29	set lambda1 = lon1 * pi() / 180;
30	set phi1 = lat1 * pi() / 180;
31
32	set lambda2 = lon2 * pi() / 180;
33	set phi2 = lat2 * pi() / 180;
34
35	set x1 = erdradius * cos(phi1) * cos(lambda1);
36	set y1 = erdradius * cos(phi1) * sin(lambda1);
37	set z1 = erdradius * sin(phi1);
38
39	set x2 = erdradius * cos(phi2) * cos(lambda2);
40	set y2 = erdradius * cos(phi2) * sin(lambda2);
41	set z2 = erdradius * sin(phi2);
42
43	set entfernung = 2 * erdradius * asin(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2)) / (2 * erdradius));
44
45	return entfernung;
46end;
47//

Update:
Folgende Funktion ist ca. 4 Mal schneller (getestet mit der MySQL-Funktion BENCHMARK(), Quelle)

 1DELIMITER //
 2
 3DROP FUNCTION IF EXISTS DISTANCE; //
 4
 5CREATE FUNCTION DISTANCE( lat1 DOUBLE, lon1 DOUBLE, lat2 DOUBLE, lon2 DOUBLE ) 
 6    RETURNS DOUBLE NO SQL DETERMINISTIC
 7    COMMENT 'counts distance (km) between 2 points on Earth surface'
 8BEGIN
 9    DECLARE dtor DOUBLE DEFAULT 57.295800;
10
11    RETURN (6371 * acos(sin( lat1/dtor) * sin(lat2/dtor) +
12        cos(lat1/dtor) * cos(lat2/dtor) * 
13        cos(lon2/dtor - lon1/dtor)));
14END; //
15
16DELIMITER ;