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.