Ich versuche, eine LineString
Geometrie aus PostGIS zu ziehen und sie mit OGR (Python Bindinds) zu analysieren.
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()
Ich habe es versucht:
wkb = bin(int(row[0], 16))
und:
SELECT ST_AsEWKB(geom) FROM points LIMIT 1
OGR will es nicht analysieren. Gibt weiterhin den folgenden Fehler aus:
ERROR 3: OGR Error: Unsupported geometry type
geom = org.CreateGeometryFromWkb(wkb)
(sollteogr
nicht seinorg
).Antworten:
Intern speichert PostGIS Geometrien in einer binären Spezifikation, wird jedoch abgefragt und außerhalb als hexadezimal codierte Zeichenfolge angezeigt. Es gibt zwei beliebte Varianten der bekannten Binärdatei (WKB) :
ST_AsEWKB
) - eine erweiterte WKB-Spezifikation von PostGIS .ST_AsBinary
) - spezifiziert von OGC und ISO. Eine Zeit lang war es 2D-nur, aber später auf Unterstützung erweitertZ
,M
undZM
Geometrien.Die beiden Spezifikationen sind die gleichen für die 2D - Geometrien, aber sind unterschiedlich für höherer Ordnung Geometrien mit
Z
,M
undZM
Koordinaten.Ältere Versionen von GDAL / OGR (1.x) verstehen die EWKB nur für 3D-Geometrien, daher empfehle ich für diese die Verwendung
ST_AsEWKB
. (Wenn Sie jedoch nur 2D-Geometrien haben, sind beide Formate in Ordnung). Zum Beispiel:Beachten Sie außerdem, dass ältere GDAL / OGR-Versionen keine
M
Koordinaten unterstützen und diese analysiert, aber ignoriert werden.Mit GDAL 2.0 und neueren Versionen wird ISO WKT / WKB unterstützt . Dies bedeutet, dass
CreateGeometryFromWkb
entweder die WKB-Variante (ohne Angabe) gelesen werden kann undExportToIsoWkt()
die Ausgabe mit einer modernen WKT-Syntax angezeigt wird.Zusätzlich erstellt / exportiert GDAL 2.1 oder höher WKT / WKB mit
M
oderZM
Koordinaten wie erwartet.quelle
von der Einführung in PostGIS
Mit dem WKB-Format:
ogr Geometrien erkennen und kein Bytea-Ergebnis (
ST_AsEWKB()
)Test mit einem meiner Tische:
nichts:
und eine Geometrie:
Lass es uns versuchen:
Warum ?
Weil das Ergebnis der Abfrage eine Zeichenfolge ist:
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, ...)
2) direkt osgeo.ogr ( Wie konvertiere ich beispielsweise eine PostGIS-Tabelle in Shapefile in Python? )
quelle
Sie möchten verwenden
ST_AsBinary(geom)
, um Ihre Geometrie aus dem internen PostGIS-Format in WKB zu konvertieren, das Sie mit ogr lesen können:In Postgres-Begriffen ist Ihr Ergebnis a
bytea
. Die psycpopg2-Bibliothek ordnet dies einemmemoryview
Python-Typ zu:Wirf einfach deine
memoryview
,bytes
um die WKB mit ogr zu lesen:Wenn Sie sich mit numerischer Genauigkeit beschäftigen, vermeiden Sie auf jeden Fall die Verwendung
ST_AsText()
. Diese Funktion konvertiert Ihre Geometrie in WKT und schneidet Ihre Koordinaten mit einer Genauigkeit ab, die von Ihrer PostGIS-Version und -Plattform abhängt.quelle