Chuyển đổi shapefile từ tọa độ chiếu bằng Python


10

Newbie ở đây đang vật lộn với GIS. Tôi cố gắng để vạch ra phường cho thành phố Milwuakee sử dụng shapefile được tìm thấy trên trang web của họ county website quận . Tôi đang theo chủ đề ở đây với một số thành công. Mã của tôi là cho:

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)

với đầu ra,

-65.70220967836329 43.08590211722421

Vấn đề là điều này là sai. Lon / lat cho Milwaukee là -87,863984 và 42,920816.

Thứ hai, làm thế nào tôi có thể làm điều này theo chương trình cho toàn bộ shapefile. Tôi muốn vẽ sơ đồ này vào bản đồ nền. Khi tôi cố gắng theo chủ đề này, tôi nhận được một mã lỗi:

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)

lỗi:

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

Câu trả lời:


10

Ở câu hỏi đầu tiên, mã 'epsg: 32054' có đơn vị chân. Vì lý do này, cần phải sử dụng 'reserved_units = True' làm tham số trong inProj = Proj(init='epsg:32054')dòng. Bây giờ, mã tiếp theo hoạt động tốt:

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)

Ở câu hỏi thứ hai, Ward.shp là một shapefile đa giác; không phải là một shapefile điểm. Trong trường hợp này, bạn có thể sử dụng mô-đun geopandas để từ chối. Mã đề xuất của tôi là (với đường dẫn cụ thể của tôi):

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')

Trong hình ảnh tiếp theo, bạn có thể thấy shapefile bị từ chối (WardWGS84.shp) và điểm (-87.9028568836077, 43.09691266312185) trước khi xem xét tại Map Canvas của QGIS:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.