(ggplot2) 대한민국 독도 지도 그리기

대한민국 시군구 지도 데이터는 방대해서, 보통 0.001 배율로 줄이는 작업을 한다. 그래야 지도의 선들이 깔끔하게 그려지기도 하고 랜더링 시간도 단축되기 때문이다. 그런데, 이렇게 하면 작은 섬들은 제거되는데 그중에 독도가 없어져 버린다. 보통 일기예보나 뉴스에서 보는 지도에서 울릉도나 독도는 별도로 덧붙이거나 조금 크기를 키워 조정하는 지도라 보면 된다.

대한민국 독도 지도 그리기

오늘은 “시군구” 지도데이터 말고도, 독도의 행정구역 대한민국 경상북도 울릉군 울릉읍 독도리 지도를 그려야 하기 때문에, 가장 자세한 “리” 기준의 지도데이터가 필요하다. 여기 GIS DEVELOPER 사이트에서 받을 수 있다.

“리” 지도 데이터를 받아 한글깨짐문제와 crs셋팅을 하고, 대한민국 전체지도다보니 “독도리"만 필터링한다.

dokdo_1 = read_sf('~/map/li.shp') |> 
    mutate(LI_KOR_NM = iconv(LI_KOR_NM, from = "EUC-KR", to = 'UTF-8')) |> 
    st_set_crs(5179) |> 
    filter(str_detect(LI_KOR_NM, '독도리'))

독도만 지도로 그려본다. 대한민국 영토 독도이다.

ggplot() + 
  geom_sf(data = dokdo_1)

오늘 해야 할 작업은 이렇게 자세한 독도를 원한건 아니고, 전국지도에서 잘 보이지 않는 독도를 일정배율로 임의로 키워서 잘보이도록 하는 작업을 할 것이다. 첫번째로, ms_simplify 함수를 이용해서 단순화 한다. 그래프를 그려보면, 굉장히 단순한 다각형 도형처럼 되어버렸지만, 전국지도에 덧붙일 용도기 때문에 이정도면 충분하다.

dokdo_2 = dokdo_1 |> 
  ms_simplify(keep = 0.004, keep_shapes = T)

ggplot() + 
  geom_sf(data = dokdo_2)

전국지도 그리기

시군구 지도 데이터가 워낙 방대하다보니, ms_simplify 를 이용해서 데이터를 줄이곤 한다. 원래는 아래 빨간 동그라미 위치에 독도가 나와야 하지만 데이터량이 줄어서 나오질 않는다.

sig_map = read_sf('~/map/sig.shp') |> 
    mutate(SIG_KOR_NM = iconv(SIG_KOR_NM, from = "EUC-KR", to = 'UTF-8')) |> 
    ms_simplify(keep = 0.001, keep_shapes = T)  |> 
    st_set_crs(5179)

ggplot() + 
  geom_sf(data = sig_map)

아까 따로 만들어놨던 독도 데이터 dokdo_2를 덧그리더라도, 이게 점 하나찍은 정도의 크기로 나온다. 이건 지도 데이터가 잘못된게 아니라, 전국지도 배율에서는 실제 면적이 그만큼 작기 때문이다. 이런걸 원한게 아니다, 독도만 면적을 좀 키우고 싶었다.

ggplot() + 
  geom_sf(data = sig_map) +
  geom_sf(data = dokdo_2)

sf 패키지로 지도의 면적을 키울 수 있다. 정확히 12배 키워서 dokdo_scale 로 저장한다.

geom_dokdo = st_geometry(dokdo_2)
geom_dokdo_centroid = st_centroid(geom_dokdo)
geom_dokdo_scale = (geom_dokdo - geom_dokdo_centroid) * 12 + geom_dokdo_centroid

dokdo_scale = st_set_geometry(dokdo_2, geom_dokdo_scale) |> 
  st_set_crs(5179)

이렇게 면적을 키운 독도를 붙이면, 조금 더 뚜렷히 보이는 대한민국 지도 완성이다.

ggplot() + 
  geom_sf(data = sig_map) +
  geom_sf(data = dokdo_scale)


더 보면 좋을 글들