Come posso convertire le coordinate affine in lat / lng?


14

Sono estremamente nuovo in GIS.

Sto usando gdalper leggere in una mappa landuse / landcover e ho bisogno di selezionare il lat / lng di alcuni tipi di copertura del suolo per indicizzare in un set di dati diverso che è espresso solo in lat / lng. Sfortunatamente, non capisco la forma delle coordinate xey fornite dalla geotrasforma, in particolare la originXe originYsotto:

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

La stampa di questi valori mi dà coordinate come (447466.693808, 4952570.40529). In che modo si collegano alla latitudine e alla longitudine originali?

Modificare:

Ecco un semplice esempio di pitone che mi ha dato quello che stavo cercando:

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

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

Rubato da: tolatlong.py


Sembra che i tuoi dati siano proiettati (ad es. UTM) e dovrai sapere qual è la proiezione per "riprogrammare" su coordinate long / lat.

@Dan Grazie, quindi so di poter ottenere la proiezione tramite a dataset.GetProjectionRef()e scoprire che sto usando "UTM Zone 10", ma poi? Sto cercando su google metodi come "unproject" ma sto arrivando a null.
Ricco

scusate per l'uso del termine unproject (tra virgolette) poiché i dati in gradi decimali non vengono proiettati, ma se volete riportare i dati proiettati in gradi decimali da una data proiezione, dovete (notare le virgolette) "progetto" torna a un sistema di coordinate geografiche, ovvero i dati dei gradi decimali.

2
Questo thread (più recente) fornisce un esempio esplicito e un'altra soluzione: gis.stackexchange.com/questions/8430/…
whuber

Risposte:


10

gdal_translate riproietterà i tuoi dati da qualsiasi proiezione sia in qualsiasi altro (in questo caso vuoi EPSG: 4326) usando:

gdal_translate -a_srs epsg:4326 srcfile new_file 

oppure potresti usare gdaltrasform per convertire i punti (e sono sicuro che puoi accedervi anche da Python (?))


(+1) Non so perché questo sia stato sottoposto a downgrade, Ian, perché mi sembra una sorta di operazione che sarà necessaria dopo l'applicazione della trasformazione affine.
whuber

gdal_translate non funzionerà nel modo in cui lo hai (o piuttosto assegnerebbe semplicemente EPSG: 4326 ai dati), devi deformare i dati con qualcosa del tipo: gdalwarp -s_srs EPSG: 32610 -t_srs EPSG: 4326 src dest Se il i dati hanno già metadati di proj, puoi abbandonare il parametro -s_srs.
MerseyViking,

Forse è quello che sto cercando. "Epsg: 4326" è una trasformazione in lat / lng globale? Penso di vedere alcune lezioni in cui posso fornire una proiezione, stavo pensando "WGS: 84", ma non conosco la differenza.
Ricco

1
@Rich Fai clic sul tag "sistema di coordinate" nella tua domanda, ordina la pagina risultante per voto e inizia a leggere. Molte delle tue domande riceveranno risposta entro pochi minuti.
whuber

7

La geotrasformazione è documentata su https://gdal.org/user/raster_data_model.html . L'idea è che prendi le coordinate (x, y) direttamente dal set di dati, applichi una trasformazione lineare per ottenere (u, v) con

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

(puoi prendere questo per essere il definizione di una trasformazione lineare), quindi sposta l'origine aggiungendo geotrasforma [0] a u e geotrasforma [3] a v. Ciò fornisce la "trasformazione affine" di (x, y). Ha davvero lo scopo di ruotare, cambiare scala, forse correggere un po 'per alcuni errori di inclinazione e riposizionare le coordinate specifiche dei dati (x, y) per abbinare un sistema di coordinate noto. Il risultato dovrebbe produrre coordinate proiettate. Questo significa semplicemente che esiste una procedura matematica che prende (longitudine, latitudine) e li trasforma in coordinate note: questa si chiama "proiezione". "Unprojecting" sta facendo il contrario; quindi, se sai quale proiezione è necessaria, la applichi alle coordinate affine trasformate (x, y) per ottenere la latitudine e la longitudine.

A proposito, i valori delle costanti a, b, c, d sono dati dalle voci 1, 2, 4 e 5 nell'array geotrasformato.


1
Ho letto la sezione geotrasformata del link che hai fornito, ma non credo che questo sia ciò che sto cercando. Scusate se sono ottuso, ma questo non descrive come proiettare gli indici xey (da 0 a XSize o YSize) alle coordinate proiettate? Sono curioso di sapere come tradurre le coordinate proiettate in latitudine e longitudine. Come semplice esempio, la geotrasformazione definisce l'origine x / y dell'angolo in alto a sinistra del quadro in coordinate proiettate (447466.693808, 4952570.40529). Come trasformerei quelle coordinate in lat / lng (qualcosa come lat: 44, lng: -122).
Ricco

@Rich No, quel link non descrive una proiezione. Descrive solo un cambio di coordinate tra due mappe, non tra il mondo e una mappa. La non proiezione trasforma la trasformazione affine delle coordinate in (lat, lon). Tu non vuole scrivere il codice per che se si può farne a meno! La non proiezione è quasi sempre una questione di identificare quale proiezione è necessaria e chiamare il software giusto per fare il lavoro per te (come suggerito nella risposta di @ iant).
whuber

Il collegamento è interrotto. @whuber ho ragione che la trasformazione affine (dal GetGeoTransform di GDAL) è una trasformazione tra pixel e coordinate CRS? Quindi, ad esempio se i dati sono in una proiezione GDA, i punti devono essere trasformati da WGS84 / lat / lon in GDAXX usando ad esempio CoordianteTransform e quindi in pixel usando l'affine GeoTransform? Questo processo in due passaggi è qualcosa che mi ha fatto inciampare parecchio, e sospetto che stia causando anche problemi ai PO. Non ha aiutato il fatto che xarray / rasterio sembra avere un bug che rovina i valori di GeoTransform: github.com/pydata/xarray/issues/3185
naught101

Ho trovato il nuovo URL e aggiornato il mio post.
whuber

0

È possibile utilizzare quanto segue:

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 restituirà longitudine (x) e latitudine (y) di tutti i pixel. Tieni presente che le coordinate si trovano nell'angolo sinistro di un pixel


Non dovrebbero essere gli indizi [1] * padfTransform [1] + index [0] * padfTransform [2] e viceversa per l'yp?
CMCDragonkai,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.