오늘은 IDL에서 지도를 표출할 때 대한민국의 행정구역 경계선을 표시하는 방법을 소개해보고자 합니다. 사실 IDL의 지도 표출 기능에서는 기본적으로 해안선(내륙경계선) 및 국가 경계선 정도까지는 표출이 가능합니다. 하지만 국내 유저들의 입장에서는 대한민국의 행정구역 경계선도 표시가 되면 더 좋을텐데, 그러한 기능을 기본적으로는 지원하지 않습니다. 미국의 경우는 주 경계선까지는 지원이 됩니다. 아무래도 IDL의 제작사가 미국 회사이다보니까 어쩌면 당연한 얘기일지도 모르겠습니다. 하여간 오늘은 IDL에서 대한민국의 행정구역을 지도에 표시하는 방법을 위주로 소개해보고자 합니다. 일단 먼저 기본적인 기능만을 이용하여 해안선 및 국가경계선을 표시하는 과정부터 시작해봅시다. 이를 위한 예제코드는 다음과 같습니다.
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
limit = [25, 115, 50, 140]
m = MAP('geographic', LIMIT=limit, $
MARGIN=0.1, /CURRENT)
mc = MAPCONTINENTS(/HIRES, /COUNTRIES)
m.MapGrid.LABEL_POSITION = 0
m.MapGrid.LINESTYLE = 1
m.MapGrid.HORIZON_LINESTYLE = 0
여기서는 경위도 범위를 한반도를 중심으로 하여 25도x25도의 영역을 커버하도록 설정하였습니다. 그리고 MAPCONTINENTS 함수에서 /COUNTRIES라는 키워드가 사용되었는데, 이 키워드가 바로 국가경계선을 표시하는 역할을 합니다. 이 내용을 실행하여 표출된 그림은 다음과 같습니다.
여기까지는 IDL에 기본적으로 내장된 기능만을 사용하여 해안선 및 국가경계선을 표시하는 과정이었습니다. 그러면 대한민국 행정구역을 표시하는 과정으로 가야 할텐데요. IDL 자체는 대한민국 행정구역 데이터를 내장하고 있지 않다는 것을 우선 전제로 깔아야 합니다. 따라서 적절한 데이터를 외부에서 가져와서 사용하는 수 밖에 없습니다. 이를 위해서는 대한민국 행정구역 정보를 내장한 Shapefile 형식의 데이터 파일을 가져와야 합니다. 왜냐하면 Shapefile 형식의 파일을 MAPCONTINENTS 함수에서 바로 사용해야만 경계선의 표출이 가능하기 때문입니다. 사실 이러한 데이터를 제공하는 공급처들은 몇 군데가 있습니다. 국토지리원이나 행정안전부에서 배포하는 자료도 있고 그 외에 다른 곳에서 배포하는 경우도 있습니다. 그런데 현재까지 제가 파악한 바로는, IDL의 MAPCONTINENTS 함수에서 바로 사용이 가능한 Shapefile 형식의 대한민국 행정구역 경계선 데이터 파일은 바로 아래의 웹사이트에서 받을 수 있습니다.
제가 현 시점(2020년 6월)에 여기서 받을 수 있는 가장 최신의 자료는 아마도 버전 3.4에 해당되는 2018년도 자료인 것 같습니다. 제가 여기서 다운로드받은 자료 파일을 바로 이 게시물에도 첨부합니다.
이 파일은 압축파일(zip)이기 때문에 받아서 압축을 풀어놔야 합니다. 그러면 gadm36_KOR_shp라는 폴더가 나오고 그 안에 gadm36_KOR_0, gadm36_KOR_1, gadm36_KOR_2 등 3종으로 나눠지는 다수의 파일들이 보이게 될 것입니다. 이렇게 하면 준비는 완료됩니다. 그러면 이 데이터를 사용하여 표출을 해봅시다. 아예 처음부터 다시 해야 하므로 위의 예제코드는 잊어버리시고 아래와 같은 내용으로 새롭게 시작합니다.
win = WINDOW(DIMENSIONS=[500, 600], /NO_TOOLBAR)
limit = [33, 125, 39, 130]
m = MAP('geographic', LIMIT=limit, $
MARGIN=0.1, /CURRENT)
mc = MAPCONTINENTS(/HIRES)
file = 'data/gadm36_KOR_shp/gadm36_KOR_0.shp'
mck = MAPCONTINENTS(file, COLOR='crimson')
m.MapGrid.LABEL_POSITION = 0
m.MapGrid.LINESTYLE = 1
m.MapGrid.HORIZON_LINESTYLE = 0
여기서는 지도의 범위를 한반도 근방 6도x5도의 영역으로 좁혔습니다. 그리고 MAPCONTINENTS 함수를 두번에 걸쳐 사용하였는데, 첫번째(mc)는 그냥 기본적인 해안경계선만 표출하는 역할이고, 위에서 언급한 외부 자료가 반영되도록 한 것은 두번째(mck)입니다. 여기서 유의할 점은 gadm36_KOR_0.shp라는 파일이 사용될 수 있도록 하기 위하여 파일명에 폴더 경로까지 정확히 표시해야 한다는 것입니다. 위에서는 제가 상대경로를 사용하긴 했지만, 좀 더 확실하게 하려면 절대경로를 사용하는 것이 더 좋을 수도 있습니다. OS가 윈도우즈일 경우를 예로 든다면 다음과 같은 식으로 명시하는 것입니다.
file = 'C:myIDL\data\gadm36_KOR_shp\gadm36_KOR_0.shp'
어쨌든 이 부분은 사용자의 PC의 상황에 맞게 처리하면 됩니다. 위 내용을 실행하면 다음과 같은 그림이 표출될 것입니다.
여기서는 외부 파일을 이용하여 표출된 경계선이 붉은색이 되도록 하였습니다. 이 그림을 보면 gadm36_KOR_0.shp라는 파일을 이용하여 표시된 경계선은 국가경계선임을 알 수 있습니다. 그러면 이번에는 gadm36_KOR_1.shp라는 파일을 이용하여 어떤 그림이 표출되는지 봅시다. 다음과 같이 파일명이 명시된 부분만 수정하여 위의 코드를 다시 돌리면 됩니다.
file = 'data/gadm36_KOR_shp/gadm36_KOR_1.shp'
그러면 다음과 같은 그림이 표출될 것입니다.
이 그림을 보면 gadm36_KOR_1.shp라는 파일을 이용하여 표시된 경계선은 도경계선임을 알 수 있습니다. 그래서 각 도와 광역시들의 경계선이 표시된 것을 확인할 수 있습니다. 그러면 이번에는 gadm36_KOR_2.shp라는 파일을 이용하여 어떤 그림이 표출되는지 봅시다. 다음과 같이 파일명이 명시된 부분만 수정하여 위의 코드를 다시 돌리면 됩니다.
file = 'data/gadm36_KOR_shp/gadm36_KOR_2.shp'
그러면 다음과 같은 그림이 표출될 것입니다.
이 그림을 보면 gadm36_KOR_2.shp라는 파일을 이용하여 표시된 경계선은 시군구 경계선임을 알 수 있습니다. 그래서 앞서 도경계선의 경우보다 더 세밀한 단위의 행정구역 경계선들이 표시된 것을 확인할 수 있습니다. 그러면 여기서 영역 범위를 더 좁혀서 보면 좋을 것 같습니다. 이를 위해서는 그림을 또 처음부터 다시 그려보는 것이 좋을 것 같습니다. 이를 위한 예제코드는 다음과 같습니다.
win = WINDOW(DIMENSIONS=[500, 600], /NO_TOOLBAR)
limit = [37.1, 126.6, 37.9, 127.4]
m = MAP('geographic', LIMIT=limit, $
MARGIN=[0.15, 0.18, 0.05, 0.05], /CURRENT)
mc = MAPCONTINENTS(/HIRES)
file = 'data/gadm36_KOR_shp/gadm36_KOR_2.shp'
mck2 = MAPCONTINENTS(file, COLOR='crimson')
file = 'data/gadm36_KOR_shp/gadm36_KOR_1.shp'
mck1 = MAPCONTINENTS(file, COLOR='blue', THICK=2)
m.MapGrid.LABEL_POSITION = 0
m.MapGrid.LINESTYLE = 1
m.MapGrid.HORIZON_LINESTYLE = 0
여기서는 서울시 및 근방을 나타내기 위하여 limit에 명시된 경위도 범위값들을 적절하게 조정하였습니다. 그리고 MAPCONTINENTS 함수를 이번에는 총 3회에 걸쳐서 사용하였습니다. 이들 중 mc는 그대로이고 mck2는 시군구 경계선을 붉은색으로 그리고 mck1은 도경계선을 파란색으로 좀 두껍게 표시하도록 한 것입니다. 이 내용을 실행하면 다음과 같은 그림이 표출될 것입니다.
이 그림을 보면 서울시의 경우 구 단위 행정구역들이 표시되었음을 확인할 수 있습니다. 만약 경위도 범위만 적절히 변경해주면 다른 지역도 유사한 방식으로 표출할 수 있습니다. 이번에는 부산광역시 및 그 근방을 나타내기 위하여 경위도 범위 부분만 다음과 같이 변경해 봅시다.
limit = [34.8, 128.6, 35.6, 129.4]
이렇게 하여 다시 실행해보면 다음과 같은 그림이 표출될 것입니다.
이번에는 경위도 범위를 다음과 같이 변경해서 다시 실행해 봅시다.
limit = [35.6, 126.6, 37.4, 128.4]
그러면 다음과 같은 그림이 표출될 것입니다.
이 그림에서는 대전시, 세종시, 충북, 충남 근방의 행정구역들이 표시된 것을 확인할 수 있습니다. 이와 같은 요령으로 다양한 지역들을 대상으로 표출이 가능할 것입니다.
그래서 이러한 방식으로 외부에서 적절한 자료를 가져와서 활용하면 IDL에서도 대한민국 행정구역 경계선을 표시하면서 지도를 표출하는 것이 가능합니다. 물론 이 자료가 완벽하지는 않습니다. 행정구역은 사실 읍면동과 같이 보다 더 세밀한 단위로도 존재하지만, 그에 해당되는 데이터는 GADM에서는 제공되지 않습니다. 따라서 아마도 이 내용을 보시면서 이왕이면 대한민국의 국가기관에서 제공하는 데이터를 사용하면 더 좋지 않을까 생각하시는 분들이 계실 것 같습니다. 저도 사실 이왕이면 그렇게 해보고 싶었는데요. 제가 충분히 많은 탐색을 해보지 못해서인지는 모르겠지만, 아직까지는 적절한 데이터를 찾지 못했습니다. 사실 행안부나 국토지리원에서 제공되는 행정구역 데이터 역시 Shapefile의 형태로 제공은 됩니다. 다만 이 데이터의 경우는 파일 내에 수록된 경계선 좌표값들이 UTM-K 투영법 기반의 거리 단위로 되어 있는데요. IDL의 MAPCONTINENTS 함수에서 사용 가능한 Shapefile이 되려면 파일 내에 수록된 경계선 좌표값들이 경위도(Lon/Lat) 기반의 값들이어야 합니다. 그래서 제가 오늘 소개한 GADM 데이터의 경우에는 이러한 조건이 충족되기 때문에 이 데이터를 사용하는 방법으로 소개를 드린 것입니다. 만약 거리 단위의 좌표값들이 수록된 국내 자료를 이용하고자 할 경우에는 좌표변환과 같은 복잡한 과정을 거쳐야 하고 여러가지로 번거로운 부분들도 많기 때문에, 그 방법을 여기서는 소개하기는 매우 힘들 것 같습니다.
그래서 여러분들께서 이 게시물을 보시고 혹시 다른 괜찮은 행정구역 자료에 대하여 아시는 분들이 계시다면 댓글을 통해서 또는 저에게 직접 이메일(lee@selab.co.kr)로 알려주시면 감사하겠습니다. 저도 더 좋은 데이터에 대한 탐색을 계속 해보도록 하겠습니다.
'IDL > Mapping' 카테고리의 다른 글
Near Side Perspective 투영법을 이용한 지도 표출 (0) | 2021.10.26 |
---|---|
지도와 2차원 데이터의 중첩 표출 방법 정리 (2) | 2021.03.02 |
천리안 위성 2A호(GK2A)의 데이터 표출 [2] (0) | 2020.03.13 |
천리안 위성 2A호(GK2A)의 데이터 표출 [1] (3) | 2020.03.11 |
MAP 함수에서 ASPECT_RATIO 속성의 사용 (0) | 2019.03.05 |