Berechnung der Entfernung zwischen zwei geografischen Punkten.


Die Funktion gibt die Entfernung in km zwischen zwei Punkten aus. In dem Beispiel wird die Entfernung (Luftlinie) zwischen 50189 Elsdorf und 51026 Bergheim ermittelt. Die geografischen Daten können aus den einschlägigen Datenbanken des Internets heruntergeladen werden. Die Funktion ist einfach gehalten um das Prinzip der Berechnung zu verdeutlichen - daher keine Datenbankzugriffe.

Die geografischen Daten für das Beispiel


Plz

Ort

Breitengrad

Längengrad

50189

Elsdorf

50,9333333

6,5666667

50126

Bergheim

50,9666667

6,65

Beispiel


Die weiter unten beschriebene Funktion wird wie folgt aufgerufen:
select fkt_berechne_entfernung(50.9333333, 6.5666667, 50.9666667, 6.65) entfernung from dual;

und liefert das folgende Ergebnis:
ENTFERNUNG
----------
6,92300956
1 row selected

Quellcode


CREATE OR REPLACE function fkt_berechne_entfernung(breit_1 number,
                                                   lang_1 number,
                                                   breit_2 number,
                                                   lang_2 number) return number is
-- ***********************************************************************************************
--    Copyright        19.06.2005 by Gregor Neveling
--
--    NAME              berechne_entfernung
--
--    DESCRIPTION:      Berechnet die Entfernung zwischen 2 geografischen Punkten
--
--    PARAMETER:        Längen und Breitengrad beider Punkte
--
--    return            Entfernung in km
--
--    CREATED           19.06.2005
--
-- ***********************************************************************************************
v_entfernung number;
v_breite     number;
v_laenge     number;
t_breit      number;
t_lang       number;
begin
   t_breit  := breit_1  / 180 * 3.1415926;
   t_lang   := lang_1   / 180 * 3.1415926;
   v_breite := breit_2  / 180 * 3.1415926;
   v_laenge := lang_2   / 180 * 3.1415926;
   v_entfernung :=  ACOS ( SIN(v_breite) * SIN(t_breit)
                         + COS(v_breite) * COS(t_breit)
  					    * COS(t_lang - v_laenge) ) * 6378.388;
   return v_entfernung;
 EXCEPTION
   WHEN OTHERS THEN
        dbms_output.put_line(sqlerrm);
        return null;
end fkt_berechne_entfernung;
/