Saya mencoba menarik LineString
geometri dari PostGIS dan menguraikannya dengan OGR (python bindinds).
from osgeo import ogr
import psycopg2
connection = psycopg2.connect("...")
cursor = connection.cursor()
query = "SELECT geom FROM points LIMIT 1"
cursor.execute(query)
row = cursor.fetchone()
wkb = row[0]
geom = ogr.CreateGeometryFromWkb(wkb)
cursor.close()
connection.close()
Saya sudah mencoba:
wkb = bin(int(row[0], 16))
dan:
SELECT ST_AsEWKB(geom) FROM points LIMIT 1
OGR tidak ingin menguraikannya. Terus memberikan kesalahan berikut:
ERROR 3: OGR Error: Unsupported geometry type
geom = org.CreateGeometryFromWkb(wkb)
(seharusnyaogr
tidakorg
).Jawaban:
Secara internal, PostGIS menyimpan geometri dalam spesifikasi biner, tetapi ia dipertanyakan dan dilihat di luar sebagai string yang dikodekan-hex. Ada dua variasi populer biner terkenal (WKB) :
ST_AsEWKB
) - spesifikasi WKB yang diperluas yang dirancang oleh PostGIS .ST_AsBinary
) - ditentukan oleh OGC dan ISO. Untuk sementara itu hanya 2D, tetapi kemudian diperluas untuk mendukungZ
,M
danZM
geometri.Kedua spesifikasi adalah sama untuk geometri 2D, tetapi berbeda untuk geometri tingkat tinggi dengan
Z
,M
danZM
koordinat.Versi GDAL / OGR (1.x) yang lebih lama hanya memahami EWKB untuk geometri 3D, jadi untuk ini saya sarankan menggunakan
ST_AsEWKB
. (Tetapi jika Anda hanya memiliki geometri 2D, formatnya baik-baik saja). Sebagai contoh:Juga, perhatikan bahwa versi GDAL / OGR yang lebih lama tidak mendukung
M
koordinat, dan ini akan diuraikan tetapi diabaikan.Dengan GDAL 2.0 dan yang terbaru , ISO WKT / WKB didukung . Ini berarti bahwa
CreateGeometryFromWkb
dapat membaca rasa WKB (tanpa menentukan) danExportToIsoWkt()
menunjukkan output dengan sintaks WKT modern.Selain itu, GDAL 2.1 atau yang lebih baru akan membuat / mengekspor WKT / WKB dengan
M
atauZM
koordinat seperti yang diharapkan.sumber
dari Pengantar PostGIS
Dengan format WKB:
ogr mengenali geometri bukan hasil bytea (
ST_AsEWKB()
)Uji dengan salah satu meja saya:
tidak ada:
dan geometri:
Jadi, mari kita coba:
Mengapa
Karena hasil kueri adalah string:
dan bukan bytecode.
Anda perlu mendekode string ini (lihat Membuat Geometri dari WKB di Python GDAL / OGR Cookbook ).
Itulah mengapa lebih mudah digunakan:
1) format output lainnya (WKT, GeoJSON, ...)
2) langsung osgeo.ogr ( Bagaimana mengonversi tabel PostGIS ke Shapefile dengan Python?, Misalnya)
sumber
Anda ingin menggunakan
ST_AsBinary(geom)
untuk mengubah geometri Anda dari format internal PostGIS ke WKB yang dapat Anda baca dengan ogr:Dalam istilah Postgres, hasil Anda adalah a
bytea
. Pustaka psycpopg2 akan memetakan ini kememoryview
tipe Python:Hanya melemparkan Anda
memoryview
untukbytes
membaca WKB dengan OGR:Jika Anda khawatir dengan ketepatan angka, pasti hindari penggunaan
ST_AsText()
. Fungsi itu mengubah geometri Anda menjadi WKT, memotong koordinat Anda dengan presisi yang tergantung pada versi dan platform PostGIS Anda.sumber