이것저것 기록

[python] 파이썬에서 shape파일을 불러오는 여러 방법들 및 활용 본문

코린이/실무를 위한 코딩 기록

[python] 파이썬에서 shape파일을 불러오는 여러 방법들 및 활용

anweh 2020. 9. 24. 19:55

파이썬에서 shape파일을 불러오는 방법은 진짜 다양하다. 

어떤 라이브러리(모듈)을 사용하느냐가 관건(?)인데, 이건 뭐... 각자 편한 라이브러리를 쓰면 된다. 

 

 

1. Fiona

이름이 참 이쁜 라이브러리다. 그러나 메뉴얼은 절대 이쁘지 않다. 

쨌든, Fiona로 shape파일을 열어보자. 

import fiona #라이브러리 가져오기
file = fiona.open("shape 파일명.shp")

파일을 불러왔으니 이 파일을 가지고 활용할 수 있는 방법을 몇 개 소개해볼 것이다. 

우선 이제 이 파일에 몇 개의 객체가 들어있고, 이 객체들의 structure는 어떻게 되는지 알아보자. 

file 안에 뭐가 들었는지 확인

file에는 총 773개의 무언가가 들어있고, 랜덤한 인덱스를 넣어보면 file[1]이라는 객체는 'type', 'id', 'properties', 'geometry' 라는 key값을 갖는 dict인 것을 알 수 있다. 

이 dict에서 내가 필요한 key만 불러오고 싶다고 하자. 나는 'geometry'라는 key 값만 불러올 것이다. 

'geometry'

'geometry'라는 key는 또, 'type', 'coordinates'를 key 값으로 가지는 dict이다. 

재밌다. dict 안의 dict!! (나는 이런 걸 인셉션 dict라고 부른다.) 

여기서 또 한 번 'coordinates'라는 key 값만 갖고 오고 싶다면? 

'coordinates'

짠! 보다시피 [(x1, y1), (x2, y2)]라는 두 개의 점으로 이루어진 선분임을 알 수 있다. 

좌표 분리

위와 같이 인덱스를 주어 각각 다른 변수에 할당해주면 좌표를 분리할 수도 있다. 

이외에도 Fiona 라이브러리를 통해서 불러온 shape파일을 사용해서 어떤 처리를 할 수 있는지 알아보는 좋은 방법이 있다. 

dir(file)

dir(file (shape파일을 불러온 객체))을 하면 file에 쓸 수 있는 함수, 혹은 받을 수 있는 속성값에 무엇이 있는 지 알려준다. 총 74개가 있다고 한다. 

다만 주의할 점은 저기 나온 게 함수인지, 속성값인지까지는 알려주지 않기 때문에 잘 확인해봐야 한다.

write이라는 속성값인 줄 알았는데 함수면, 위처럼 친절하게 알려준다. (bound method Collection.writie. 어쩌구) 

이건 '함수인데 속성처럼 잘못 사용하였으니 뒤에 ()를 붙여'라는 뜻이다. 

 

 

 

2. GeoPandas

import geopandas as gpd
file = gpd.read_file('shape 파일명.shp')

geopandas라는 라이브러리가 (개인적으로) fiona보다 나은 것 같다. 

왜냐하면 시각화가 정말 편하게 되어 있기 때문이다. 

spyder의 Variable explorer에서 file 객체를 열어본 모습

fiona처럼 굳이 귀찮은 작업을 거치지 않더라도 이렇게 어떤 컬럼이 있고, 각 컬럼별 내용이 뭔지 확인할 수 있어서 배우 편하다. 

이번에도 'geometry' key 값에서 각각의 좌표를 분리해보려고 한다. 

실행 코드 only
실행 코드 w/ 중간결과

 

3. PyShp

import os
import shapefile 

file = shapefile.Reader('shape 파일명.shp')
first = file.shapeRecords()[1] #첫번째 객체 불러오기
element = first.shape.__geo_interface__ #객체를 dict 타입으로 불러오기

element 라는 dict

 

 

 


 

shape 파일을 불러와서, 안의 내용물까지 확인하고, 필요한 정보를 뽑아내는 것까지 알아봤다! 

속의 속의 속의 속까지 들어가서 필요한 정보만 뽑아와서 쓰는 것이 처음에는 엄청 골치아프다.

왜냐하면 불러온 shape 파일의 구조(?)를 모르니까! 

근데 일단 불러온 shape 파일의 컬럼 갯수, 컬럼명 등 정보를 알고 나면 뽑아쓰는 건 매우 쉽다. 

끝! 

 

 

 

 

Comments