J'essaie d'extraire une LineString
géométrie de PostGIS et de l'analyser avec OGR (bindinds python).
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()
J'ai essayé:
wkb = bin(int(row[0], 16))
et:
SELECT ST_AsEWKB(geom) FROM points LIMIT 1
OGR ne veut pas l'analyser. Continue de donner l'erreur suivante:
ERROR 3: OGR Error: Unsupported geometry type
geom = org.CreateGeometryFromWkb(wkb)
(ne devraitogr
pas l' êtreorg
).Réponses:
En interne, PostGIS stocke les géométries dans une spécification binaire, mais elle est interrogée et vue à l'extérieur sous la forme d'une chaîne codée hexadécimale. Il existe deux variantes populaires de binaire bien connu (WKB) :
ST_AsEWKB
) - une spécification WKB étendue conçue par PostGIS .ST_AsBinary
) - spécifié par l'OGC et l'ISO. Pendant un certain temps , il était 2D seulement, mais plus tard étendu à l' appuiZ
,M
etZM
géométries.Les deux spécifications sont les mêmes pour les géométries 2D, mais sont différentes pour des géométries d'ordre supérieur avec
Z
,M
et lesZM
coordonnées.Les versions plus anciennes de GDAL / OGR (1.x) ne comprennent que l'EWKB pour les géométries 3D, donc je recommande d'utiliser celles-ci
ST_AsEWKB
. (Mais si vous n'avez que des géométries 2D, les deux formats conviennent.) Par exemple:Notez également que les anciennes versions de GDAL / OGR ne prennent pas en charge les
M
coordonnées, et celles-ci seront analysées mais ignorées.Avec GDAL 2.0 et plus récent , ISO WKT / WKB est pris en charge . Cela signifie que
CreateGeometryFromWkb
peut lire soit la saveur WKB (sans spécifier) etExportToIsoWkt()
affiche la sortie avec une syntaxe WKT moderne.De plus, GDAL 2.1 ou version ultérieure créera / exportera WKT / WKB avec
M
ouZM
coordonne comme prévu.la source
de Introduction à PostGIS
Avec le format WKB:
ogr reconnaît les géométries et n'est pas un résultat bytea (
ST_AsEWKB()
)Testez avec une de mes tables:
rien:
et une géométrie:
Essayons donc:
Pourquoi ?
Parce que le résultat de la requête est une chaîne:
et non un bytecode.
Vous devez décoder cette chaîne (regardez Créer une géométrie à partir de WKB dans le livre de recettes Python GDAL / OGR ).
C'est pourquoi il est beaucoup plus facile à utiliser:
1) autres formats de sortie (WKT, GeoJSON, ...)
2) directement osgeo.ogr ( Comment convertir une table PostGIS en Shapefile en Python?, Par exemple)
la source
Vous voudrez utiliser
ST_AsBinary(geom)
pour convertir votre géométrie du format interne PostGIS en WKB que vous pouvez lire avec ogr:En termes Postgres, votre résultat est a
bytea
. La bibliothèque psycpopg2 mappera ceci à unmemoryview
type Python:Il suffit de lancer votre
memoryview
pourbytes
lire le WKB avec ogr:Si vous vous souciez de la précision numérique, évitez absolument de l'utiliser
ST_AsText()
. Cette fonction convertit votre géométrie en WKT, tronquant vos coordonnées avec une précision qui dépend de votre version et plate-forme PostGIS.la source