Lettura della geometria postgis con ben fatto


11

Sto facendo un flusso di lavoro su piccola scala nel notebook ipython con geopandas e ben fatto, estraendo un mucchio di dati geospaziali, a volte da file di forma, a volte da postgis (dove viene eseguita un'elaborazione più costosa).

Ora, trascino le tabelle Postgis in Python usando sqlalchemy, trasformando la geometria in WKT lungo la strada, ottenendo qualcosa di simile:

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       |
+----+---------------------------------------------------+---------------------------------------------------+-----------+-------------+

Assomiglia molto alla geometria quando viene caricata da un file di forma, ma non viene lanciata come una geometria formosa. Non riuscivo a trovare il modo canonico per farlo, usando solo ben fatto, o forse con Descartes.

Risposte:



16

Il formato predefinito per la geometria PostGIS è WKB (Well-Known Binary) con codifica esadecimale. Shapely ha la capacità di convertire questo formato in shapelyoggetto geometria con il suo wkbmodulo:

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)

se dovessi quindi stampare la geometria dovrebbe essere simile a questa:

print parcels[0].the_geom

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

Consulta i documenti sul modulo shapely.wkb qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.