대한민국 시군구 행정구역 TopoJSON 지도(2016년2월)
Republic of Korea (South Korea) TopoJSON map (Feb. 2016)
April 29, 2017
작업하는 자료를 d3.js로 대한민국 시군구 단위로 시각화하려는데 최신 TopoJSON 지도 파일을 찾기 힘들었습니다. 찾을 수 있는 파일에서는 세종시가 없거나, 세종시가 있더라도 청주 청원구와 서원구2014년 7월 1일 청원군과 통합하면서 청원구와 서원구가 새로 설치되었습니다.가 없었습니다. 그래서 대한민국 시군구 TopoJSON 지도를 직접 만들었습니다. 이 글에서는 만든 과정과 결과 파일을 소개하겠습니다.
1. 데이터
이곳에서 2016년 2월 대한민국 시군구 행정구역 SHP 파일을 내려받습니다. 압축을 풀고 TL_SCCO_SIG.shp
파일을 사용합니다.
2. SHP → GeoJSON
내려받은 SHP 파일은 EPSG:5178 좌표계를 사용합니다. 다음과 같이 crs:84 좌표계를 사용하는 GeoJSON 으로 바꿉니다. CP949 인코딩으로 기록된 행정구역명 인코딩을 좌표계와 형식을 바꿀 때 보존합니다. 출처: 여기의 33번째 슬라이드
ogr2ogr -s_srs EPSG:5178 -t_srs crs:84 -f GeoJSON -skipfailures --config SHAPE_ENCODING "CP949" TL_SCCO_SIG_crs84.geojson TL_SCCO_SIG.shp
위의 작업은 Ubuntu 14.04 에서 하였습니다.
3. 지도 매끄럽게 하기
2번 과정에서 얻은 GeoJSON 파일에는 행정구역 구분선, 해안선, 섬 등이 자세하게 나와있어서 용량이 큽니다. QGIS 최신 버전으로 지도를 매끄럽게 하여 용량을 줄입니다.
multiparts → single part
QGIS로 파일을 열면 다음과 같이 화면에 지도가 나옵니다.
Ctrl + a
로 모든 구역을 선택하면 색이 바뀝니다.
위와 같이 Run 버튼을 클릭하면 아래와 같이 한 행정구역이지만 붙어있지 않은 섬 같은 부분을 분리합니다.
Select by $area
Single part로 분리하면 이제 닫힌 shape의 면적을 기준으로 너무 작은 섬들을 골라낼 수 있습니다. 다음과 같이 "계산식으로 선택..." 메뉴를 열어봅시다.
아래와 같이 면적 0.01로 입력하니 너무 작아서 선택이 안 되는 곳도 있습니다. 개인적으로는 선택 버튼을 눌러도 해당 창이 닫히지 않으니 값을 바꾸면서 확인하고 선택할 수 있는 부분이 마음에 듭니다.
더 줄였더니 독도의 서도만 선택이 됩니다.
아래와 같이 살짝 더 줄이니 동도와 서도 모두 선택이 됩니다. 그리고 주변의 작은 섬은 선택이 되지 않습니다. 저는 대한민국의 영토인 독도의 동도와 서도가 모두 선택되는 이 값을 기준으로 너무 작은 섬들을 걸러냈습니다.
이제 걸러낸 결과를 GeoJSON 형태로 저장합니다. 저는 TL_SCCO_SIG_crs84-m2s.geojson
라고 저장하였습니다.
4. GeoJSON → TopoJSON
아래와 같이 TopoJSON CLI (Command Line Interface)을 설치합니다. 설치하려면 node.js package manager (npm)을 먼저 설치하시길 바랍니다.
npm install -g topojson
Windows에서는 topojson 패키지가 잘 작동하지 않아서 아래 작업은 Ubuntu 14.04 에서 하였습니다.
geo2topo TL_SCCO_SIG_crs84-m2s.geojson > TL_SCCO_SIG_crs84-m2s-topo.json
이제 TopoJSON 파일을 얻었습니다. 하지만 아직도 10MB 가량으로 웹에서 사용하기에는 용량이 큽니다. 그래서 다음과 같이 압축합니다.이 내용은 d3.js를 만든 Mike Bostock 님의 글을 참조하였습니다.
topoquantize 1e4 < TL_SCCO_SIG_crs84-m2s-topo.json > TL_SCCO_SIG_crs84-m2s-quantized1e4-topo.json
이제 2MB 미만이 되었습니다! 위의 명령어는 topojson 패키지를 설치하면 사용할 수 있습니다. 2016년 2월 SHP 파일을 가지고 만든 시군구 TopoJSON 지도를 여기에 올려두었고 자유롭게 내려받아 사용하시길 바랍니다.
이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
5. 예제: 대한민국 인구밀도
국가통계포털에서 행정구역별 인구는 2015 인구주택총조사 자료를, 면적은 2017년 자료를 내려받아 사용하였습니다. d3.js v4를 이용하여 인구밀도를 검은 배경과 흰 배경 두 가지로 나타냈습니다. 특별히 검은 배경에서는 fire 색상 팔레트를 사용하였습니다.