지도학(Cartography)은 지도를 제작하는 방식이다. 특정한 목적에 따라 특수한 주제 혹은 내용만을 나타내어 그린 지도를 주제도(Thematic Map) 라고 한다. 어느 시점에서의 일기 상황을 나타낸 기상도, 운전할 때 쓰이는 도로도, 항해할 때 쓰이는 해도, 통계값을 지도에 그려 넣은 통계 지도 등이 좋은 사례다.
지리정보를 표현하기 위해서는 다음과 같은 기본 요소가 필요하다.
.shp
, .geojson
, .gpkg
확장자를 갖는 지도파일대한민국 센서스용 행정구역경계(시군구) 자료는 통계지리정보서비스 사이트에서 자료신청을 하면 얻을 수 있다. 그리고, 제공되는 자세한 형식에 대한 정보는 자료신청 → 자료제공 목록을 참조한다. 혹은, 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')]
대한민국 지도에 관한 일반정보의 경도범위는 124 – 132, 위도범위는 33 – 43 이다.
lon
): 38도 39분 00초, 동경(lat
) 127도 28분 55초 → 33.10000000, 127.48194444상기 도분초(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
rworldmap
지도가 구해졌으면 범위를 한정하기 위해 극점(extreme point) 정보를 알아내는 것이 중요하다. 남한 극단정보 위키피디아에서 확인한 극점정보를 사용하여 남한지도를 그려본다.
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
영문으로 구성된 대한민국 주소정보를 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
)