¿Alisar / interpolar ráster en Python usando GDAL?

20

Estoy desarrollando en Python y usando GDAL de OSGEO para manipular e interactuar con rásteres y archivos de forma.

Quiero tomar un archivo de forma que tenga entidades de puntos e interpolarlo en un ráster de superficie. En este momento estoy usando el método 'RasterizeLayer' que quema un valor de la entidad de puntos en el ráster (que se establece con todos los valores de nodata) pero deja todos los píxeles intactos como un valor 'nodata'. Por lo tanto, me queda un ráster tipo tablero de ajedrez.

Lo que tengo después de usar RasterizeLayer:

[Ráster por usar gdal.rasterizelayer]

Lo que quiero para un producto final:

ingrese la descripción de la imagen aquí

Creo que la función que estoy buscando se conoce como 'Spline_sa ()' de la importación arcgisscripting.

¿GDAL tiene una función similar o hay un método diferente para obtener el resultado deseado?

Doug
fuente

Respuestas:

18

Echaría un vistazo a NumPy y Scipy: hay un buen ejemplo de datos de puntos de interpolación en el libro de cocina SciPy utilizando la función scipy.interpolate.griddata . Obviamente, esto requiere que tenga los datos en una matriz numpy;

  • Usando los enlaces de Python GDAL puede leer sus datos en Python usando gdal.Dataset.ReadAsArray()un ráster.
  • Con OGR, recorrerá la capa de entidades y extraerá los datos del punto del archivo de forma (o mejor aún, escriba el archivo de forma en un CSV usando GEOMETRY=AS_XYZ[vea el formato de archivo CSV de OGR] y lea el csv en Python).

Una vez que tenga una salida cuadriculada, puede usar GDAL para escribir la matriz numpy resultante en un ráster.

Por último, si no tiene suerte con la biblioteca de interpolación Scipy, siempre puede probar scipy.ndimage también.

om_henners
fuente
¡Gracias por la ayuda! Estoy dando un giro al enfoque Scipy.interpolate.griddata. Volveré a publicar mis resultados.
Doug
1
Pido disculpas por tardar tanto en volver a esta publicación. La respuesta anterior es básicamente lo que hice para resolver mi problema. Utilicé la biblioteca de interpolación Scipy para completar esos espacios de nodata y luego la escribí en la banda de trama. ¡Gracias por la ayuda chicos!
Doug
@Doug No se preocupe, ¡feliz de sanar!
om_henners
1
¿Qué tan rápido es esta solución? ¿Se puede usar para una cuadrícula de 10k x 10k donde solo cada 100x100 es un valor conocido? Intenté gdal_fillnodata, que es increíblemente rápido en comparación con cualquier interpolación, pero no funciona bien para puntos demasiado dispersos. En este momento estoy usando triangulación de Saga, pero es muy lento para matrices medianas y falla con las grandes.
Miro
12

Eche un vistazo a la API de cuadrícula GDAL . No sé si eso está expuesto en los enlaces de Python, pero si no, llame a la utilidad gdal_grid a través del módulo de subproceso .

La API de cuadrícula GDAL solo usa ponderación de distancia inversa, media móvil y vecino más cercano, no implementa splines. Otra opción es usar Scipy .

usuario2856
fuente
1

Un poco viejo para este hilo, pero he escrito un módulo simple que usa el algoritmo KNN de sklearn llamado skspatial.

https://github.com/rosskush/skspatial

Puede importar un archivo de forma utilizando geopandas y seleccionar una columna e interpolará una superficie que se puede exportar a un ráster. Es muy básico y probablemente no sea la mejor manera de hacerlo, pero al menos mantiene todo Python puro.

rosskush
fuente