Smoothing / interpolating raster in Python usando GDAL?


20

Sto sviluppando in Python e usando GDAL di OSGEO per manipolare e interagire con raster e shapefile.

Voglio prendere un file di forma con caratteristiche punto e interpolarlo in un raster di superficie. In questo momento sto usando il metodo 'RasterizeLayer' che brucia un valore dalla funzione punto nel raster (che è impostato con tutti i valori di nodata) ma lascia tutti i pixel intatti come valore di 'nodata'. Mi rimane quindi un raster di tipo a scacchiera.

Quello che ho dopo aver usato RasterizeLayer:

[Raster dall'uso di gdal.rasterizelayer]

Cosa voglio per un prodotto finale:

inserisci qui la descrizione dell'immagine

Credo che la funzione che sto cercando sia conosciuta come 'Spline_sa ()' dall'importazione arcgisscripting.

GDAL ha una funzione simile o esiste un metodo diverso per ottenere l'output desiderato?

Risposte:


18

Darei un'occhiata a NumPy e Scipy - c'è un buon esempio di interpolazione dei dati dei punti nel ricettario SciPy usando la funzione scipy.interpolate.griddata . Ovviamente questo richiede che tu abbia i dati in una matrice numpy;

  • Usando i binding python GDAL puoi leggere i tuoi dati in Python usando gdal.Dataset.ReadAsArray()per un raster.
  • Con OGR passeresti attraverso il feature layer ed estraendo i dati dei punti dal file di forma (o meglio ancora, scrivi il file di forma in un CSV usando GEOMETRY=AS_XYZ[vedi il formato di file CSV OGR] e leggi il CSV in Python).

Una volta ottenuto un output con griglia, è quindi possibile utilizzare GDAL per scrivere l'array numpy risultante su un raster.

Infine, se non hai fortuna con la libreria interpolata Scipy, puoi sempre provare anche scipy.ndimage .


Grazie per l'aiuto! Sto dando un vortice all'approccio di Scipy.interpolate.griddata. Riporterò i miei risultati.
Doug,

1
Mi scuso per aver impiegato così tanto tempo per tornare a questo post. La risposta sopra è sostanzialmente ciò che ho fatto per risolvere il mio problema. Ho usato la libreria interpolata di Scipy per riempire quegli spazi di nodata e poi l'ho riscritta nella banda raster. Grazie per l'aiuto ragazzi!
Doug

@Doug Nessun problema - felice di guarire!
om_henners,

1
Quanto è veloce questa soluzione? Può essere utilizzato per una griglia 10k x 10k in cui solo ogni 100x100 è un valore noto? Ho provato gdal_fillnodata che è incredibilmente veloce rispetto a qualsiasi interpolazione ma non funziona bene per punti troppo sparsi. In questo momento sto usando la triangolazione di Saga ma è molto lenta per array medi e fallisce con quelli grandi.
Miro,

12

Dai un'occhiata all'API di griglia di GDAL . Non so se questo è esposto nei collegamenti Python, ma in caso contrario, si chiama chiamare l' utilità gdal_grid tramite il modulo di sottoprocesso .

L'API della griglia GDAL utilizza solo la ponderazione della distanza inversa, la media mobile e il vicino più vicino, non implementa spline. Un'altra opzione è usare Scipy .


1

Un po 'vecchio di questo thread, ma ho scritto un semplice modulo che utilizza l'algoritmo KNN di sklearn chiamato skspatial.

https://github.com/rosskush/skspatial

È possibile importare un file di forma utilizzando geopandas e selezionare una colonna per interpolare una superficie che può essere esportata in un raster. È molto semplice e probabilmente non è il modo migliore per farlo, ma mantiene almeno tutto puro pitone.

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.