호기심 많은 분석가

[Python] 전국 행정구역별 지도 시각화 (Folium, 일부-경기도/인천) 본문

Coding/시각화

[Python] 전국 행정구역별 지도 시각화 (Folium, 일부-경기도/인천)

DA Hun 2022. 3. 30. 20:52

목차

     

    전국 행정구역별 지도 시각화 - 법정동코드 체계의 이해

     저는 법정동을 기준으로 지도 시각화를 진행할 것인데요, 그에 앞서 법정동코드 체계에 대한 이해가 바탕이 되어야 추후의 작업에도 도움이 되기에 이번 포스팅에서는 법정동코드의 체계에

    herjh0405.tistory.com

     지난번 포스팅의 법정동 코드 체계 이해에 이어 그 기준을 바탕으로 지도 시각화를 진행해보겠습니다.

    • Python 지도 시각화 Library folium을 사용해 행정구역별 시각화를 진행해보겠습니다.
    • 필요 Site : SGIS(통계지리정보서비스), QGIS, 지도 셰이퍼

     기존의 folium을 이용한 행정구역별 시각화 자료는 굉장히 많지만 다들 전국 단위이거나 서울특별시만을 기준으로 하고 있어 일부 지역만 표시하고 싶은 니즈를 충족시키기 위해 작성하게 되었습니다. 꽤나 번거롭고 여러 가지 절차를 거쳐야 하지만 한 번 방법을 익혀둔다면 두고두고 도움되실 거라 믿어 의심치 않습니다 👊


    folium 설치

     우선 간단하게 pip install을 이용하여 folium을 설치해줍니다.

    !pip install folium

    Data 획득

    경기도, 인천의 행정구역별(이번에는 읍면동을 기준) 시각화를 진행할 예정이니, 행정구역별 경계 위경도가 필요합니다.

    정말 감사하게도 South Korea Github 링크에서 서울특별시와 전국에 대한 행정구역별 경계 좌표를 구할 수 있으나 가장 최신 자료가 2018년이고 일부 자료는 따로 추출하기 어렵다는 아쉬움이 남습니다. 😿

    우리는 직접 데이터를 요청해볼 것입니다. SGIS(통계지리정보서비스) 사이트에 접속해 자료제공 > 자료 신청 탭에서 원하는 자료를 신청합니다.

    1. 그중 우리는 센서스용 행정구역경계(읍면동) 데이터를 신청할 것입니다. (당일 처리)
    2. 신청자료 다운로드 탭을 들어가 다운로드를 진행하면 dbf, prj, shp, shx 총 4개의 파일이 다운로드됩니다.

    SGIS(통계지리정보서비스) 사이트에서 자료 신청 방법

    우리는 그중 shp 파일을 사용할 것인데, 그것을 위해 QGIS라는 프로그램이 필요합니다.

    1. 자유 오픈 소스 지리정보 시스템으로 지리 데이터를 다루면 꼭 만나게 되는 프로그램이니 친해져 봅시다. 🐳
    2. 왜 이번 작업에서 우리는 QGIS를 다뤄야 할까요? SGIS에서 제공해주는 데이터는 좌표계(CRS)는 EPSG:5179 - Korea 2000 기준인데, folium은 기본 좌표계인 EPSG:4326에 맞춰서 제공하기 때문입니다.
    3. 다운이 모두 완료되면, 레이어 > 레이어 추가 > 벡터 레이어 추가에서 shp 파일 경로를 입력 후 인코딩으로는 EUC-KR을 선택해 추가해줍니다.
      QGIS에서 레이어 추가 방법
    4. 이제 우리가 생각하는 지도의 형상을 띄고 있습니다. 레이어를 선택 후 Export > 객체를 다른 이름으로 저장을 선택해줍니다.
      QGIS에서 레이어 Export
    5. 마지막으로 위에서 언급했듯이 좌표계를 기본 좌표계: EPSG:4326 - WGS 84로 변경하여 저장해줍니다. 거의 다 됐어요!

    QGIS에서 좌표계 변환 방법

    이제 EPSG:4326 좌표계를 가진 shp 파일을 python에서 사용하기 위해 json형식으로 변경해줍니다.

    1. 이 과정에서 지도 셰이퍼라는 사이트를 이용해줍니다. shp 파일을 업로드해준 뒤 Export > GeoJSON > Export를 하면 이제 데이터는 준비가 완료되었습니다.

    shp파일 json형식으로 변경


    Code 실행 후 결과 도출

    1. Folium 외에도 Github에 올라가 있는 데이터를 추출한 뒤 json 파일을 다루기 위해 requests와 json을 import 해줍니다.
      import folium
      import requests
      import json
    2. 각각의 위경도 데이터를 추출해줍니다.
      kkd_content = requests.get('https://raw.githubusercontent.com/herjh0405/map_data/main/kkd_geo.json').content
      kkd_geo = json.loads(kkd_content)
      ​
      ic_content = requests.get('https://raw.githubusercontent.com/herjh0405/map_data/main/ic_geo.json').content
      ic_geo = json.loads(ic_content)
    3. 마지막으로 folium을 호출한 뒤 GeoJson을 사용하여 맵에 정보를 추가해주면 저희가 원하는 결과가 도출되는 것을 확인할 수 있습니다.!! 🌟🌟🌟
      m = folium.Map(
          location=[37.559819, 126.963895],
          zoom_start=11, 
      )
      ​
      folium.GeoJson(
          kkd_geo,
          name='경기도 읍면동'
      ).add_to(m)
      ​
      folium.GeoJson(
          ic_geo,
          name='인천광역시 읍면동'
      ).add_to(m)
      ​
      m

    folium의 GeoJson을 사용한 경기도 및 인천광역시 지도시각화

    이제 지도 시각화를 진행했으니 Marker와 Tooltip을 이용해 더 많은 정보를 기록하며 잘 활용하시길 바라겠습니다. 감사합니다 :)