Dentro do banco de dados, as geometrias são armazenadas no disco em um formato usado apenas pelo programa PostGIS. Para que programas externos insiram e recuperem geometrias úteis, eles precisam ser convertidos em um formato que outros aplicativos possam entender. Felizmente, o PostGIS suporta a emissão e o consumo de geometrias em um grande número de formatos:
da Introdução ao PostGIS
Com o formato WKB:
Binário conhecido (WKB):
ST_GeomFromWKB (bytea) retorna geometria
ST_AsBinary (geometry) retorna bytea
ST_AsEWKB (geometria) retorna bytea
ogr reconhece geometrias e não um 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;"
Teste com uma das minhas tabelas:
nada:
query = """SELECT ST_AsText(ST_AsEWKB(geom)) from mytable;"""
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()
print row[0]
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
e uma geometria:
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)',)
Então vamos tentar:
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ê ?
Como o resultado da consulta é uma sequência:
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
e não um bytecode.
Você precisa decodificar essa sequência (consulte Criar geometria a partir do WKB no livro de receitas Python GDAL / OGR ).
É por isso que é muito mais fácil usar:
1) outros formatos de saída (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) diretamente osgeo.ogr ( como converter a tabela PostGIS para Shapefile em Python?, Por exemplo)
geom = org.CreateGeometryFromWkb(wkb)
(ogr
não deve estarorg
).