Lecture de la géométrie postgis avec galbe

11

Je fais un workflow à petite échelle dans un cahier ipython avec des géopandas et bien fait, en tirant un tas de données géospatiales, parfois à partir de fichiers de formes, parfois à partir de postgis (où un traitement plus coûteux est effectué).

Maintenant, je tire ensuite les tables postgis en python en utilisant sqlalchemy, transformant la géométrie en WKT en cours de route, obtenant quelque chose comme:

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

Cela ressemble beaucoup à la géométrie lorsqu'elle est chargée à partir d'un fichier de formes, mais elle n'est pas convertie en une géométrie galbée. Je ne pouvais pas trouver la manière canonique de le faire, soit en utilisant galbée seule, soit peut-être avec Descartes.

ako
la source

Réponses:

16

Le format par défaut de la géométrie PostGIS est WKB (Well-Known Binary) codé en hexadécimal. Shapely a la capacité de convertir ce format en shapelyobjet géométrique avec son wkbmodule:

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 vous deviez ensuite imprimer la géométrie, elle devrait ressembler à ceci:

print parcels[0].the_geom

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

Voir les documents sur le module shapely.wkb ici .

Grant Humphries
la source