Wie konvertiere ich affine Koordinaten in lat / lng?

14

Ich bin sehr neu in GIS.

Ich benutze gdal, um eine Landnutzungs- / Landbedeckungskarte einzulesen, und ich muss die Länge bestimmter Landbedeckungstypen auswählen, um sie in einem anderen Datensatz zu indizieren, der nur in Länge ausgedrückt wird. Unfortuantely, ich verstehe nicht , die Form der x und y , die ich gegeben Koordinaten aus dem Geotransformation, insbesondere die originXund originYunten:

geotransform = dataset.GetGeoTransform()
originX = geotransform[0]
originY = geotransform[3]

Das Drucken dieser Werte gibt mir Koordinaten wie (447466.693808, 4952570.40529). Wie hängen diese mit dem ursprünglichen Breiten- und Längengrad zusammen?

Bearbeiten:

Hier ist ein einfaches Python-Beispiel, mit dem ich gefunden habe, wonach ich gesucht habe:

srs = osr.SpatialReference()
srs.ImportFromWkt(dataset.GetProjection())

srsLatLong = srs.CloneGeogCS()
ct = osr.CoordinateTransformation(srs,srsLatLong)
print ct.TransformPoint(originX,originY)

Gestohlen von: tolatlong.py

Reich
quelle
Es sieht so aus, als wären Ihre Daten projiziert (z. B. UTM), und Sie müssen wissen, wie die Projektion aussieht, um die Projektion auf lange / lat. Koordinaten rückgängig zu machen.
@Dan Danke, ich weiß also, dass ich die Projektion über a abrufen dataset.GetProjectionRef()und herausfinden kann, dass ich "UTM Zone 10" verwende, aber was dann? Ich google nach Methoden wie "unproject", komme aber auf null.
Rich
Entschuldigung für die Verwendung des Begriffs "unproject" (in Anführungszeichen), da Daten in Dezimalgraden nicht projiziert werden. Wenn Sie jedoch die projizierten Daten von einer bestimmten Projektion auf Dezimalgrade zurücksetzen möchten, müssen Sie "project" (Anführungszeichen beachten). es zurück zu einem geografischen Koordinatensystem, auch Dezimalgraddaten genannt.
2
Dieser (neuere) Thread bietet ein explizites Beispiel und eine andere Lösung: gis.stackexchange.com/questions/8430/…
whuber

Antworten:

10

gdal_translate projiziert Ihre Daten von jeder Projektion in eine andere (in diesem Fall EPSG: 4326) mit:

gdal_translate -a_srs epsg:4326 srcfile new_file 

oder Sie könnten gdaltrasform verwenden , um die Punkte zu konvertieren (und ich bin sicher, Sie können auch von Python aus darauf zugreifen)

Ian Turton
quelle
(+1) Ich weiß nicht, warum dies abgelehnt wurde, Ian, weil es für mich wie eine Operation aussieht, die nach der Anwendung der affinen Transformation erforderlich sein wird.
whuber
gdal_translate funktioniert nicht so, wie Sie es haben (oder es würde den Daten lediglich EPSG: 4326 zuweisen). Sie müssen die Daten mit etwas wie folgendem verzerren: gdalwarp -s_srs EPSG: 32610 -t_srs EPSG: 4326 src dest Wenn die Daten haben bereits Projekt-Metadaten. Sie können den Parameter -s_srs weglassen.
MerseyViking
Vielleicht bin ich danach. Ist das "epsg: 4326" eine Transformation zu global lat / lng? Ich glaube, ich sehe einige Klassen, in denen ich eine Projektion erstellen kann. Ich dachte "WGS: 84", aber ich kenne den Unterschied nicht.
Rich
1
@Rich Klicken Sie auf das "Koordinatensystem" -Tag in Ihrer Frage, sortieren Sie die resultierende Seite nach Stimmen und beginnen Sie mit dem Lesen. Viele Ihrer Fragen werden innerhalb weniger Minuten beantwortet.
whuber
7

Die Geotransformation ist unter https://gdal.org/user/raster_data_model.html dokumentiert . Die Idee ist, dass Sie (x, y) -Koordinaten direkt aus dem Datensatz nehmen und eine lineare Transformation anwenden, um (u, v) zu erhalten

u = a*x + b*y
v = c*x + d*y

(Sie können dies als Definition einer linearen Transformation ansehen.) Verschieben Sie dann den Ursprung, indem Sie Geotransform [0] zu u und Geotransform [3] zu v hinzufügen. Dies ergibt die "affine Transformation" von (x, y). Es ist wirklich beabsichtigt, sich zu drehen, den Maßstab zu ändern, möglicherweise einige Schrägstellungsfehler ein wenig zu korrigieren und die datenspezifischen Koordinaten (x, y) neu zu positionieren, um sie an ein bekanntes Koordinatensystem anzupassen. Das Ergebnis soll projizierte Koordinaten erzeugen . Dies bedeutet einfach, dass es eine mathematische Prozedur gibt, bei der Längen- und Breitengrade in die bekannten Koordinaten umgewandelt werden. Dies wird als "Projektion" bezeichnet. "Unprojecting" macht das Gegenteil; Wenn Sie also wissen, welche Projektion erforderlich ist, wenden Sie diese auf die affinen transformierten (x, y) Koordinaten an um den Breiten- und Längengrad zu erhalten.

Übrigens sind die Werte der Konstanten a, b, c, d durch die Einträge 1, 2, 4 und 5 im Geotransform-Array gegeben.

whuber
quelle
1
Ich habe den Geotransform-Abschnitt des von Ihnen bereitgestellten Links gelesen, aber ich glaube nicht, dass ich danach suche. Es tut mir leid, wenn ich stumpf bin, aber beschreibt dies nicht, wie man x- und y-Indizes (0 auf XSize oder YSize) auf projizierte Koordinaten projiziert? Ich bin gespannt, wie Sie die projizierten Koordinaten in Längen- und Breitengrade übersetzen. Als einfaches Beispiel definiert die Geotransform den x / y-Ursprung der oberen linken Ecke des Rasters in projizierten Koordinaten (447466.693808, 4952570.40529). Wie würde ich diese Koordinaten wieder in lat / lng umwandeln (so etwas wie lat: 44, lng: -122)?
Rich
@Rich Nein, dieser Link beschreibt keine Projektion. Es beschreibt nur eine Änderung der Koordinaten zwischen zwei Karten, nicht zwischen der Welt und einer Karte. Die Entprojektion wandelt die affine Transformation der Koordinaten in (lat, lon) um. Sie möchten den Code dafür nicht schreiben, wenn Sie ihm helfen können! Bei der Projektionsentfernung geht es fast immer darum, festzustellen, welche Projektion erforderlich ist, und die richtige Software aufzurufen, um die Aufgabe für Sie zu erledigen (wie in der Antwort von @ iant vorgeschlagen).
whuber
Verbindung ist unterbrochen. @whuber habe ich recht, dass die affine Transformation (von GDALs GetGeoTransform) eine Transformation zwischen Pixeln und CRS-Koordinaten ist? Wenn sich die Daten beispielsweise in einer GDA-Projektion befinden, müssen Punkte von WGS84 / lat / lon mit z. B. der CoordianteTransform in GDAXX und dann mit der affinen GeoTransform in Pixel transformiert werden? Dieser zweistufige Prozess hat mich ziemlich erschüttert, und ich vermute, dass er auch die OP-Probleme verursacht. Hat nicht geholfen, dass xarray / rasterio einen Fehler zu haben scheint, der die GeoTransform-Werte durcheinander bringt: github.com/pydata/xarray/issues/3185
naught101
Ich habe die neue URL gefunden und meinen Beitrag aktualisiert.
whuber
0

Sie können Folgendes verwenden:

import gdal, numpy as n
def coord(file):
    padfTransform = file.GetGeoTransform()
    indices = n.indices(file.ReadAsArray().shape)
    xp = padfTransform[0] + indices[1]*padfTransform[1] + indices[1]*padfTransform[2]   
    yp = padfTransform[3] + indices[0]*padfTransform[4] + indices[0]*padfTransform[5]  
    return xp,yp
file = gdal.Open('Yourfile.tif') # A GeoTiff file
x,y = coord(file)

coord gibt den Längengrad (x) und Breitengrad (y) aller Pixel zurück. Beachten Sie, dass sich die Koordinaten in der linken Ecke eines Pixels befinden

Ishan Tomar
quelle
Sollte es nicht Indixe [1] * padfTransform [1] + Indices [0] * padfTransform [2] sein und umgekehrt für das yp?
CMCDragonkai