지도학(Cartography)은 지도를 제작하는 방식이다. 특정한 목적에 따라 특수한 주제 혹은 내용만을 나타내어 그린 지도를 주제도(Thematic Map) 라고 한다. 어느 시점에서의 일기 상황을 나타낸 기상도, 운전할 때 쓰이는 도로도, 항해할 때 쓰이는 해도, 통계값을 지도에 그려 넣은 통계 지도 등이 좋은 사례다.

지리정보를 표현하기 위해서는 다음과 같은 기본 요소가 필요하다.

  1. .shp, .geojson, .gpkg 확장자를 갖는 지도파일
  2. 지리 위치를 나타내는 위도 경도
  3. 해당 위도경도 지점, 선, 다각형 지역에 표현할 속성정보(attributes)

1 지리정보 파일(SHP)

대한민국 센서스용 행정구역경계(시군구) 자료는 통계지리정보서비스 사이트에서 자료신청을 하면 얻을 수 있다. 그리고, 제공되는 자세한 형식에 대한 정보는 자료신청자료제공 목록을 참조한다. 혹은, Encaion 구글 드라이브에서 직접 다운로드 받을 수도 있다. 통계청으로 신청하면 승인까지 수일이 소요되며 행정처리일 기준으로 처리되며 다운로드 가능한 기간도 1주일이다.

FILEMAP = {
    'shp': [('skorea-shp.zip','http://biogeo.ucdavis.edu/data/gadm2/shp/KOR_adm.zip')],
    'kmz': [('skorea.kmz','http://biogeo.ucdavis.edu/data/gadm2/kmz/KOR_adm0.kmz'),
            ('skorea-provinces.kmz','http://biogeo.ucdavis.edu/data/gadm2/kmz/KOR_adm1.kmz'),
            ('skorea-municipalities.kmz','http://biogeo.ucdavis.edu/data/gadm2/kmz/KOR_adm2.kmz')],
    'r'  : [('skorea.RData','http://biogeo.ucdavis.edu/data/gadm2/R/KOR_adm0.RData'),
            ('skorea-provinces.RData','http://biogeo.ucdavis.edu/data/gadm2/R/KOR_adm1.RData'),
            ('skorea-municipalities.RData','http://biogeo.ucdavis.edu/data/gadm2/R/KOR_adm2.RData')]

2 대한민국 - 지리정보

대한민국 지도에 관한 일반정보의 경도범위는 124 – 132, 위도범위는 33 – 43 이다.

  • 대한민국 위도와 경도 1 2
    • 대한민국 전체
      • 극동: 경상북도 울릉군의 독도 동단 동경 131° 52′20" → 131.87222222
      • 극서: 평안북도 용천군 신도면 마안도 서단 동경 124° 11′45" → 124.19583333
      • 극남: 제주도 남제주군 대정읍 마라도 남단 북위 33° 06′40" → 33.11111111
      • 극북: 함경북도 온성군 남양면 북단 북위 43° 00′35" → 43.00972222
    • 북한 제외
      • 극동: 경상북도 울릉군의 독도(獨島)로 동경 131° 52′20“, → 131.87222222
      • 극서: 전라남도 신안군의 소흑산도(小黑山島)로 동경 125° 04′, → 125.06666667
      • 극북: 강원도 고성군 현내면 송현진으로 북위 38° 27′00, → 38.45000000
      • 극남: 제주도 남제주군 마라도(馬羅島)로 북위 33° 06′00" → 33.10000000
  • 섬 포함 우리나라의 중심점은 강원도 양구군 남면 도촌리 산48번지
    • 북위 38도 03분 37.5초, 동경 128도 02분 2.5초 → 38.05138889, 128.03388889
  • 섬을 제외하고 육지만을 놓고 한반도의 중심점을 계산하면 북한에 위치한 강원도 회양군 현리 인근
    • 북위(lon): 38도 39분 00초, 동경(lat) 127도 28분 55초 → 33.10000000, 127.48194444
  • 대한민국
    • 도분초: 37° 34′ 8″ N, 126° 58′ 36″ E
    • 소수점 좌표: 37.568889, 126.976667

상기 도분초(Degrees Minutes Seconds)로 된 위경도 정보를 소수점 도정보를 변경하는 사이트를 통해서 lon, lat 값을 수월하게 생성할 수 있다.

Degrees Minutes Seconds to Decimal Degrees

우리 나라 지도 좌표계는 준거 타원체로 Bessel 타원체를 사용하며 (장반경: 6378397.155m, 단반경: 6356078.96284m, 평편율 : 200.15)이며, 경위도는 지리좌표를 사용하고 있다. 평면직각 좌표계의 경우 국가기본도는 TM좌표를, 군사용 지도는 UTM좌표를 사용하고 있다.

1910년 만들어진 국내 영토의 좌표가 110년만인 2020년, 일본식에서 국제표준으로 바뀐다고 2015년 국토교통부가 발표를 하였다. 우리땅 좌표 전환 기사를 통해서 대략적인 내용을 확인할 수 있다. 우리땅 좌표, 지적도의 좌표만 남쪽 315m, 동쪽 185m씩 이동되고, 우리나라 모든 공간정보는 국제표준으로 바뀌된다고 합니다. 3

  • 일제시대 좌표: bessel타원체
  • ITRF 좌표계: 세계측지계
  • GPS: WGS80타원체

3 대한민국지도 - rworldmap

지도가 구해졌으면 범위를 한정하기 위해 극점(extreme point) 정보를 알아내는 것이 중요하다. 남한 극단정보 위키피디아에서 확인한 극점정보를 사용하여 남한지도를 그려본다.

3.1 세계지도

rworldmap 팩키지를 사용해서 getMap() 함수로 세계지도 데이터를 가져온다. str(korea_spdf, max.level = 2) 명령어를 통해서 “SpatialPolygonsDataFrame”임을 확인할 수 있다. “SpatialPolygonsDataFrame” 객체는 지리정보(공간 다각형, Spatial Polygons)와 데이터프레임이 결합된 데이터다.

#install.packages(rworldmap)
library(rworldmap)
library(ggmap)

korea_spdf <- rworldmap::getMap(resolution = "high")

str(korea_spdf, max.level = 2)
Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame': 244 obs. of  49 variables:
  ..@ polygons   :List of 244
  ..@ plotOrder  : int [1:244] 12 184 39 227 42 33 16 88 114 9 ...
  ..@ bbox       : num [1:2, 1:2] -180 -90 180 83.6
  .. ..- attr(*, "dimnames")=List of 2
  ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot

3.2 주소정보 → 위경도

영문으로 구성된 대한민국 주소정보를 ggmap 팩키지 geocode() 함수에 던져 위도와 경도 정보를 가져와서 이를 plot() 함수로 시각화한다.

south_korea_limits <- geocode(c(
  "Daegang-ri, Hyeonnae-myeon, County of Goseong, Gangwon",
  "Marado, Daejeong-eup, Seogwipo, Jeju",
  "Dokdo-ri,Ulleung-eup, County of Ulleung, North Gyeongsang",
  "Baengnyeongdo, Baengnyeong-myeon,    County of Ongjin, Incheon")
)  

south_korea_limits
# A tibble: 4 x 2
    lon   lat
  <dbl> <dbl>
1  128.  38.6
2  126.  33.1
3  132.  37.2
4  125.  38.0
plot(korea_spdf,
     xlim = range(south_korea_limits$lon),
     ylim = range(south_korea_limits$lat),
     asp = 1
)

남한 극단정보 중 섬을 제외한 본토를 기준으로 지리정보를 시각화하면 다음과 같다. 동일한 방식으로 섬을 제외한 본토를 기준으로 위도경도 정보를 받아오고 이를 바탕으로 시각화한다.

south_korea_mainland_limits <- geocode(c(
  "Daegang-ri, Hyeonnae-myeon, County of Goseong, Gangwon",
  "Songho-ri, Songji-myeon, Haenam, South Jeolla",
  "Guryongpo-eup, Pohang, North Gyeongsang",
  "Mohang-ri, Sowon-myeon, Taean, Chungcheong")
)

south_korea_mainland_limits
FALSE # A tibble: 4 x 2
FALSE     lon   lat
FALSE   <dbl> <dbl>
FALSE 1  128.  38.6
FALSE 2  127.  34.3
FALSE 3  130.  36.0
FALSE 4  126.  36.8
plot(korea_spdf,
     xlim = range(south_korea_mainland_limits$lon),
     ylim = range(south_korea_mainland_limits$lat),
     asp = 1
)