Lectura de geometría postgis con bien proporcionado

11

Estoy haciendo un flujo de trabajo a pequeña escala en el cuaderno de ipython con geopandas y bien proporcionado, obteniendo un montón de datos geoespaciales, a veces de archivos de forma, a veces de postgis (donde se realiza un procesamiento más costoso).

Ahora, luego tiro las tablas postgis a python usando sqlalchemy, transformando la geometría a WKT en el camino, obteniendo algo como:

sql = """
SELECT ST_AsText(ST_Transform(the_geom,4326)) as newgeom,* 
  FROM public.parcels2010_small limit 5;
 """
parcels = pd.read_sql(sql, engine)
parcels

+----+---------------------------------------------------+---------------------------------------------------+-----------+-------------+
| id | newgeom                                           | the_geom                                          | parcel_id | osm_node_id |
+----+---------------------------------------------------+---------------------------------------------------+-----------+-------------+
| 0  | MULTIPOLYGON(((-122.991093691444 38.4878691106... | 01060000209C0E00000100000001030000000100000097... | 1805792   | 66237       |
+----+---------------------------------------------------+---------------------------------------------------+-----------+-------------+
| 1  | MULTIPOLYGON(((-122.444576448624 37.7346386006... | 01060000209C0E0000010000000103000000010000008A... | 10435     | 123826      |
+----+---------------------------------------------------+---------------------------------------------------+-----------+-------------+
| 2  | MULTIPOLYGON(((-122.796785208193 38.5427593334... | 01060000209C0E0000010000000103000000010000007D... | 1817842   | 313047      |
+----+---------------------------------------------------+---------------------------------------------------+-----------+-------------+
| 3  | MULTIPOLYGON(((-122.695538506163 38.3618570798... | 01060000209C0E0000010000000103000000010000009B... | 1934612   | 63776       |
+----+---------------------------------------------------+---------------------------------------------------+-----------+-------------+
| 4  | MULTIPOLYGON(((-122.223424422869 37.8416019090... | 01060000209C0E00000100000001030000000100000072... | 861785    | 26369       |
+----+---------------------------------------------------+---------------------------------------------------+-----------+-------------+

Esto se parece mucho a la geometría cuando se carga desde un archivo de forma, pero no se proyecta como una geometría bien formada. No pude encontrar la forma canónica de hacerlo, ya sea usando bien solo o tal vez con Descartes.

ako
fuente

Respuestas:

8

GeoAlchemy entiende SQLAlchemy PostGIS y Shapely .

from geoalchemy2.shape import to_shape

for parcel in parcels:
    parcel_shape = to_shape(parcel.the_geom)
Alex Kerney
fuente
16

El formato predeterminado para la geometría PostGIS es WKB codificado en hexadecimal (binario conocido). Shapely tiene la capacidad de convertir este formato en shapelyobjeto de geometría con su wkbmódulo:

from shapely import wkb

# ....

sql = """SELECT * FROM public.parcels2010_small LIMIT 5;"""
parcels = pd.read_sql(sql, engine)

for parcel in parcels:
    parcel.the_geom = wkb.loads(parcel.the_geom, hex=True)

si tuviera que imprimir la geometría, debería verse así:

print parcels[0].the_geom

<shapely.geometry.multipolygon.MultiPolygon object at ...>

Ver documentos en el módulo shapely.wkb aquí .

Grant Humphries
fuente