Postgis-Geometrie mit formschön lesen

11

Ich mache einen kleinen Workflow in ipython notebook mit Geopandas und Shapely und ziehe eine Reihe von Geodaten, manchmal aus Shapefiles, manchmal aus Postgis (wo teurere Verarbeitung durchgeführt wird).

Jetzt ziehe ich dann die Postgis-Tabellen in Python mit sqlalchemy, transformiere die Geometrie auf dem Weg in WKT und erhalte so etwas wie:

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

Dies sieht der Geometrie beim Laden aus einem Shapefile sehr ähnlich, wird jedoch nicht als formschöne Geometrie gegossen. Ich konnte den kanonischen Weg nicht finden, entweder formschön allein oder vielleicht mit Descartes.

ako
quelle

Antworten:

16

Das Standardformat für die PostGIS-Geometrie ist hexadezimal codiertes WKB (Well-Known Binary). Shapely hat die Möglichkeit, dieses Format shapelymit seinem wkbModul in ein Geometrieobjekt zu konvertieren :

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)

Wenn Sie dann die Geometrie drucken, sollte sie ungefähr so ​​aussehen:

print parcels[0].the_geom

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

Weitere Informationen finden Sie hier in den Dokumenten zum Shapely.wkb-Modul .

Grant Humphries
quelle