Innerhalb der Datenbank werden Geometrien in einem Format auf der Festplatte gespeichert, das nur vom PostGIS-Programm verwendet wird. Damit externe Programme nützliche Geometrien einfügen und abrufen können, müssen sie in ein Format konvertiert werden, das andere Anwendungen verstehen können. Glücklicherweise unterstützt PostGIS das Senden und Konsumieren von Geometrien in einer Vielzahl von Formaten:
von der Einführung in PostGIS
Mit dem WKB-Format:
Bekannte Binärdatei (WKB):
ST_GeomFromWKB (bytea) gibt Geometrie zurück
ST_AsBinary (Geometrie) gibt bytea zurück
ST_AsEWKB (Geometrie) gibt bytea zurück
ogr Geometrien erkennen und kein Bytea-Ergebnis ( 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;"
Test mit einem meiner Tische:
nichts:
query = """SELECT ST_AsText(ST_AsEWKB(geom)) from mytable;"""
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()
print row[0]
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
und eine Geometrie:
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)',)
Lass es uns versuchen:
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
Warum ?
Weil das Ergebnis der Abfrage eine Zeichenfolge ist:
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
und kein Bytecode.
Sie müssen diese Zeichenfolge dekodieren (siehe Geometrie aus WKB erstellen im Python GDAL / OGR-Kochbuch ).
Deshalb ist es viel einfacher zu bedienen:
1) andere Ausgabeformate (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) direkt osgeo.ogr ( Wie konvertiere ich beispielsweise eine PostGIS-Tabelle in Shapefile in Python? )
geom = org.CreateGeometryFromWkb(wkb)
(sollteogr
nicht seinorg
).