Estou tentando extrair uma LineString
geometria do PostGIS e analisá-la com OGR (python bindinds).
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()
Eu tentei:
wkb = bin(int(row[0], 16))
e:
SELECT ST_AsEWKB(geom) FROM points LIMIT 1
OGR não deseja analisá-lo. Continua dando o seguinte erro:
ERROR 3: OGR Error: Unsupported geometry type
geom = org.CreateGeometryFromWkb(wkb)
(ogr
não deve estarorg
).Respostas:
Internamente, o PostGIS armazena geometrias em uma especificação binária, mas é consultado e visto do lado de fora como uma string codificada em hexadecimal. Existem duas variações populares do binário conhecido (WKB) :
ST_AsEWKB
) - uma especificação WKB estendida projetada pelo PostGIS .ST_AsBinary
) - especificado pelo OGC e ISO. Por um tempo que era 2D-only, mas mais tarde estendido para suporteZ
,M
eZM
geometrias.As duas características são idênticas para geometrias 2D, mas são diferentes para geometrias de ordem superior com
Z
,M
eZM
coordenadas.As versões mais antigas do GDAL / OGR (1.x) compreendem apenas o EWKB para geometrias 3D, portanto, para esses eu recomendo o uso
ST_AsEWKB
. (Mas se você tiver apenas geometrias 2D, qualquer um dos formatos estará correto). Por exemplo:Além disso, observe que as versões mais antigas do GDAL / OGR não oferecem suporte a
M
coordenadas e elas serão analisadas, mas ignoradas.Com o GDAL 2.0 e mais recente , o ISO WKT / WKB é suportado . Isso significa que
CreateGeometryFromWkb
pode ler o sabor WKB (sem especificar) eExportToIsoWkt()
mostra a saída com uma sintaxe WKT moderna.Além disso, o GDAL 2.1 ou posterior criará / exportará WKT / WKB com
M
ouZM
coordenadas conforme o esperado.fonte
da Introdução ao PostGIS
Com o formato WKB:
ogr reconhece geometrias e não um resultado bytea (
ST_AsEWKB()
)Teste com uma das minhas tabelas:
nada:
e uma geometria:
Então vamos tentar:
Por quê ?
Como o resultado da consulta é uma sequência:
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, ...)
2) diretamente osgeo.ogr ( como converter a tabela PostGIS para Shapefile em Python?, Por exemplo)
fonte
Você desejará usar
ST_AsBinary(geom)
para converter sua geometria do formato interno PostGIS para WKB que você pode ler com ogr:Nos termos do Postgres, seu resultado é a
bytea
. A biblioteca psycpopg2 mapeará isso para ummemoryview
tipo Python:Basta lançar seu
memoryview
parabytes
ler o WKB com ogr:Se você está preocupado com a precisão numérica, evite definitivamente usá-lo
ST_AsText()
. Essa função converte sua geometria em WKT, truncando suas coordenadas com uma precisão que depende da sua versão e plataforma do PostGIS.fonte