rt_raster_to_gdal: Não foi possível carregar o driver GDAL de saída
Quanto ao primeiro erro com ST_AsTIFF , você precisa habilitar os drivers GDAL, que por padrão não estão habilitados para o PostGIS 2.1. Veja o manual sobre maneiras de fazer isso. Por exemplo, eu tenho uma variável de ambiente configurada em um computador Windows com:
POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
o que pode ser confirmado com o PostGIS com:
SELECT short_name, long_name
FROM ST_GDALDrivers();
PostGIS para Numpy
Você pode exportar a saída para um arquivo GeoTIFF de memória virtual para o GDAL ler em uma matriz Numpy. Para obter dicas sobre arquivos virtuais usados no GDAL, consulte esta postagem do 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
Mostra um ponto em buffer 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]]
Observe que usei um formato 'GTiff' no exemplo, mas outros formatos podem ser mais adequados. Por exemplo, se você tem uma grande varredura que precisa ser transferida através de uma conexão lenta à Internet, tente usar 'PNG' para compactá-la.