Mit Python MGRS-Koordinaten konvertieren


Tiago Sanona


Transverse mercator meridian stripes

Wenn man mit Satellitendaten arbeitet, muss man die Koordinaten, in denen die Daten vorliegen, verstehen und eventuell umrechnen. Manchmal, insbesondere wenn sie von offiziellen Stellen freigegeben werden, werden Satellitendaten in MGRS-Kacheln bereitgestellt, die vom UTM-Koordinatensystem abgeleitet sind. Dies ist zum Beispiel bei den Sentinel-2-Kacheln der Fall.

In diesem Beitrag möchte ich die folgenden drei Fragen beantworten, wobei ich die Python-Bibliotheken mgrs und pyproj verwende: 

  1. Was ist der Unterschied zwischen MGRS und UTM?

  2. Zu welcher MGRS-Kachel gehört ein bestimmter, in Breiten- und Längengraden referenzierter Punkt?

  3. Wie kann ich eine MGRS-Kachel in Lat/Lon-Koordinaten ausdrücken?

Bevor wir diese Fragen beantworten, wollen wir uns zunächst ansehen, was MGRS ist.


UTM und MGRS


Um MGRS zu verstehen, müssen wir zunächst über UTM sprechen.

UTM (Universal Transverse Mercator) ist ein Koordinatensystem für die Oberfläche der Erde. Es funktioniert, indem es die Erdkugel in 60 meridianweise Streifen unterteilt und diese dann mit der transversalen Mercator-Projektion projiziert. Dann werden diese Zonen in Abständen von 8º parallel weiter in Kacheln unterteilt, die durch eine Zahl zwischen 1 und 60 und einen Buchstaben des lateinischen Alphabets bezeichnet werden, z. B. "33U".

Dies ist die Grundlage von MGRS (Military Grid Reference System). MGRS baut auf UTM auf, indem zunächst jede dieser Kacheln in 100km-Kacheln unterteilt wird. Diese kleineren Kacheln kennzeichnen wir mit einem Buchstabenpaar, z. B. "WT".

 Example of MGRS tiles with 100km precision on top of UTM tiles

Es ist erwähnenswert, dass UTM-Kacheln nicht perfekt mit den 100km übereinstimmen, so dass zwei verschiedene Namen dieselbe Kachel darstellen können, z. B. 3PWT und 3QWT sind beide gültige Koordinaten für dasselbe Gebiet.

Der dritte Teil der MGRS-Koordinaten besteht aus einer Folge von 10 oder weniger Zahlen (je nach Granularität), wobei die erste und zweite Hälfte angeben, wie viele Meter östlich bzw. nördlich der linken unteren Ecke der 100km-Kachel ein Punkt liegt. So befindet sich ein Punkt mit den Koordinaten 3PWT3675328453 in der UTM-Kachel 3P, MGRS 100km-Kachel WT und ist 36753m von der linken und 28453m von der unteren Kachelkante entfernt.

Wenn man eine geringere Genauigkeit darstellen möchte, müssen die Zahlen abgeschnitten statt gerundet werden. Zum Beispiel wäre 3PWT3675328453 bei einer Genauigkeit von 1000m 3PWT3628.


Von MGRS zu Breiten-/Längengrad


Zurück zu den ursprünglichen Fragen: Der erste Ansatz, den Sie verfolgen können, ist zu versuchen, MGRS-Kachelformdateien zu finden. Obwohl diese verfügbar sind, werden Sie schnell feststellen, dass dies vielleicht nicht der beste Weg ist, um dieses Problem zu lösen, da Sie von einer oder mehreren Shape-Dateien abhängig werden, die sehr groß sind und durchlaufen werden müssen, um eine Kachel zu finden, die einen Punkt abdeckt.

Glücklicherweise gibt es eine Python-Bibliothek namens mgrs, die die zweite oben genannte Frage löst. Es ist eine sehr einfache Bibliothek, die MGRS-Koordinaten in Lat/Lon-Koordinaten und umgekehrt konvertieren kann, mit unterschiedlichen Genauigkeitsgraden.

Das folgende Beispiel zeigt, wie die Koordinaten (12.40, 53.51) in MGRS-Koordinaten mit Standardpräzision (1m) und 10km-Präzision konvertiert werden.

import mgrs

mgrs_object = mgrs.MGRS()

mgrs_object.toMGRS(12.40, 53.51)
# returns '39PYP7290672069'

mgrs_object.toMGRS(12.40, 53.51, MGRSPrecision=1)
# returns '39PYP77'

Nun zur Beantwortung der dritten Frage, "Wie kann ich eine MGRS-Kachel in Lat/Lon-Koordinaten ausdrücken".

Zunächst müssen Sie die Position der linken unteren Ecke der Kachel in Grad herausfinden. Die Methode .toLatLon der gleichen Bibliothek gibt genau das zurück.

Da die Kacheln (fast immer) konstante Abmessungen haben, müssen Sie zur Definition einer Kachel in Lat/Lon-Koordinaten nur die Koordinaten der rechten oberen Ecke ermitteln. Um dies zu tun, können Sie die Bibliothek pyproj verwenden, die eine Funktion hat, die bei zwei Punkten in Grad den Abstand zwischen ihnen zurückgibt.

Nachdem Sie den Wert gefunden haben, der zwischen Metern und Lon/Lat umgerechnet werden muss (x_var und y_var), können Sie einfach die oberen Koordinaten der Kachel finden, aber zu den unteren die Höhe und Breite hinzufügen, die der gewünschten Genauigkeit der Kachel entsprechen, umgerechnet in Grad.

import pyproj

geod = pyproj.Geod(ellps='WGS84')

lat_min, lon_min = mgrs_object.toLatLon(mgrs_id)

x_var = geod.line_length([lon_min, lon_min], [lat_min, lat_min + 1])
y_var = geod.line_length([lon_min, lon_min + 1], [lat_min, lat_min])

lat_max = lat_min + mgrs_tile_edge_size / x_var
lon_max = lon_min + mgrs_tile_edge_size / y_var

Der Nachteil dieser Methode ist, dass sie davon ausgeht, dass alle MGRS-Kacheln gleich sind, was nicht immer der Fall ist. Für diese Zonen wird eine Kachel zurückgegeben, die größer als die tatsächliche ist.


Fazit


Koordinatenreferenzsysteme sind ein wichtiger Aspekt von Fernerkundungsdaten, daher ist es von grundlegender Bedeutung, in der Lage zu sein, zwischen den verschiedenen Typen, die es gibt, zu konvertieren.

In diesem Beitrag habe ich eine Einführung gegeben, wie MGRS (und UTM) funktionieren und wie man die mgrs-Bibliothek von Python verwendet, um von MGRS-Koordinaten zu Latitude/Longitude in Grad und umgekehrt zu konvertieren.

Ich habe auch einen Weg gezeigt, wie man die Koordinaten (der linken unteren und oberen rechten Ecke) der MGRS-Kacheln anhand ihres Namens unabhängig von der Genauigkeit erhält, was nützlich ist, wenn man ganze MGRS-Kacheln aus einer Fernerkundungsquelle abrufen will, bei der Abfragen mit GPS-Koordinaten gemacht werden.