Di dalam basis data, geometri disimpan dalam disk dalam format yang hanya digunakan oleh program PostGIS. Agar program eksternal dapat menyisipkan dan mengambil geometri yang berguna, mereka perlu dikonversi ke dalam format yang dapat dimengerti aplikasi lain. Untungnya, PostGIS mendukung memancarkan dan mengonsumsi geometri dalam banyak format:
dari Pengantar PostGIS
Dengan format WKB:
Biner terkenal (WKB):
ST_GeomFromWKB (bytea) mengembalikan geometri
ST_AsBinary (geometri) mengembalikan bytea
ST_AsEWKB (geometry) mengembalikan bytea
ogr mengenali geometri bukan hasil bytea ( ST_AsEWKB()
)
# result -> bytea format:
query = "SELECT ST_AsEWKB(geom) FROM points LIMIT 1"
# result -> geometry from bytea:
query = "SELECT ST_GeomFromWKB(ST_AsEWKB(geom)) from points LIMIT 1;"
Uji dengan salah satu meja saya:
tidak ada:
query = """SELECT ST_AsText(ST_AsEWKB(geom)) from mytable;"""
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()
print row[0]
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
dan geometri:
query = """SELECT ST_AsText(ST_GeomFromWKB(ST_AsEWKB(geom))) from mytable;"""
# result
cur.execute(query)
row = cur.fetchone()
print row
('POINT(272070.600041 155389.38792)',)
Jadi, mari kita coba:
query = """SELECT ST_AsText(ST_GeomFromWKB(ST_AsEWKB(geom))) from mytable;"""
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()
wkb = row[0];
geom = ogr.CreateGeometryFromWkb(wkb)
ERROR 3: OGR Error: Unsupported geometry type
Mengapa
Karena hasil kueri adalah string:
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
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, ...)
query = """SELECT ST_AsGeoJSON(geom) from mytable;"""
cur.execute(query)
row = cur.fetchone()
point = ogr.CreateGeometryFromJson(row[0])
print "%d,%d" % (point.GetX(), point.GetY())
272070,155389
2) langsung osgeo.ogr ( Bagaimana mengonversi tabel PostGIS ke Shapefile dengan Python?, Misalnya)
geom = org.CreateGeometryFromWkb(wkb)
(seharusnyaogr
tidakorg
).