- Wenn man zu Breiten-/Längengrad-Koordinaten x,y-Verschiebungen in Metern addiert, lässt sich das bei einigen km oder weniger und sofern man sich nicht in Polnähe befindet schnell schon mit einer einfachen Näherungsformel berechnen
- Die Grundidee ist, in y-Richtung 111.111 m als 1 Breitengrad und in x-Richtung
111.111 * cos(Breitengrad) m als 1 Längengrad anzusetzen; für eine Verschiebung von 100 m nach Norden addiert man also 100 / 111111 Grad
- Dieselbe Idee lässt sich auch mit einer Kugel mit Erdradius
R=6378137 als dLat=dn/R, dLon=de/(R*cos(lat)) berechnen; bei Breitengrad 51 und dn=100, de=100 ergibt sich latO=51.00089832, lonO=0.001427437
- Wenn die geforderte Genauigkeit innerhalb von 10 m liegt und der Offset bis 1 km beträgt, kann man auch komplexere Formeln wie im Aviation Formulary verwenden, aber selbst die einfache ebene Näherung dürfte bei 1 km Offset einen Fehler von unter 50 m haben
- Falls auch der Effekt berücksichtigt werden muss, dass sich die Länge von 1 Grad je nach Breitengrad ändert, ist es sicherer, Formeln für Meter pro Grad zu verwenden oder in ein lokales Projektionskoordinatensystem umzuwandeln, dort die Verschiebung zu addieren und anschließend wieder nach Breiten-/Längengraden zurückzurechnen
Für kleine Distanzen reicht die Näherung 111.111 m/Grad aus
- Kleine Verschiebungen lassen sich mit den folgenden Näherungen in Änderungen von Breiten- und Längengrad umrechnen
- y-Richtung: 111.111 m ≈ 1 Breitengrad
- x-Richtung:
111.111 * cos(Breitengrad) m ≈ 1 Längengrad
- Neue Koordinaten erhält man ungefähr so
lat_new = lat + dy / 111111
lon_new = lon + dx / (111111 * cos(latitude))
- In
cos(latitude) muss die für die Laufzeitumgebung passende Einheit eingesetzt werden
- In Umgebungen, die Bogenmaß erwarten, ist die Umrechnung
latitude * pi / 180 nötig
- Diese Näherung eignet sich, wenn die Verschiebung nicht zu groß ist, man sich nicht direkt in Polnähe befindet und keine extrem hohe Genauigkeit erforderlich ist
Woher die Zahl 111.111 m kommt und wie groß der Fehler ist
- Der Wert 111.111 hängt mit der historischen Definition des Meters zusammen
- Frankreich definierte den Meter ursprünglich als den
10^7-ten Teil der Entfernung vom Äquator bis zum Nordpol entlang des Pariser Meridians
10^7 / 90 = 111.111,1 m entsprechen damit 1 Breitengrad
- In einer Überprüfung in den Kommentaren stimmte das Ergebnis bei jeweils 1.400 m in x- und y-Richtung und einer Gesamtverschiebung von 2 km im Vergleich zu einer UTM-Berechnung auf unter 8,6 m genau
- Der ungünstigste Breitengrad unter diesen Bedingungen lag bei 81 Grad
- Der Fehler blieb bis über 89,6 Grad hinaus unter 10 m
- Die einfache Formel berücksichtigt mit
cos(Breitengrad), dass sich Längengrade zu den Polen hin verengen
- Da die tatsächliche Länge von 1 Längengrad kleiner wird, wird dieselbe Verschiebung in Metern in x-Richtung in hohen Breiten in eine größere Änderung des Längengrads umgerechnet
Dieselbe Berechnung mit dem Erdradius
- Dieselbe Berechnung lässt sich auch als Formel auf Basis des Erdradius ausdrücken
//Position, decimal degrees
lat = 51.0
lon = 0.0
//Earth’s radius, sphere
R=6378137
//offsets in meters
dn = 100
de = 100
//Coordinate offsets in radians
dLat = dn/R
dLon = de/(R*Cos(Pi*lat/180))
//OffsetPosition, decimal degrees
latO = lat + dLat * 180/Pi
lonO = lon + dLon * 180/Pi
- Dieses Beispiel liefert die folgenden Ergebnisse
latO = 51,00089832
lonO = 0,001427437
- Dieser Ansatz ist nahezu dieselbe Lösung wie die Näherung 111.111 m/Grad; der Unterschied besteht darin, dass ein auf dem Radius basierender Wert näher bei
111.319,5 m verwendet wird
- Die x-Verschiebung sollte möglichst der echten Ost-West-Richtung, die y-Verschiebung der Nord-Süd-Richtung entsprechen
- Falls Easting/Northing eines lokalen Projektionskoordinatensystems gedreht sind, müssen sie zuerst in Ost-West- und Nord-Süd-Komponenten umgerechnet werden
Optionen, wenn mehr Genauigkeit nötig ist
- Die Formel „lat/long given radial and distance“ im Aviation Formulary kann verwendet werden, um aus Distanz und Peilung neue Breiten-/Längengrade zu berechnen
- Für Embedded-Umgebungen, in denen man trigonometrische Funktionen möglichst wenig verwenden möchte, kann sie etwas komplex sein
- Der Distanzparameter wird dabei als Bogenmaß in der Form
distance / earth radius behandelt
- Möglich ist auch, zunächst in ein zur Region passendes ebenes Koordinatensystem zu projizieren und dort den Offset zu addieren
flat_coordinate = latlon_to_utm(original_coordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)
- Dafür ist nicht zwingend UTM erforderlich; jedes für die betreffende Region geeignete ebene Koordinatensystem kann verwendet werden
- Wenn man sich jedoch nach der Verschiebung über eine UTM-Zonengrenze in eine andere UTM-Zone bewegt, lässt sich das nicht ohne Weiteres so anwenden
Implementierungsbeispiele in verschiedenen Sprachen und präzisere Formeln nach Breitengrad
- Das Python-Beispiel bildet die Näherung 111.111 m/Grad direkt als Funktion ab
from math import cos, radians
def meters_to_lat_lon_displacement(m, origin_latitude):
lat = m / 111111
lon = m / (111111 * cos(radians(origin_latitude)))
return lat, lon
- Das R-Beispiel führt dieselbe Berechnung aus
deg2rad = function(deg) {(deg * pi) / (180)}
meters_to_lat_lon_displacement = function(m, origin_latitude){
lat = m / 111111
lon = m / (111111 * cos((deg2rad(origin_latitude))))
return(list(lat=lat,lon=lon))
}
- Eine genauere Formel für Meter pro Grad je nach Breitengrad lässt sich so schreiben
meters_per_degree_lat = (111132.92 - 559.82 * np.cos(2 * lat0_rad) +
1.175 * np.cos(4 * lat0_rad) - 0.0023 * np.cos(6 * lat0_rad))
meters_per_degree_lon = (111412.84 * np.cos(lat0_rad) -
93.5 * np.cos(3 * lat0_rad) + 0.118 * np.cos(5 * lat0_rad))
- Diese präzisere Formel berücksichtigt, dass sich die Länge von 1 Breitengrad und 1 Längengrad mit dem Breitengrad fortlaufend ändert
- Das Swift-Beispiel verwendet eine Berechnung des Erdradius in Abhängigkeit vom Breitengrad und ermittelt daraus mit Distanz und Peilung ein neues
CLLocationCoordinate2D
1 Kommentare
Hacker-News-Kommentare
Der Meter wurde 1791 neu definiert als ein Zehnmillionstel des Viertelmeridians durch Paris, also der Bogenlänge von 90 Grad.
Daher gilt 1° ≡ 1/90 × 10^7 m = 111.111,111... m, und der Erdumfang beträgt ungefähr 40 Millionen m, also 40.000 km.
Die frühe Definition des Meters war die Länge eines Sekundenpendels, also eines Pendels mit einer Periode von 2 Sekunden. Setzt man in T ≈ 2π√(L/g) T = 2 und L = 1 ein, ergibt sich 1 = π√(1/g), also 1 = π²/g.
Dass g nahe bei π² liegt, ist daher auch nicht nur Zufall; ebenso wenig, dass 1 cm³ Wasser 1 g wiegt, denn das war lange Zeit die Definition des Gramms.
Als der Meter über das Sekundenpendel definiert war, hing er vollständig an der Definition der Sekunde und dem Wert von g; als Formel: 1 m = 1 s² × g / π².
g ≈ π² ergibt sich natürlich, aber dass der Erdumfang nahe genug bei 40.000 km lag, sodass man den Meter als Zehnerpotenz neu definieren konnte, ohne ihn stark zu verändern, wirkt wie Zufall.
https://en.wikipedia.org/wiki/Second#Fraction_of_solar_day
3 englische Fuß sind dagegen nur etwa 0,91 m.
Die Leute damals haben nicht die prinzipientreueste oder kosmisch schönste Längeneinheit im Vakuum hergeleitet, sondern eher versucht, eine bereits verwendete Einheit anders zu definieren als über „die Länge dieses Stabs dort“.
Statt 360 Grad würde man 40.000 km verwenden, und die tatsächlichen Berechnungen nähmen echte Distanzen; die Näherung wäre aber nah genug.
Dann bräuchte man zumindest für Nutzer des metrischen Systems keine Umrechnung in Entfernung mehr.
Das Problem mit Gradangaben ist, dass sie sich schwer in nützliche Entfernungen umrechnen lassen; solche Tricks helfen zwar, aber gar keine Umrechnung zu brauchen wäre von Anfang an besser.
Eine Seemeile, etwa 6076 ft, entspricht am Erdäquator genau einer Bogenminute.
Aus Sicht der Navigation wünschte ich, alle Meilen wären Seemeilen.
Die Seemeile hat eine tatsächliche Bedeutung; was soll 5280 ft überhaupt bedeuten?
Die Länge der chain ist ein Nebenprodukt der britischen Grundsteuer-Gesetze, die nach Acre bemessen wurden.
Die römische Meile waren 1000 Schritte, also 5000 ft; das ergab etwas mehr Sinn.
https://en.wikipedia.org/wiki/Gunter%27s_chain
Die ursprüngliche römische Meile waren 5000 römische Fuß.
Tatsächlich ist 1 nmi ≡ 1,852 km exakt definiert.
Aus der ursprünglichen Definition des Meters ergibt sich ebenfalls 1/60 × 1/90 × 10^7 = 1851,85185185... m.
Ein zentrales Merkmal des SI und seiner Vorläufer MKS und CGS war von Anfang an die Umrechenbarkeit zwischen Einheiten; daher gibt es Beziehungen wie 1 m ≡ 1 s ≡ 1 kg ≡ 1 N ≡ 1 Pa ≡ 1 J ≡ 1 A ≡ 1 C ≡ 1 V ≡ 1 Ω ≡ 1 F ≡ 1 W ≡ 1 Wb ≡ 1 T ≡ 1 H ≡ 1 Hz.
Das ≡ ist hier nicht als strikte Äquivalenz gemeint, sondern bezeichnet locker den Umrechnungsfaktor.
Nahezu Ausnahmen im SI sind Kelvin, Mol, Candela und deren abgeleitete Einheiten; die ersten beiden lassen sich sauber über die Boltzmann-Konstante und die Avogadro-Konstante behandeln.
Dass die Candela im SI enthalten ist, ärgert mich persönlich.
Im 16. Jahrhundert änderte England die Meile dann auf 8 furlongs, um die damaligen landwirtschaftlichen Vermessungsrechnungen viel einfacher zu machen.
https://en.m.wikipedia.org/wiki/Furlong
Das wirkt wie die Behauptung, traditionelle Einheiten seien besser, weil man 10 mit ganzen Zahlen nicht durch 3 teilen kann.
Teilt man einen Kreis in 360 Bögen, scheint die Annahme zu sein, dass einer dieser Bögen in einer bestimmten Entfernung vom Mittelpunkt irgendeine Bedeutung hat.
Wenn man aber bedenkt, dass Griechenland vor rund 2000 Jahren die babylonische Verwendung von 360 übernommen hat und Babylonien wiederum über die 2000 Jahre davor die in der Astronomie verwendete grobe Messung der Tageszahl eines Jahres zu dieser Zahl verfeinert hatte, dann ist die Bedeutung der Seemeile eher abgeleitet und zufällig als „tatsächlich“.
Außerdem variiert die Länge einer Seemeile je nach Position, wenn man berücksichtigt, dass die Erde ein abgeplattetes Sphäroid ist.
Ich habe über zehn Jahre in den USA gelebt, bin aber immer noch nicht mit dem angloamerikanischen Maßsystem warm geworden, und das wird wohl auch so bleiben
Es ergibt überhaupt keinen Sinn
Das metrische System ist wie pures Gold: 1 cm = 10 mm, 1 m = 100 cm, 1 km = 1000 m, 1 kg = 1000 g, 1 ton = 1000 kg
Beim angloamerikanischen Maßsystem heißt es dagegen „Moment mal“, und dann kommt so etwas wie 1 in = ???, 1 ft = 12 in, 1 yd = 3 ft, 1 mile = 5280 ft, 1 lb = 16 oz
Ich weiß wirklich nicht, wer sich diesen Wahnsinn ausgedacht hat
Deshalb tritt das Problem seltener zutage, als man denkt
Selbst wenn etwas zufällig metrisch angegeben ist, fällt auf, dass die Einheiten nicht umgerechnet werden
Zum Beispiel schreibt man 1000 ml statt 1 l oder 3500 g statt 3,5 kg
Europäer können sagen: „In diese Richtung sind es 600 m, in die andere 1,2 km“, aber Amerikaner sagen kaum: „In diese Richtung sind es 800 yards, in die andere 1 mile“
Europäer können sagen: „Ich muss 4 l Wasser mitnehmen, also ist meine Tasche 4 kg schwerer geworden“
Amerikaner können zwar sagen: „Meine Flasche fasst 24 fluid ounces, also ungefähr 24 ounces Gewicht“, aber bei einer Gallone sagen sie wahrscheinlich einfach, sie wiege ungefähr eine Gallone
Am Ende war das Problem der Einheitenumrechnung kleiner, als ich es mir vorgestellt hatte, weil Amerikaner nicht in jedem Satz Einheiten umrechnen
Ich wäre überrascht, wenn mehr als 50 % der Bevölkerung wissen, wie viele ounces in eine Tasse Wasser passen oder wie viele feet eine mile hat
Immerhin ist es gut, dass auch in den USA in der Wissenschaft das metrische System Standard ist
Die chain, die aus der Vermessung stammt, ist 22 yards lang
Eine chain entspricht auch 4 rods, also ist ein rod 5½ yards lang, was schon ziemlich merkwürdig ist
10 chains sind ein furlong, und 8 furlongs sind eine mile
Nebenbei: Ein acre ist 1 furlong × 1 chain
Es wirkt wie Wahnsinn, aber es steckt doch eine gewisse Systematik darin
Warum sollte man inches in miles umrechnen müssen?
Im Leben gibt es keinen Anlass, inches oder feet und inches in miles umzurechnen
In der Tischlerei oder beim Handwerk mag das historisch noch Sinn ergeben, aber wie sieht es bei anderen Anwendungen aus?
Man versuche einfach, 2 3/16" auf einem Zollstock genauso schnell abzulesen wie 5,6 cm
Auch Schraubengrößen sind davon betroffen
Die Strecke, die Licht in 1 Nanosekunde zurücklegt, beträgt ebenfalls ungefähr 1 foot
Beeindruckend :)
Das Ergebnis von
$ units c ft/nsist* 0.983571061 kilochrono sind 55 Minuten, und in Situationen wie der Raumfahrt, in denen man Einheiten nicht von einem Sonnentag abhängig machen kann, wäre das ziemlich nützlich
Wenn die Erde ein Rotationsellipsoid ist, ändert sich dann nicht die tatsächliche Bogenlänge von 1 Grad Breite?
Ich frage mich, ob „verlässlich“ hier einfach „nah genug, um brauchbar zu sein“ bedeutet
Ich habe wohl zu lange an Dingen gearbeitet, die nichts mit Geografie zu tun haben, und vergessen, was ich früher einmal wusste
Den Anwendungsfall, durch den ich darauf gestoßen bin, habe ich hier ein Stück weit beschrieben: https://twitter.com/mholt6/status/1695685022710477043
Selbst wenn es in meinem Fall um ein paar Kilometer danebenliegt, ist es wahrscheinlich nicht in der Nähe der Polarregionen, und falls doch, kann man das mit „ja, schon klar, du bist am Pol“ abhaken
Bei der Erdumlaufbahn ist es ähnlich
In der Schule lernt man zwar, dass sie elliptisch ist, bekommt aber kaum ein Gefühl für die tatsächliche Form, und die meisten Abbildungen vermitteln einen völlig falschen Eindruck
Für viele praktische Zwecke ist es trotzdem nah genug
In diesem Beitrag steht auch die gute Faustregel, dass 111.111 * cos(latitude) m 1 Grad Länge entspricht
Die Korrektur gefällt mir
In der Praxis kann man auch einfache Konstanten verwenden: Bei 25° sind es etwa 100.000 m, bei 44° etwa 80.000 m, bei 57° etwa 60.000 m