Dentro de la base de datos, las geometrías se almacenan en el disco en un formato que solo usa el programa PostGIS. Para que los programas externos puedan insertar y recuperar geometrías útiles, deben convertirse a un formato que otras aplicaciones puedan entender. Afortunadamente, PostGIS admite la emisión y el consumo de geometrías en una gran cantidad de formatos:
de Introducción a PostGIS
Con el formato WKB:
Binario conocido (WKB): ST_GeomFromWKB (bytea) devuelve geometría
ST_AsBinary (geometry) devuelve bytea
ST_AsEWKB (geometry) devuelve bytea
ogr reconocer geometrías y no un resultado 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;"
Prueba con una de mis tablas:
nada:
query = """SELECT ST_AsText(ST_AsEWKB(geom)) from mytable;"""
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()
print row[0]
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
y una geometría:
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)',)
Entonces intentemos:
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
Por qué ?
Porque el resultado de la consulta es una cadena:
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
y no un bytecode.
Debe decodificar esta cadena (consulte Crear geometría a partir de WKB en el libro de cocina Python GDAL / OGR ).
Por eso es mucho más fácil de usar:
1) otros formatos de salida (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) directamente osgeo.ogr ( ¿Cómo convertir la tabla PostGIS a Shapefile en Python , por ejemplo)
geom = org.CreateGeometryFromWkb(wkb)
(debe serogr
noorg
).