OpenGeoDB - Entfernungsberechnung: Unterschied zwischen den Versionen

OpenGeoDB & GISWiki - Das freie Portal für Geoinformatik (GIS)
Wechseln zu: Navigation, Suche
K
Zeile 44: Zeile 44:
 
   dlat = B_lat - A_lat
 
   dlat = B_lat - A_lat
 
   a = (sin(dlat/2))^2 + cos(A_lat) * cos(B_lat) * (sin(dlon/2))^2
 
   a = (sin(dlat/2))^2 + cos(A_lat) * cos(B_lat) * (sin(dlon/2))^2
   c = 2 * atan2( sqrt(a), sqrt(1-a) )
+
   c = 2 * asin( sqrt(a) )
 
   d = R * c
 
   d = R * c
  

Version vom 15. April 2010, 08:21 Uhr

FAQ Detail: Entfernungsberechnung

Hallo,

die Frage wurde bereits mehrfach angeschnitten und bereits mehrfach beantwortet.

Fuer unsere Zwecke hier ist die gaengige 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 gross ist der? Unsere Erde ist ja keine perfekte Kugel mit z.B. Radius 6371,110 km oder Umfang = 40000 km sondern eher etwas flachgedrueckt. Unterschiedliche Quellen nennen zwischen 6336 und 6399 km. Fuer 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 fuer 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 Punkte auf gegenueberliegenden Kugelseiten betraegt 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, wie auch aus der begrenzten Laenge von Pi.

Fuer 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 fuer 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 Rechenaufloesung bis max. 1 Minute. Tatsaechlich duerften wir mit z.B. 15 signifikanten Stellen ganz gut im Bereich der maximalen Aufloesung 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 Aequatorumfang ableitet.

Der tatsaechliche Radius ist wohl ganz gut angenaehert durch die Formel

 R' = a * (1 - e^2) / (1 - e^2 * (sin(lat))^2)^(3/2)
 a: Erdumfang
 b: Polarradius
 e: Exxentrizitaet 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 fuer Entfernungen auf See.

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

[...]