지도 확대하기
지도 확대는 언제 필요할까요?
지도를 그리다 보면 넓은 지역을 보여주면서도 특정 지역에 초점을 맞추고 싶을 때나, 행정구역 내에서도 특정 지역만 확대해서 강조하고 싶을 때가 있습니다. 이번에는 서울을 중심으로 지도를 확대하거나, 광화문처럼 특정 위치에 초점을 맞춘 지도를 만드는 방법을 알려드리겠습니다. 방법은 두 가지입니다.
- 지도의 중심으로 설정할 폴리곤에서 좌표를 추출하는 방법
- 특정 지역의 좌표를 직접 입력하는 방법
폴리곤에서 경계 좌표를 추출해 확대하기
지난 ‘녹지, 수계, 도로 추가하기’ 포스팅에서 만든 수도권 지도를 활용하겠습니다. 먼저, 수도권 지도에서 서울 경계값을 추출합니다. st_bbox를 사용하면 서울의 경계 좌표(xmin, xmax, ymin, ymax)를 손쉽게 가져올 수 있습니다.
# 서울 경계 좌표 구하기
coords_seoul <- sgg %>%
filter(grepl("서울특별시", SGG_NM)) %>%
st_bbox()
coords_seoul
## xmin ymin xmax ymax
## 179191.4 536562.8 216242.3 566863.5
수도권 지도를 반복해서 사용할 예정이라, base_map이라는 변수에 저장해두겠습니다. 서울의 경계 좌표(coords_seoul)를 coord_sf에 입력해, 서울을 확대한 지도를 그릴 수 있습니다.
# 기본 지도 정의
base_map <- ggplot() +
geom_sf(data = sgg, colour=NA, fill="#eaeaea") + # 시군구 영역
geom_sf(data = green, colour=NA, fill="#A0D097") + # 녹지
geom_sf(data = mt, colour=NA, fill="#A0D097") + # 산지
geom_sf(data = water, colour=NA, fill="#A5D1F2") + # 수계
geom_sf(data = road, colour=NA, fill="white", linewidth=0.1) + # 도로
geom_sf(data = sgg, colour="white", fill=NA, linewidth=1.3) + # 시군구 경계
geom_sf(data = sgg, colour="gray40", fill=NA, linewidth=0.5) # 시군구 경계
# 서울 중심으로 확대된 지도 그리기
base_map +
coord_sf(xlim = coords_seoul[c("xmin", "xmax")],
ylim = coords_seoul[c("ymin", "ymax")]) +
theme_void()

경계에 여유를 두고 싶다면?
서울 경계에 딱 맞춘 지도는 답답해 보일 수 있습니다. 이럴 땐 st_buffer를 사용해서 여백을 추가할 수 있습니다. 서울 경계선을 기준으로 3km의 버퍼를 추가해 조금 더 여유 있는 지도를 만들어보겠습니다.
# 3km 버퍼를 둔 경계 좌표 구하기
buffered_coords_seoul <- sgg %>%
filter(grepl("서울특별시", SGG_NM)) %>%
st_buffer(dist = 3000) %>% # 3km 버퍼
st_bbox()
# 버퍼를 적용한 확대 지도 그리기
base_map +
coord_sf(xlim = buffered_coords_seoul[c("xmin", "xmax")],
ylim = buffered_coords_seoul[c("ymin", "ymax")]) +
theme_void()

직접 좌표를 입력해 확대하기
서울에서도 특정 지역, 예를 들어 광화문 인근 지역을 지도로 그리고 싶다면, Google 지도에서 좌표를 직접 가져와야 합니다. Google 지도에서 원하는 지점을 두 번 클릭하면 경도와 위도를 확인할 수 있습니다. Google 지도에서 얻은 좌표는 WGS 1984(EPSG:4326) 좌표계를 사용하기 때문에, 이를 GRS80(EPSG:5186)으로 변환해야 합니다. st_multipoint를 사용해서 영역의 네 꼭짓점을 정의하고, 변환한 좌표를 coord_sf에 입력하면 완성입니다!
# 광화문 영역 좌표 정의 및 변환
x <- c(126.951940, 127.000950)
y <- c(37.566511, 37.586238)
pts <- st_multipoint(matrix(c(x[c(1, 2, 2, 1)],
y[c(1, 1, 2, 2)]), ncol = 2))
coords_ghm <- st_sfc(pts, crs = 4326) %>%
st_transform(crs = 5186) %>%
st_bbox()
# 광화문 인근 지역 지도 그리기
base_map +
coord_sf(xlim = coords_ghm[c("xmin", "xmax")],
ylim = coords_ghm[c("ymin", "ymax")]) +
theme_void()
