Dans la base de données, les géométries sont stockées sur disque dans un format uniquement utilisé par le programme PostGIS. Pour que les programmes externes puissent insérer et récupérer des géométries utiles, ils doivent être convertis dans un format que d'autres applications peuvent comprendre. Heureusement, PostGIS prend en charge l'émission et la consommation de géométries dans un grand nombre de formats:
de Introduction à PostGIS
Avec le format WKB:
Binaire bien connu (WKB): ST_GeomFromWKB (bytea) renvoie une géométrie
ST_AsBinary (géométrie) renvoie bytea
ST_AsEWKB (géométrie) renvoie bytea
ogr reconnaît les géométries et n'est pas un résultat 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;"
Testez avec une de mes tables:
rien:
query = """SELECT ST_AsText(ST_AsEWKB(geom)) from mytable;"""
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()
print row[0]
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
et une géométrie:
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)',)
Essayons donc:
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
Pourquoi ?
Parce que le résultat de la requête est une chaîne:
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
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, ...)
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) directement osgeo.ogr ( Comment convertir une table PostGIS en Shapefile en Python?, Par exemple)
geom = org.CreateGeometryFromWkb(wkb)
(ne devraitogr
pas l' êtreorg
).