OpenGeoDB - Entfernungsberechnung

OpenGeoDB & GISWiki - Das freie Portal für Geoinformatik (GIS)
Version vom 2. Februar 2012, 11:57 Uhr von Djot (Diskussion | Beiträge) (Umlaute von "ue" in "ü" geändert und Rechtschreibfehler entfernt)

(Unterschied) ← Nächstältere Version | Aktuelle Version ansehen (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

FAQ Detail: Entfernungsberechnung

Hallo,

die Frage wurde bereits mehrfach angeschnitten und bereits mehrfach beantwortet.

Für unsere Zwecke hier ist die gängige Formel zwischen A und B wohl

 arccos(sin(B_lat)*sin(A_lat)+cos(B_lat)*cos(A_lat)*cos(B_lon - A_lon))

... multipliziert mit dem Erdradius. Aber wie groß ist der? Unsere Erde ist ja keine perfekte Kugel mit z.B. Radius 6371,110 km oder Umfang = 40000 km sondern eher etwas flachgedrückt. Unterschiedliche Quellen nennen zwischen 6336 und 6399 km. Für unsere Breitengrade sollte 6380 km ganz gut hinkommen.

Die Diskussion entsprang in news:de.alt.technik.gps und verwies auf

Die dortigen Angaben finde ich interessant genug, um das Prinzip hier nochmals zu wiederholen.

Denn beispielsweise habe ich auch eine Software, die den arccos nicht beherrscht. Da sind manche Alternativen noch interessant:

1) Pythagoras

 d  = sqrt((X2 - X1)^2 + (Y2 - Y1)^2)

kartesische Koordinaten für X/Y; Genauigkeit angeblich ausreichend bis ca. 20 km: Breitengrad / Meter Abweichung

        70  / 30
        50  / 20
        30  /  9

2) Haversine Formel

 dlon = B_lon - A_lon
 dlat = B_lat - A_lat
 a = (sin(dlat/2))^2 + cos(A_lat) * cos(B_lat) * (sin(dlon/2))^2
 c = 2 * arcsin(min(1,sqrt(a)))
 d = R * c
 R = Erdradius

Bei zwei Punkten auf gegenüberliegenden Kugelseiten beträgt der Fehler etwa 2 km, verursacht durch Rundungsfehler in der Sinus-Berechnung bei kleinen Winkeln. Ansonsten ist die Formel gut geeignet. Fehler entstehen insgesamt aus der rechnerinternen Rundung der Zahlenwerte, als auch aus der begrenzten Länge von Pi.

Für weit auseinander liegende Punkte bietet sich z.B. eine modifizierte Variante an:

 dlon = B_lon - A_lon
 dlat = B_lat - A_lat
 a = (sin(dlat/2))^2 + cos(A_lat) * cos(B_lat) * (sin(dlon/2))^2
 c = 2 * asin( sqrt(a) )
 d = R * c

3) nahe der Polarkappen

 a = pi/2 - A_lat
 b = pi/2 - B_lat
 c = sqrt( a^2 + b^2 - 2 * a * b * cos(B_lon - A_lon) )
 d = R * c

4) arccos

... diese Formel ist mathematisch korrekt, aber ungeeignet für geringe Entfernungen!

 a = sin(A_lat) * sin(B_lat)
 b = cos(A_lat) * cos(B_lat) * cos(B_lon - A_lon)
 c = arccos(a + b)
 d = R * c
 cos (5 degree) = 0.996194698
 cos (1 degree) = 0.999847695
 cos (1 minute) = 0.9999999577
 cos (1 second) = 0.9999999999882
 cos (0.05 sec) = 0.999999999999971

Bei nur sieben signifikanten Stellen reicht die Rechenauflösung bis max. 1 Minute. Tatsächlich dürften wir mit z.B. 15 signifikanten Stellen ganz gut im Bereich der maximalen Auflösung von Sekunden liegen. Mit dem Taschenrechner ist da aber nicht mehr viel zu wollen.

All das relativiert sich mit der Genauigkeit des genutzten Erdumfangs. Ich wusste bisher nicht, dass die Nautische Meile / Seemeile mit 1,852 km als Minute vom Äquatorumfang ableitet.

Der tatsächliche Radius ist wohl ganz gut angenähert durch die Formel

 R' = a * (1 - e^2) / (1 - e^2 * (sin(lat))^2)^(3/2)
 a: Erdumfang
 b: Polarradius
 e: Exzentrizität sqrt(1 - b^2/a^2)

bzw.

 a = 6378 km (3963 mi) Equatorial radius (surface to center distance)
 b = 6357 km (3950 mi) Polar radius (surface to center distance)
 e = 0.081082 Eccentricity

gives the following table of values for the

Radii of Curvature:

latitude...........r...................R'..................N..........

00 degrees . 6357 km (3950 mi) . 6336 km (3937 mi) . 6378 km (3963 mi)

15 degrees . 6360 km (3952 mi) . 6340 km (3940 mi) . 6379 km (3964 mi)

30 degrees . 6367 km (3957 mi) . 6352 km (3947 mi) . 6383 km (3966 mi)

45 degrees . 6378 km (3963 mi) . 6367 km (3957 mi) . 6389 km (3970 mi)

60 degrees . 6388 km (3970 mi) . 6383 km (3966 mi) . 6394 km (3973 mi)

75 degrees . 6396 km (3974 mi) . 6395 km (3974 mi) . 6398 km (3975 mi)

90 degrees . 6399 km (3976 mi) . 6399 km (3976 mi) . 6399 km (3976 mi)

.... aber interessant ist das wohl eher für Entfernungen auf See.

Denn bei uns auf dem Festland wird das 'Normal-Null' ohnehin willkürlich festgelegt und liegt z.B. um 20 cm tiefer(?) als in der Schweiz.

[...]