Python을 사용하여 투영 좌표에서 shapefile 변환


10

GIS와 싸우고있는 초보자. 카운티 웹 사이트 카운티 웹 사이트에있는 shapefile을 사용하여 Milwuakee시의 와드를 매핑하려고합니다 . 나는 여기 에 실 을 따라 약간의 성공을 거두고 있습니다. 내 코드는 다음과 같습니다.

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

문제는 이것이 잘못되었다는 것입니다. 밀워키의 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'코드에는 피트 단위가 있습니다. 따라서 'preserve_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')

다음 이미지에서 QGIS의 맵 캔버스에서 고려되기 전에 재 투영 된 쉐이프 파일 (wardWGS84.shp)과 포인트 (-87.9028568836077, 43.09691266312185)를 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.