none
Entfernung zwischen zwei Geokoordinaten RRS feed

  • Frage

  • Hallo,

    ich möchte die Entfernung zweier Postleitzahlen berechnen. Da Postleitzahlen keine genauen Geo-Koordinaten sind, muss ich zu diesem Zweck zunächst die zu einer Postleitzahl gehörende Geo-Koordinate ermitteln.

    Da ich dabei nicht auf Online-Dienste (Google Maps, Bing, etc.) zugreifen möchte, benötige ich also eine Liste der Postleitzahlen mit Geo-Koordinaten in meiner Datenbank. Ich habe mich dazu dieser Tabelle aus dem Internet bedient.

    Nachdem ich die Tabelle mit longitude/latitude-Werten in meine SQL-Datenbank importiert hatte, erweiterte ich sie um eine Spalte "location" des Typs GEOGRAPHY, um das entsprechende API nutzen zu können. Ich füllte diese Spalte dann so:

    UPDATE ext_plz SET location=GEOGRAPHY::Point(lat,lon,4326);
    

    Zur Ermittlung der Distanz erstellte ich mir diese Funktion:

    CREATE FUNCTION [dbo].[ext_plz_distance] 
    (
    	@src CHAR(5),
    	@dst CHAR(5)
    )
    RETURNS FLOAT
    AS
    BEGIN
    	DECLARE @r FLOAT,@s GEOGRAPHY, @d GEOGRAPHY;
    
    	SELECT @s=loc FROM ext_plz WHERE (plz=@src);
    	SELECT @d=loc FROM ext_plz WHERE (plz=@dst);
    
    	IF (@s IS NOT NULL AND @d IS NOT NULL)
    		SET @r = @s.STDistance (@d);
    	ELSE
    		SET @r = 0;
    
    	RETURN @r
    
    END

    Zum Vergleich erstellte ich auch eine Funktion, welche die Distanz auf der Basis der latitude/longitude-Werte berechnet:

    CREATE FUNCTION [dbo].[ext_plz_distance_raw] (@lat1 FLOAT, @lon1 FLOAT, @lat2 FLOAT, @lon2 FLOAT)
    RETURNS FLOAT 
    AS
    BEGIN
    
        RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
    END

    Soweit so gut. Leider hat ein erster Test ergeben, dass beide Funktionen Werte liefern, die nicht plausibel sind.

    select * from ext_plz where plz='82008';
    select * from ext_plz where plz='81667';
    select dbo.ext_plz_distance('82008','81667');
    select dbo.ext_plz_distance_raw(48.0681730154305,11.6195082445939,48.1324385270214,11.5991943880406);

    (Die Koordinaten für die zweite Distanzberechnung habe ich aus der PLZ-Tabelle.)

    Beide Funktionen liefern ähnliche Werte:

    ext_plz_distance: 7304,24490235936
    ext_plz_distance_raw: 7,30348133702833

    Ich denke, das sind sicher Rundungsfehler.

    Wie auch immer, mein Problem ist, dass diese Werte sehr unrealistisch sind. Die Distanz sollte ca. 10 km betragen und das wird auch bei Online-Diensten, die die Distanz aufgrund der PLZ ermitteln, so bestätigt.

    Wie komme ich an realistischere Distanzen? Ist der Datenbestand vielleicht nicht der Richtige? Welche alternativen PLZ-Daten kann ich verwenden, unter der Prämisse, dass die Berechnung offline erfolgen soll?

    Danke
    Magnus


    Mittwoch, 4. Oktober 2017 13:37

Antworten

  • Hallo Magnus,

    habe auch ein PLZ Verzeichnis mit Geokoordinaten und die Abstandsberechnung liefert das gleiche Ergebnis von 7304,24490235936. Ein Routenplaner liefert als Strecke 9 Km, was aber eben über die Straße geht und nicht Luftlinie.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 5. Oktober 2017 05:43
  • Deine Berechnung sollte auf jeden Fall in Ordnung sein.

    Am wenigsten plausibel erscheint mir der verlinkte Dienst. entscheidend ist auch immer welche Koordinaten in den entsprechenden Datenbanken hinterlegt sind.

    Mir ist z.B. aufgefallen dass die Postleitzahl im Google Earth einen anderen Punkt liefern als die Geo-Koordinaten aus Deiner importierten Datenbank, siehe Screenshoot:

    Die Differenz zwischen Deinen Geokoordinaten und den Koordinaten aus GoogleEarth beträgt nur einige hundert Meter.

    Die größte Abweichung hat der Dienst "www.Postleitzahl.org/Entfernung.html" leider zeigt dieser Dienst nicht die verwendeten Koordinaten an, und hier wird der Fehler liegen.

    Der relative Fehler ist natürlich bei nahe aneinander liegenden Orten größer als bei zwei Städten mit großem Abstand.

    Lasse Dir mal den Abstand  von zwei Orten berechnen bei dem der Eine in Norddeutschland und der Andere in Süddeutschland liegt.

    Grüße

    Roland

    Donnerstag, 5. Oktober 2017 14:13

Alle Antworten

  • Hallo Magnus,

    habe auch ein PLZ Verzeichnis mit Geokoordinaten und die Abstandsberechnung liefert das gleiche Ergebnis von 7304,24490235936. Ein Routenplaner liefert als Strecke 9 Km, was aber eben über die Straße geht und nicht Luftlinie.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 5. Oktober 2017 05:43
  • Hallo Magnus,

    wenn ich die Strecke in GoogleEarth messe erhalte ich auch ca. 7,5 km Luftlinie zwischen den zwei Orten.

    Kann es sein, dass der von Dir verwendete Online-Dienst Straßenkilometer liefert?

    Grüße

    Roland

    Donnerstag, 5. Oktober 2017 06:32
  • Hallo,

    ich habe die Werte z. B. mit diesem Dienst verglichen:

    http://www.postleitzahl.org/entfernung.html

    Dort wird 10.62 km angezeigt und das ist angeblich Luftlinie...

    Mir ist klar, dass das so genau nicht sein kann, aber die Abweichung finde ich schon groß.

    Magnus

    Donnerstag, 5. Oktober 2017 13:21
  • Deine Berechnung sollte auf jeden Fall in Ordnung sein.

    Am wenigsten plausibel erscheint mir der verlinkte Dienst. entscheidend ist auch immer welche Koordinaten in den entsprechenden Datenbanken hinterlegt sind.

    Mir ist z.B. aufgefallen dass die Postleitzahl im Google Earth einen anderen Punkt liefern als die Geo-Koordinaten aus Deiner importierten Datenbank, siehe Screenshoot:

    Die Differenz zwischen Deinen Geokoordinaten und den Koordinaten aus GoogleEarth beträgt nur einige hundert Meter.

    Die größte Abweichung hat der Dienst "www.Postleitzahl.org/Entfernung.html" leider zeigt dieser Dienst nicht die verwendeten Koordinaten an, und hier wird der Fehler liegen.

    Der relative Fehler ist natürlich bei nahe aneinander liegenden Orten größer als bei zwei Städten mit großem Abstand.

    Lasse Dir mal den Abstand  von zwei Orten berechnen bei dem der Eine in Norddeutschland und der Andere in Süddeutschland liegt.

    Grüße

    Roland

    Donnerstag, 5. Oktober 2017 14:13