이것저것 기록

[python, GIS] 도로명주소 데이터 좌표계 확인 및 변환 본문

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

[python, GIS] 도로명주소 데이터 좌표계 확인 및 변환

anweh 2021. 2. 19. 23:44

건물 레이어, 배경도 레이어, 등등 여러 GIS 관련 오픈데이터를 제공하는 사이트는 많지만 안타깝게도(?) 데이터들 간 좌표계가 달라서 여러 데이터들을 종합적으로 융합하여 사용하기가 매우 어려운 실정이다.

나 같은 경우, 카카오 API를 통해 POI데이터를 WGS84 좌표계로 받았고, 도로명주소 건물 데이터를 ESPG:5181 좌표계로 받았는데, 두 데이터는 좌표계가 다르기 때문에 이 둘의 좌표계를 통합하는 과정이 필수적이었다.

QGIS를 통해 좌표계를 변환하는 방법들이나, 좌표계 변환 프로그램도 시중에 많은듯하나 파이썬 코드로 변환하는 방법도 존재하고 (나는) 개인적으로 이 방법이 더 용이하다고 느꼈다.  

그래서 오늘은 파이썬으로 좌표계 확인, 좌표계 확인 및 변환 방법에 대해 포스팅 해보려고 한다. 

 

 

사용된 데이터 및 코드는 깃헙 참조! 

github.com/henewsuh/crs_change

 

henewsuh/crs_change

파이썬으로 좌표계 확인 및 변환 . Contribute to henewsuh/crs_change development by creating an account on GitHub.

github.com

 


우선 도로명주소 건물 데이터를 받아오자. 

아 참!!!!!!!!!!!!!! 난 서울 건물 데이터를 받아왔다. 

data.nsdi.go.kr/dataset/14783

 

도로명주소 건물 - 오픈마켓

건축물의 사용승인 전 도로명주소 부여를 위해 생성되는 건물 정보

data.nsdi.go.kr

 

 

1. 데이터 로드 

import os 
import geopandas as gpd

root_path = os.getcwd()
data_path = os.path.join(root_path, 'data')
os.chdir(data_path)

bldg_gdf = gpd.read_file('Z_KAIS_TL_SPBD_BULD_11000.shp', encoding='cp949') #EPSG:5181

특정 폴더에 'data'라는 하위 폴더를 만들어서 그 곳에 도로명주소 건물 데이터를 넣어줬다. 

근데 도로명주소 건물 파일이 너무 커서, 깃헙의 data폴더에는 업로드 하지 못했다. (쨌든 도로명주소 건물 데이터를 data 폴더에 넣어줘야함)

자세한 경로는 깃헙을 참조... or 아래의 사진을 참고..!

경로 설정

 

 

 

2. 관심 지역의 데이터만 추출

sig_cd_ls = list(bldg_gdf['SIG_CD'].unique())
my_bldg_gdf = bldg_gdf.loc[bldg_gdf['SIG_CD']=='11620']

도로명주소 건물 데이터를 위의 코드대로 따라서 불러와보면 알 수 있겠지만, 데이터의 크기가 엄청 크다.

무려 62만개... 그야 당연한게 서울에 있는 모든 건물에 대한 shapefile이니까. 

나의 현재 거주지가 관악구이기도 하고, 해서 나는 관심 지역을 관악구로 좁혔다. (사실 컴퓨터가 힘들어해서임ㅎㅎ;;;)

11620는 관악구의 시군구코드인데, 본인이 원하는 시군구코드를 넣으면 얼마든지 관심지역 범위의 데이터만 다룰 수 있다. 

우선 sig_cd_ls에 'SIG_CD' 컬럼의 모든 시군구코드를 넣어주고, 내가 원하는 시군구코드를 찾았다. 

시군구코드는 KOSIS에서 제공하는 행정구역코드를 참고했는데, github의 data폴더에 함께 올려두었다. 

여담이지만 법정동코드, 행정동코드 등등 GIS 관련 코드가 너무 많아서 진짜 너무 헷갈릴 때가 있다 ㅠㅠ

sig_cd_ls 일부

 

 

 

 

3. 좌표계 확인 및 변환

print(my_bldg_gdf.crs) # none
my_bldg_gdf.set_crs(epsg=5181, inplace=True)
print(my_bldg_gdf.crs) # 5181
new_bldg_gdf = my_bldg_gdf.to_crs(epsg=4326)
print(new_bldg_gdf.crs) # 4326

자, 첫 번째 줄에서는 아무 가공도 하지 않은(?) 건물 데이터의 좌표계를 확인해본다. 

'none'이 뜰 것이다. 왜냐하면 도로명주소 건물 데이터엔 좌표계를 세팅해주는 파일인 .prj 파일이 함께 들어있지 않기 때문이다. 

하지만 걱정할 것 없다, 제공처에서 알려줬듯이 우리는 저 데이터의 좌표계가 EPSG:5181이라는 것을 안다. 

그래서 .set_crs를 통해서 좌표계를 5181이라고 알려주는 것이다.  (변환 전 필수!) 

그리고 .to_crs를 통해서 좌표계를 내가 원하는 좌표계로 변환하고, new_bldg_gdf에 새롭게 바뀐 좌표계의 데이터를 할당해주었다.  

짠~~ 좌표계 변환 완료!

 

자, 이렇게 간단한 파이썬으로 좌표계 확인 및 변환 과정이 끝났다. 

사용된 데이터와 코드는 깃헙에 올려놨으니 참고 바랍니다! 

 

 

 

 


(잡담) 

졸업이 다가오고 있다. 

아무래도 현재 시점으로는 '무사 졸업'이 나의 (단기) 최우선 목표가 되었기 때문에 한동안 블로그에 포스팅이 게을러졌다. 

그와중에 이틀에 한번 꼴로 블로그 점검(?)을 하긴 하는데, 가끔 질문을 남겨주시는 방문객들이 있어 왠지 뿌듯하다. 

이제껏 두 번 질문을 받았는데, 확실히 더욱 책임감을 느끼게 되었다.

내가 모르는 것은 다른 사람도 모를 수 있으니 웬만해서는 포스팅을 통해 공유하고 싶다는 마음도 들고... 사실 마음 같아선 매일 코딩하는 모든 것을 기록하고 싶지만 시간 관계상 ㅠㅠ

쨌든 GIS 관련 파이썬 코드를 짜면서 생각보다 GIS나 지도를 다루는 코드 공유(?)가 활발하지 않아서 애를 많이 먹는다... 

가장 기본적인 파이썬에서 좌표계 변환부터, 타원체 투영을 맞추거나, 여러 좌표계가 섞인 데이터들을 통합해서 시각화 하는 등등등.. 

내가 GIS 전문가는 아니지만, GIS 관련 연구를 하면서 개인적으로 상당히 애 먹었던 부분이나 '오 이거 좋은데?' 했던 내용들은 꾸준히 기록하도록 노력해야겠다.

Comments