지역명 표기하기

개요

이번 글에서는 R의 ggplot2sf 패키지를 활용해 지도 위에 지역명을 표기하는 방법을 알아보겠습니다. 자동으로 텍스트를 배치하는 방법부터, 직접 텍스트 위치를 조정하는 방법까지 차근차근 알아봅시다!

수도권 지도 준비하기

먼저, 행정구 병합하기 글에서 만든 수도권 지도를 불러오겠습니다. 이 지도 데이터에는 SGG_NM 열이 있는데, 시도와 시군구 이름이 담겨 있습니다. 이를 활용해 지도 위에 시군구명을 표시하는 방법을 알아보겠습니다.

# 패키지 로드
library(tidyverse)
library(sf)

# 데이터 불러오기
sdg <- st_read("아웃풋/수도권 행정구 병합 지도.shp")
## Reading layer `수도권 행정구 병합 지도' from data source 
##   `...\아웃풋\수도권 행정구 병합 지도.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 66 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -10044.95 ymin: 477264 xmax: 274945.2 ymax: 631207.8
## Projected CRS: Korea_2000_Korea_Central_Belt_2010
# 데이터 확인
head(sdg)
## Simple feature collection with 6 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 170923.2 ymin: 518463.7 xmax: 254296.8 ymax: 605780.4
## Projected CRS: Korea_2000_Korea_Central_Belt_2010
##          SGG_NM COL_ADM_SE                       geometry
## 1 경기도 가평군      41820 MULTIPOLYGON (((239726.3 60...
## 2 경기도 고양시      41280 MULTIPOLYGON (((193799.4 57...
## 3 경기도 과천시      41290 MULTIPOLYGON (((200375.6 54...
## 4 경기도 광명시      41210 MULTIPOLYGON (((188355.1 54...
## 5 경기도 광주시      41610 MULTIPOLYGON (((230605 5485...
## 6 경기도 구리시      41310 MULTIPOLYGON (((213032.4 56...

시도명과 시군구명 분리하기

SGG_NM열에 시도와 시군구 이름이 하나의 문자열로 결합되어 있습니다. 이를 분리하여 시도(SD_NM)와 시군구(SGG_NM) 이름을 각각 분리해 보겠습니다. separate 함수를 사용하면 손쉽게 이 작업을 수행할 수 있습니다.

sdg <- sdg %>% 
  separate(col = SGG_NM,
           into = c("SD_NM", "SGG_NM"),
           sep = " ",
           fill = "right")

head(sdg)
## Simple feature collection with 6 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 170923.2 ymin: 518463.7 xmax: 254296.8 ymax: 605780.4
## Projected CRS: Korea_2000_Korea_Central_Belt_2010
##    SD_NM SGG_NM COL_ADM_SE                       geometry
## 1 경기도 가평군      41820 MULTIPOLYGON (((239726.3 60...
## 2 경기도 고양시      41280 MULTIPOLYGON (((193799.4 57...
## 3 경기도 과천시      41290 MULTIPOLYGON (((200375.6 54...
## 4 경기도 광명시      41210 MULTIPOLYGON (((188355.1 54...
## 5 경기도 광주시      41610 MULTIPOLYGON (((230605 5485...
## 6 경기도 구리시      41310 MULTIPOLYGON (((213032.4 56...

자동으로 지역명 표기하기

가장 간단한 방법은 geom_sf_text를 사용하는 것입니다. 이 함수는 지도 데이터의 지오메트리 정보를 기반으로 텍스트를 자동으로 배치합니다. 간단한 설정만으로도 시군구 이름을 지도 위에 추가할 수 있습니다.

# 패키지 로드
library(ggplot2)
library(showtext)

# 글꼴 설정
font_add("kopub", "C:/Users/.../AppData/Local/Microsoft/Windows/Fonts/KoPub Dotum Medium.ttf")
showtext_auto()
showtext_opts(dpi=300)

theme.size = 12
text.size = theme.size / .pt

# 지도 작성
ggplot(data = sdg) +
  geom_sf(colour = "gray40", fill = "#eaeaea", linewidth = 0.5) +
  geom_sf_text(aes(label = SGG_NM),
               family = "kopub",
               size = text.size) +
  theme_void()

자동으로 지역명 표기한 지도

중심 좌표 직접 계산하여 지역명 표기하기

텍스트 위치를 더 정확하게 조정하고 싶다면, 직접 좌표를 지정하는 방법도 있습니다. 예를 들어, st_centroid 함수를 사용해 각 폴리곤의 중심 좌표를 추출한 뒤, 이 좌표를 활용해 지역명을 해당 중심에 배치할 수 있습니다.

# 포인트 추출
pnts1 <- st_centroid(sdg)

# 지도 작성
ggplot() +
  geom_sf(data = sdg, colour = "gray40", fill = "#eaeaea", linewidth = 0.5) +
  geom_sf_text(data = pnts1,
            aes(label = SGG_NM),
            family = "kopub",
            size = text.size) +
  theme_void()

폴리곤 중심 좌표 계산해 지역명 표기한 지도

폴리곤 내부에 지역명 표기하기

만약 텍스트가 반드시 폴리곤 내부에 위치해야 한다면, st_point_on_surface 함수를 사용해 보세요. 이 함수는 항상 폴리곤 내부에 위치하는 대표 점을 계산해줍니다.

# 포인트 추출
pnts2 <- st_point_on_surface(sdg)

# 지도 작성
ggplot() +
  geom_sf(data = sdg, colour = "gray40", fill = "#eaeaea", linewidth = 0.5) +
  geom_sf_text(data = pnts2,
            aes(label = SGG_NM),
            family = "kopub",
            size = text.size) +
  theme_void()

폴리곤 내부에 위치하도록 지역명 표기한 지도

직접 좌표를 계산하거나 다른 위치 정보를 활용해 원하는 지점에 텍스트를 배치할 수도 있습니다. 이번 글에서 소개한 방법들을 응용해 텍스트 위치를 자유롭게 조정해 보세요! 다만, 일부 지역명이 겹치는 문제가 발생할 수 있는데, 이를 해결하는 방법은 다른 포스팅에서 자세히 다룰 예정입니다.