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.