8 votos

En Python, un raster GDAL de lectura de la memoria en lugar de un archivo

Me gustaría analizar algunos de los datos ráster en Python usando NumPy.

Estos datos no existe necesariamente como un archivo en el sistema de archivos, puede ser el resultado de una consulta en PostGIS, o algo transferidos a través de la red.

Es posible conseguir GDAL para leer los datos de un buffer en la memoria, en lugar de requerir un nombre de archivo?

Me doy cuenta de que una solución podría ser abrir un nombre de archivo temporal, escribir los datos a que, y pasar como un nombre de archivo para GDAL, pero que parece ineficiente, y más probabilidades de incurrir en I/O cuellos de botella. Además, en el caso de PostGIS, sería bueno leer el formato nativo directamente, como contraposición a la conversión a otro formato de archivo y la lectura.

Edit: para aclarar un poco de confusión, simplemente utilizando el driver de PostGIS directamente no funciona bien, ya que la consulta podría ser por una trama de análisis, en lugar de sólo los datos almacenados en la base de datos.

6voto

GDAL tiene un Controlador de memoria y un controlador de PostGIS .

Puede utilizar lo siguiente para crear una trama en la memoria:

# open postgis data
databaseServer = "<IP of database server OR Name of database server"
databaseName = "<Name of database>"
databaseUser = "<User name>"
databasePW = "<User password>"
connString = "PG: host=%s dbname=%s user=%s password=%s" %(databaseServer,databaseName,databaseUser,databasePW)
src_ds = gdal.Open(connString)

#create Memory driver
format = " MEM "
driver = gdal.GetDriverByName( format )

#copy data from PostGIS to Memory
driver.CreateCopy('', src_ds ) 

5voto

hernan43 Puntos 566

Si tienes tu propio bytes y la necesidad de un objeto Raster GDAL, sólo utilizan el controlador MEM . No hay archivos necesarios.

from osgeo import gdal
import numpy as np
driver = gdal.GetDriverByName('MEM')
src_ds = driver.Create('', 100, 200, 1)
band = src_ds.GetRasterBand(1)
# Create random data array to put into the raster object
ar = np.random.randint(0, 255, (200, 100))
band.WriteArray(ar)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X