rt_raster_to_gdal: impossible de charger le pilote GDAL de sortie
Quant à la première erreur avec ST_AsTIFF , vous devez activer vos pilotes GDAL, qui par défaut ne sont pas activés pour PostGIS 2.1. Consultez le manuel pour savoir comment procéder. Par exemple, j'ai une variable d'environnement configurée sur un ordinateur Windows avec:
POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
qui peut être confirmé avec PostGIS avec:
SELECT short_name, long_name
FROM ST_GDALDrivers();
PostGIS à Numpy
Vous pouvez exporter la sortie vers un fichier GeoTIFF de mémoire virtuelle pour que GDAL puisse le lire dans un tableau Numpy. Pour obtenir des conseils sur les fichiers virtuels utilisés dans GDAL, consultez cet article 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
Affiche un point tamponné tramé.
[[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]]
Notez que j'ai utilisé un format «GTiff» dans l'exemple, mais d' autres formats pourraient être mieux adaptés. Par exemple, si vous avez un grand raster qui doit être transféré via une connexion Internet lente, essayez d'utiliser 'PNG' pour le compresser.