rt_raster_to_gdal: no se pudo cargar el controlador GDAL de salida
En cuanto al primer error con ST_AsTIFF , debe habilitar sus controladores GDAL, que por defecto no están habilitados para PostGIS 2.1. Consulte el manual sobre formas de hacerlo. Por ejemplo, tengo una variable de entorno configurada en una computadora con Windows con:
POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
que se puede confirmar con PostGIS con:
SELECT short_name, long_name
FROM ST_GDALDrivers();
PostGIS a Numpy
Puede exportar la salida a un archivo GeoTIFF de memoria virtual para que GDAL lo lea en una matriz Numpy. Para obtener pistas sobre los archivos virtuales utilizados en GDAL, consulte esta publicación de blog .
import os
import psycopg2
from osgeo import gdal
# Adjust this to connect to a PostGIS database
conn = psycopg2.connect(...)
curs = conn.cursor()
# Make a dummy table with raster data
curs.execute("""\
SELECT ST_AsRaster(ST_Buffer(ST_Point(1, 5), 10), 10, 10, '8BUI', 1) AS rast
INTO TEMP mytable;
""")
# Use a virtual memory file, which is named like this
vsipath = '/vsimem/from_postgis'
# Download raster data into Python as GeoTIFF, and make a virtual file for GDAL
curs.execute("SELECT ST_AsGDALRaster(rast, 'GTiff') FROM mytable;")
gdal.FileFromMemBuffer(vsipath, bytes(curs.fetchone()[0]))
# Read first band of raster with GDAL
ds = gdal.Open(vsipath)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
# Close and clean up virtual memory file
ds = band = None
gdal.Unlink(vsipath)
print(arr) # this is a 2D numpy array
Muestra un punto tamponado rasterizado.
[[0 0 0 1 1 1 1 0 0 0]
[0 1 1 1 1 1 1 1 1 0]
[0 1 1 1 1 1 1 1 1 0]
[1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]
[0 1 1 1 1 1 1 1 1 0]
[0 1 1 1 1 1 1 1 1 0]
[0 0 0 1 1 1 1 0 0 0]]
Tenga en cuenta que usé un formato 'GTiff' en el ejemplo, pero otros formatos podrían ser más adecuados. Por ejemplo, si tiene un gran ráster que necesita ser transferido a través de una conexión lenta a Internet, intente usar 'PNG' para comprimirlo.
Creo que la pregunta era si puedes leer desde las tablas de trama postgis SIN los controladores de gdal habilitados. Como todas las cosas de Python, ¡puedes!
Asegúrese de seleccionar su resultado ráster como WKBinary:
seleccione St_AsBinary (rast) ...
Utilice el siguiente script para descifrar WKBinary en un formato de imagen de Python. Prefiero opencv, porque maneja un número arbitrario de bandas de imagen, pero uno puede usar PIL / low si 1 o 3 bandas son más habituales.
Solo manejo imágenes de bytes por ahora, pero es relativamente trivial expandirse a otros tipos de datos.
Espero que esto sea útil.
fuente