Conversione di geoTiff proiettato in WGS84 con GDAL e Python


16

Mi scuso se la seguente domanda è alquanto stupida, ma io sono MOLTO nuovo di tutto questo GIS.

Sto cercando di convertire alcune immagini geoTiff proiettate in WGS84 usando gdal in python. Ho trovato un post che delinea il processo di trasformazione dei punti all'interno di GeoTiffs proiettati usando qualcosa di simile al seguente:

from osgeo import osr, gdal

# get the existing coordinate system
ds = gdal.Open('path/to/file')
old_cs= osr.SpatialReference()
old_cs.ImportFromWkt(ds.GetProjectionRef())

# create the new coordinate system
wgs84_wkt = """
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]]"""
new_cs = osr.SpatialReference()
new_cs .ImportFromWkt(wgs84_wkt)

# create a transform object to convert between coordinate systems
transform = osr.CoordinateTransformation(old_cs,new_cs) 

#get the point to transform, pixel (0,0) in this case
width = ds.RasterXSize
height = ds.RasterYSize
gt = ds.GetGeoTransform()
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5] 

#get the coordinates in lat long
latlong = transform.TransformPoint(x,y) 

La mia domanda è, se voglio convertire questi punti e creare un nuovo file GeoTiff WGS84, è questo il modo migliore per farlo? Esiste una funzione che farà come l'attività in 1 passaggio?

Grazie!

Risposte:


21

Un modo più semplice sarebbe utilizzare gli strumenti da riga di comando GDAL:

gdalwarp infile.tif outfile.tif -t_srs "+proj=longlat +ellps=WGS84"

Questo può essere invocato abbastanza facilmente tramite script per lavori batch. Ciò deformerà il raster su una nuova griglia e ci sono altre opzioni per controllare i dettagli.

http://www.gdal.org/gdalwarp.html

Il sistema di coordinate di destinazione (t_srs) può essere PROJ.4 come mostrato, o un file reale con WKT, tra le altre opzioni. Si presume che il sistema di coordinate di origine (-s_srs) sia noto, ma può essere impostato in modo esplicito come il target.

Potrebbe essere più facile portare a termine il lavoro se non devi usare l'API GDAL tramite Python.

C'è un tutorial per deformare con l'API qui, dice che il supporto per Python è incompleto (non conosco i dettagli): http://www.gdal.org/warptut.html


1
Grazie per l'ottima risposta mdsumner! Mentre la soluzione che sto cercando dovrebbe essere scritta in Python, forse posso cavarmela semplicemente eseguendo questo comando in loop in uno script Python.
JT.WK,

16

Come ha detto mdsumner, è molto più facile usare la riga di comando rispetto ai binding di Python, a meno che non si desideri eseguire attività molto complesse.

Quindi, se ti piace Python, come faccio io, puoi eseguire lo strumento da riga di comando con:

import os  
os.sys('gdalwarp infile.tif outfile.tif -t_srs "+proj=longlat +ellps=WGS84"')

o scorrere attraverso un elenco di file:

listoffiles=['file1, file2, file3, filen']  
for file in listoffiles:
    os.system('gdalwarp %s %s -t_srs "+proj=longlat +ellps=WGS84"' %(file,'new_'+file))  

E persino utilizzare strumenti di multiprocessing sfruttano tutta la potenza della macchina per eseguire grandi compiti.


Grazie Pablo. Gli strumenti multiprocessore sono qualcosa che esaminerò sicuramente!
JT.WK,

Su gdal 2.0 c'è il supporto nativo per il multiprocessing - basta aggiungere -wo NUM_THREADS = ALL_CPUS al tuo comando gdalwarp.
ValLondra,

3
os.sysè un modulo integrato; vuoi il os.systemcomando
Mike T

1
La mia risposta è obsoleta, subprocess.call è un approccio migliore.
Pablo,
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.