การอ่านรูปทรงเรขาคณิตของ postgis ด้วยหุ่นดี


11

ฉันกำลังทำเวิร์กโฟลว์ขนาดเล็กในโน้ตบุ๊ก ipython ที่มี geopandas และ shapely ดึงข้อมูล geospatial จำนวนมากบางครั้งมาจาก shapefiles บางครั้งมาจาก postgis (ซึ่งมีการประมวลผลที่แพงกว่า)

ตอนนี้ฉันก็ดึงตาราง postgis ไปเป็น python โดยใช้การsqlalchemyแปลงเรขาคณิตเป็น WKT ไปพร้อมกัน

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

นี่ดูเหมือนเรขาคณิตมากเมื่อโหลดจาก shapefile แต่มันไม่ได้ถูกโยนเป็นเรขาคณิตที่หุ่นดี Descartesฉันไม่สามารถหาวิธีที่ยอมรับที่จะทำมันทั้งการใช้หุ่นดีคนเดียวหรืออาจจะมี

คำตอบ:



16

รูปแบบเริ่มต้นสำหรับรูปทรงเรขาคณิตของ PostGIS คือ WKB ที่เข้ารหัสด้วยเลขฐานสิบหก (ไบนารีที่รู้จักกันดี) Shapely มีความสามารถในการแปลงรูปแบบนี้เป็นshapelyวัตถุเรขาคณิตด้วยwkbโมดูล:

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)

ถ้าคุณจะพิมพ์รูปทรงเรขาคณิตก็ควรมีลักษณะเช่นนี้:

print parcels[0].the_geom

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

ดูเอกสารโมดูล shapely.wkb ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.