Membaca geometri postgis dengan rupawan


11

Saya sedang melakukan alur kerja skala kecil di notebook ipython dengan geopanda dan rupanya, menarik banyak data geospasial, kadang-kadang dari shapefile, kadang-kadang dari postgis (di mana proses yang lebih mahal dilakukan).

Sekarang, saya kemudian menarik tabel postgis ke dalam python menggunakan sqlalchemy, mengubah geometri menjadi WKT di sepanjang jalan, mendapatkan sesuatu seperti:

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

Ini sangat mirip dengan geometri ketika dimuat dari suatu shapefile, tetapi tidak dilemparkan sebagai geometri yang indah. Saya tidak dapat menemukan cara kanonik untuk melakukannya, baik dengan menggunakan bentuk saja, atau mungkin dengan Descartes.

Jawaban:



16

Format default untuk geometri PostGIS adalah hex-encoded WKB (Well-Dikenal Binary). Shapely memiliki kemampuan untuk mengubah format ini menjadi shapelyobjek geometri dengan wkbmodulnya:

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)

jika Anda kemudian mencetak geometri itu akan terlihat seperti ini:

print parcels[0].the_geom

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

Lihat dokumen pada modul shapely.wkb di sini .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.