แปลง shapefile จากพิกัดที่ฉายโดยใช้ Python


10

มือใหม่ที่นี่ต้องดิ้นรนกับ GIS ฉันพยายามที่จะแผนที่ออกวอร์ดสำหรับเมือง Milwuakee โดยใช้ shapefiles พบได้บนเว็บไซต์ของพวกเขาเขตเว็บไซต์เขต ฉันติดตามกระทู้ที่นี่ด้วยความสำเร็จ รหัสของฉันให้:

from pyproj import Proj, transform
# wisconsing EPSG:32054
# epsg:4326 is for the entire world, wgs 84...not obvious
inProj = Proj(init='epsg:32054')
outProj = Proj(init='epsg:4326')
x1,y1 = 2560131.496875003, 406816.434375003
x2,y2 = transform(inProj,outProj,x1,y1)
print(x2,y2)

กับเอาท์พุท

-65.70220967836329 43.08590211722421

ปัญหานี้เป็นสิ่งที่ผิด The lon / lat สำหรับมิลวอกีคือ -87.863984 และ 42.920816

ประการที่สองฉันจะทำสิ่งนี้โดยทางโปรแกรมสำหรับ shapefile ทั้งหมดได้อย่างไร ฉันต้องการพล็อตเรื่องนี้ลงในแผนที่ฐาน เมื่อฉันพยายามติดตามกระทู้นี้ฉันได้รับรหัสข้อผิดพลาด:

with fiona.open("ward2012/ward.shp") as shp:
    ori = Proj(init='epsg:32054' ),
    dest= Proj(init='EPSG:4326',preserve_units=True)
    with fiona.open('ward2012/MKE_wards_lat_lon.shp', 'w', 'ESRI Shapefile', shp.schema.copy(), crs=from_epsg(4326))as output:
        for point in shp:
            x,y =  point['geometry']['coordinates']
            point['geometry']['coordinates'] = transform(ori, dest,x,y)
            output.write(point)

ข้อผิดพลาด:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-139-a5079ab39f99> in <module>()
      4     with fiona.open('ward2012/MKE_wards_lat_lon.shp', 'w', 'ESRI Shapefile', shp.schema.copy(), crs=from_epsg(4326))as output:
      5         for point in shp:
----> 6             x,y =  point['geometry']['coordinates']
      7             point['geometry']['coordinates'] = transform(ori, dest,x,y)
      8             output.write(point)

ValueError: not enough values to unpack (expected 2, got 1)

คำตอบ:


10

ในคำถามแรกรหัส 'epsg: 32054' มีหน่วยฟุต ด้วยเหตุผลนี้จึงจำเป็นต้องใช้ 'อนุรักษ์ _units = True' เป็นพารามิเตอร์ในinProj = Proj(init='epsg:32054')บรรทัด ตอนนี้โค้ดถัดไปทำงานได้ดี:

from pyproj import Proj, transform
# wisconsing EPSG:32054
# epsg:4326 is for the entire world, wgs 84...not obvious
inProj = Proj(init='epsg:32054', preserve_units=True)
outProj = Proj(init='epsg:4326')
x1,y1 = 2560131.496875003, 406816.434375003
x2,y2 = transform(inProj,outProj,x1,y1)
print (x2,y2)
(-87.9028568836077, 43.09691266312185)

ที่คำถามที่สองWard.shpเป็นรูปหลายเหลี่ยมรูปร่าง ไม่ใช่ Shapefile จุด ในกรณีนี้คุณสามารถใช้โมดูล geopandas เพื่อคัดลอกได้ รหัสที่เสนอของฉันคือ (พร้อมเส้นทางเฉพาะของฉัน):

import geopandas as gpd

tmp = gpd.GeoDataFrame.from_file('/home/zeito/pyqgis_data/ward2012/ward.shp')

tmpWGS84 = tmp.to_crs({'proj':'longlat', 'ellps':'WGS84', 'datum':'WGS84'})

tmpWGS84.to_file('/home/zeito/pyqgis_data/ward2012/wardWGS84.shp')

ในภาพถัดไปคุณสามารถดูรูปร่างไฟล์ที่ถูกปฏิเสธ (wardWGS84.shp) และจุด (-87.9028568836077, 43.09691266312185) ก่อนที่จะพิจารณาที่ Map Canvas ของ QGIS:

ป้อนคำอธิบายรูปภาพที่นี่

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