rt_raster_to_gdal: Nie można załadować wyjściowego sterownika GDAL
Jeśli chodzi o pierwszy błąd w ST_AsTIFF , musisz włączyć sterowniki GDAL, które domyślnie nie są włączone dla PostGIS 2.1. Zobacz, jak to zrobić. Na przykład mam zmienną środowiskową skonfigurowaną na komputerze z systemem Windows z:
POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
co można potwierdzić za pomocą PostGIS za pomocą:
SELECT short_name, long_name
FROM ST_GDALDrivers();
PostGIS na Numpy
Możesz wyeksportować dane wyjściowe do pliku GeoTIFF pamięci wirtualnej, aby GDAL mógł je odczytać do tablicy Numpy. Wskazówki dotyczące plików wirtualnych używanych w GDAL można znaleźć w tym poście na blogu .
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
Pokazuje zrasteryzowany buforowany punkt.
[[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]]
Zauważ, że użyłem formatu „GTiff” w tym przykładzie, ale inne formaty mogą być bardziej odpowiednie. Na przykład, jeśli masz duży raster, który musi zostać przesłany przez wolne połączenie internetowe, spróbuj użyć „PNG”, aby go skompresować.
Myślę, że pytanie brzmiało, czy można czytać z tabel rastrowych Postgis BEZ włączonych sterowników gdal. Jak wszystko Python, możesz!
Upewnij się, że wybrałeś wynik rastra jako WKBinary:
wybierz St_AsBinary (rast) ...
Użyj poniższego skryptu, aby rozszyfrować WKBinary w formacie obrazu python. Wolę opencv, ponieważ obsługuje dowolną liczbę pasm obrazu, ale można użyć PIL / low, jeśli 1 lub 3 pasma są bardziej typowe.
Obecnie obsługuję tylko bajtowe obrazy, ale rozszerzenie na inne typy danych jest stosunkowo proste.
Mam nadzieję, że to się przyda.
źródło