Estoy tratando de extraer una LineString
geometría de PostGIS y analizarla con 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()
He intentado:
wkb = bin(int(row[0], 16))
y:
SELECT ST_AsEWKB(geom) FROM points LIMIT 1
OGR no quiere analizarlo. Sigue dando el siguiente error:
ERROR 3: OGR Error: Unsupported geometry type
geom = org.CreateGeometryFromWkb(wkb)
(debe serogr
noorg
).Respuestas:
Internamente, PostGIS almacena geometrías en una especificación binaria, pero se consulta y se ve afuera como una cadena codificada en hexadecimal. Hay dos variaciones populares de binarios conocidos (WKB) :
ST_AsEWKB
): una especificación WKB extendida diseñada por PostGIS .ST_AsBinary
): especificado por OGC e ISO. Durante un tiempo fue de sólo 2D, pero luego se extendió al apoyoZ
,M
yZM
geometrías.Las dos especificaciones son las mismas para geometrías 2D, pero son diferentes para geometrías de orden superior con
Z
,M
yZM
coordenadas.Las versiones anteriores de GDAL / OGR (1.x) solo entienden el EWKB para geometrías 3D, por lo que recomiendo usarlas
ST_AsEWKB
. (Pero si solo tiene geometrías 2D, cualquiera de los formatos está bien). Por ejemplo:Además, tenga en cuenta que las versiones anteriores de GDAL / OGR no admiten
M
coordenadas, y estas se analizarán pero se ignorarán.Con GDAL 2.0 y más reciente , se admite ISO WKT / WKB . Esto significa que
CreateGeometryFromWkb
puede leer cualquier sabor WKB (sin especificar) yExportToIsoWkt()
muestra la salida con una sintaxis WKT moderna.Además, GDAL 2.1 o posterior creará / exportará WKT / WKB con
M
oZM
coordina como se espera.fuente
de Introducción a PostGIS
Con el formato WKB:
ogr reconocer geometrías y no un resultado bytea (
ST_AsEWKB()
)Prueba con una de mis tablas:
nada:
y una geometría:
Entonces intentemos:
Por qué ?
Porque el resultado de la consulta es una cadena:
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, ...)
2) directamente osgeo.ogr ( ¿Cómo convertir la tabla PostGIS a Shapefile en Python , por ejemplo)
fuente
ST_AsBinary(geom)
Querrá usar para convertir su geometría del formato interno de PostGIS a WKB que puede leer con ogr:En términos de Postgres, su resultado es a
bytea
. La biblioteca psycpopg2 asignará esto a unmemoryview
tipo de Python:Solo envía tu
memoryview
abytes
para leer el WKB con ogr:Si le preocupa la precisión numérica, definitivamente evite usarla
ST_AsText()
. Esa función convierte su geometría a WKT, truncando sus coordenadas con una precisión que depende de su versión y plataforma de PostGIS.fuente