Raster di georeferenziazione con GDAL e Python?


10

Voglio georeferenziare un raster usando pythone GDAL. Il mio attuale approccio è chiamare gdal_translatee gdalwarpusare os.systeme un brutto elenco di punti di controllo a terra. Mi piacerebbe davvero un modo per farlo nativamente all'interno python.

Questo è l'attuale processo che sto usando:

import os

os.system('gdal_translate -of GTiff -gcp 1251.92 414.538 -7.9164e+06 5.21094e+06 -gcp 865.827 107.699 -7.91651e+06 5.21104e+06  "inraster.tif" "outraster1.tif"')
os.system('gdalwarp -r bilinear -tps -co COMPRESS=NONE "outraster2.tif" "outraster3.tif"')

C'è una domanda e una risposta precedenti del 2012 che afferma che è gdal_translatepossibile accedere dopo l'importazione gdal. Non sono sicuro se è obsoleto o se è sbagliato, ma quando corro from osgeo import gdalnon vedo gdal.gdal_translatecome un'opzione.

Non so se esiste, ma mi piacerebbe se potessi tradurre e riproiettare i raster in modo pitonico. Per esempio:

# translate
gcp_points = [(1251.92, 414.538), (-7.9164e+06, 5.21094e+06)]
gdal.gdal_translate(in_raster, gcp_points, out_raster1)

# warp
gdal.gdalwarp(out_raster1, out_raster2, 'bilinear', args*)

Un tale approccio è possibile?


1
gdal_translate e gdalwarp e altre utility gdal non sono pacchetti / moduli python, sono eseguibili autonomi. Puoi usare os.system o (preferibilmente) sottoprocesso. Apri per chiamarli.
user2856

@Luke quindi non c'è modo di interagire con queste utility gdal? Sarei felice di esplorare come scrivere un wrapper Python per questi se uno non esiste.
djq

Puoi usare l'API python di gdal per fare quasi tutto ciò che le utility gdal_translate e gdalwarp possono fare, è solo un po 'più complicato. Dai un'occhiata a gdal.AutoCreateWarpedVRT e gdal Driver.CreateCopy.
user2856

Risposte:


17

Ecco un esempio che fa all'incirca quello che chiedi. I parametri principali sono l' geotransformarray che gdal usa per descrivere una posizione raster (posizione, scala di pixel e inclinazione) e il epsgcodice della proiezione. Con ciò, il seguente codice dovrebbe georeferenziare correttamente il raster e specificare la sua proiezione.

Non ho provato così tanto, ma sembrava funzionare per me. Dovresti assicurarti che le coordinate che ho inserito siano corrette e probabilmente cambieranno la proiezione e la scala / dimensione dei pixel. Spero che sia d'aiuto.

from osgeo import gdal, osr

src_filename ='/path/to/source.tif'
dst_filename = '/path/to/destination.tif'

# Opens source dataset
src_ds = gdal.Open(src_filename)
format = "GTiff"
driver = gdal.GetDriverByName(format)

# Open destination dataset
dst_ds = driver.CreateCopy(dst_filename, src_ds, 0)

# Specify raster location through geotransform array
# (uperleftx, scalex, skewx, uperlefty, skewy, scaley)
# Scale = size of one pixel in units of raster projection
# this example below assumes 100x100
gt = [-7916400, 100, 0, 5210940, 0, -100]

# Set location
dst_ds.SetGeoTransform(gt)

# Get raster projection
epsg = 3857
srs = osr.SpatialReference()
srs.ImportFromEPSG(epsg)
dest_wkt = srs.ExportToWkt()

# Set projection
dst_ds.SetProjection(dest_wkt)

# Close files
dst_ds = None
src_ds = None

2
È giusto ma se vuoi essere più preciso, in caso di rotazione, devi usare la Trasformazione Affine e calcolare i parametri giusti con il pacchetto Affine ( scarica da qui ). Utilizzo: 'Affine.scale (PARAMETER) * Affine.rotation (ANGLE)'. I PARAMETRI provengono dal rapporto in pixel delle due immagini, puoi usare 'gdalinfo' o PIL per conoscere la dimensione dei pixel, ANGOLO è l'angolo.
CaMa,
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.