3 Punkte von GN⁺ 2023-08-28 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2023-08-28
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.

    • Die Sekunde ist eine ältere Einheit als die Neudefinition des Meters, und da sie aus einer „schön“ gewählten Unterteilung des Tages stammt, scheint immer noch ein gewisser Zufall übrig zu bleiben.
      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
    • Mit einer einzigen 32-Bit-Ganzzahl kann man Breiten- oder Längengrad ungefähr auf 1 cm genau darstellen :D
    • Der Meter entspricht praktisch auch ungefähr 3 Pariser Fuß, also etwa 0,97 m.
      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“.
    • Ich wünschte, das GPS-Koordinatensystem wäre einfach in Kilometern.
      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.
    • Frankreich hat auch bei Winkeln eine Dezimalisierung eingeführt; tatsächlich ist also 1 gon = 100 km, und 1 km ist nur 1 centigon.
  • 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?

    • Eine Meile hat deshalb 5280 ft, weil sie 80 chains lang ist.
      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 meisten anderen „Meilen“ leiteten sich von der römischen Meile ab und entwickelten sich einigermaßen unabhängig von englischen Einheiten wie Fuß, Yard, Inch und barleycorn, wodurch die Umrechnungsfaktoren seltsam wurden.
      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.
    • Interessanterweise war die Meile ursprünglich die weniger seltsame Länge von 5000 ft.
      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
    • Es wäre schön gewesen, wenn die Menschen im Mittelalter die Meile als 5040 ft definiert hätten; dann ließe sie sich durch 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 28, 30, 35, 36, 40, 42, 45, 48, 56, 60, 63, 70, 72, 80, 84, 90, 105, 112, 120, 126, 140, 144, 168, 180, 210, 240, 252, 280, 315, 336, 360, 420, 504, 560, 630, 720, 840, 1008, 1260, 1680, 2520 teilen.
    • Ich frage mich, was mit tatsächlich in „die Seemeile hat eine tatsächliche Bedeutung“ gemeint ist.
      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

    • Was ich beim Leben in den USA gelernt habe: Die meisten Amerikaner rechnen Einheiten nicht ineinander um, wenn es nicht wirklich nötig ist
      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 glaube, selbst unter Menschen, die in den USA aufgewachsen sind, gibt es ziemlich viele, die dieses System nicht vollständig verstehen
      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
    • Ein paar Zwischeneinheiten wurden ausgelassen; wenn man sie kennt, wird es etwas erklärbarer
      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
    • In was soll man inches denn überhaupt umrechnen?
      Warum sollte man inches in miles umrechnen müssen?
      Im Leben gibt es keinen Anlass, inches oder feet und inches in miles umzurechnen
    • Einheitenumrechnung ist schon unbequem, aber das wirklich Schlimmste ist meiner Meinung nach die Längenangabe in Brüchen
      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

    • Das liegt erstaunlich nah am tatsächlichen Wert
      Beeindruckend :)
      Das Ergebnis von $ units c ft/ns ist * 0.98357106
    • Die Strecke, die Schall in 1 Millisekunde zurücklegt, beträgt ebenfalls ungefähr 1 foot
    • Es wäre cool, die Zeit umzudefinieren und 1 chrono als die Zeit zu definieren, die Licht braucht, um 1e9 m zurückzulegen
      1 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
    • Die Anzahl der Sekunden in einem Jahr liegt ebenfalls nahe genug bei π*10^7
    • 1 googol femtobarns entspricht ebenfalls ungefähr 1 square teraparsecs
  • 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

    • Verlässlich bedeutet, dass es nah genug ist, um brauchbar zu sein, und in dicht besiedelten Regionen ist die Schätzung sogar ziemlich genau
      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
    • Der Äquatordurchmesser der Erde ist 43 km größer als der Poldurchmesser
      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
    • Nur vom Titel her könnte man denken, die Längenänderung von 1 Grad Breite betrage weniger als 1 Dezimeter, aber das ist natürlich nicht so
      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