rt_raster_to_gdal: ไม่สามารถโหลดไดรเวอร์ GDAL เอาต์พุต
สำหรับข้อผิดพลาดแรกกับST_AsTIFFคุณต้องเปิดใช้งานไดรเวอร์ GDAL ของคุณซึ่งโดยค่าเริ่มต้นจะไม่เปิดใช้งานสำหรับ PostGIS 2.1 ดูคู่มือวิธีการทำเช่นนี้ ตัวอย่างเช่นฉันมีการตั้งค่าตัวแปรสภาพแวดล้อมบนคอมพิวเตอร์ Windows ด้วย:
POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
ซึ่งสามารถยืนยันกับ PostGIS ด้วย:
SELECT short_name, long_name
FROM ST_GDALDrivers();
PostGIS ไปยัง Numpy
คุณสามารถส่งออกผลลัพธ์ไปยังไฟล์ GeoTIFF หน่วยความจำเสมือนสำหรับ GDAL เพื่ออ่านไปยังอาร์เรย์ Numpy สำหรับคำแนะนำเกี่ยวกับไฟล์เสมือนที่ใช้ใน GDAL ดูโพสต์บล็อกนี้
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
แสดงจุดบัฟเฟอร์ที่แรสเตอร์แล้ว
[[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]]
โปรดทราบว่าฉันใช้รูปแบบ 'GTiff' ในตัวอย่าง แต่รูปแบบอื่นอาจเหมาะสมกว่า ตัวอย่างเช่นหากคุณมีแรสเตอร์ขนาดใหญ่ที่ต้องถ่ายโอนผ่านการเชื่อมต่ออินเทอร์เน็ตที่ช้าให้ลองใช้ 'PNG' เพื่อบีบอัดข้อมูล