R프로그래밍 - 불필요한 지도 영역 제거하기

서울시 선거구지도를 그려봤으니, 경기도 선거구까지만 지도로 표현해보려고 했는데, 몇가지 문제가 생겼다. 안산시 선거구를 그릴때, 행정동 정보를 이용해서 그룹화해서 경계를 병합하여 아래 그림과 같이 그릴 수 있었다. 그런데 좌측하단에 작은 섬이 하나 포함되면서 전체적으롤 지도가 넓은지역을 포함해야 하다보니 공백영역이 많아 보여 효율적인 표현이 어려웠다.

국회위원선거 서울특별시 선거구 지도 만들기

결론적으로 아래 그림처럼 불필요한 영역을 제거하면서 공간영역을 조금 더 효율적으로 표현할 수 있었다. 과정을 하나씩 정리해보려 한다.

대부동 공간데이터를 가지고 그리면 아래 그림처럼 나온다. datum 설정은 아래 포스팅 참고한다.

(ggplot2) coord_sf 지도 CRS, Datum 설정하기

ggplot() + 
  geom_sf(data = map_dong |> 
            filter(str_detect(adm_nm, '대부동'))) +
  coord_sf(datum = st_crs(5179))

좌측하단의 섬과 우축상단의 긴 방조제 영역을 제거하려고 한다. 제거할 크기만큼의 사각형 공간을 만들어서, 제외시키는 작업을 할 예정이다.

데이터를 정리해야 한다. 아까 그 빨간네모 영역을 만들어 bb 변수에 담고, aa 에는 대부동 공간데이터를 담는다. 여기서 조심할 것은, 두 공간데이터간에 연산을 해야 하다보니 CRS 정보가 일치해야 한다. aa에 있던 CRS 정보를 그대로 bb 영역에 주입했다.

aa = map_dong |> 
  filter(str_detect(adm_nm, '대부동')) |> 
  st_geometry()

bb = list(list(rbind(c(918000,1922000), c(918000,1926000), 
                c(922000,1926000), c(922000,1922000), 
                c(918000,1922000))),
     list(rbind(c(900000,1900000), c(900000,1905000), 
                c(905000,1905000), c(905000,1900000), 
                c(900000,1900000)))) |> 
  st_multipolygon() |> 
  st_sfc(crs = st_crs(aa))

이제 st_difference 함수를 이용하여 공간을 빼기만 하면 된다. 섬이 제거된 걸 볼 수 있다.

(ggplot2) 벤다이어그램 그리기 - 교집합,합집합,차집합

ggplot() + 
  geom_sf(data = st_difference(aa, bb) )+
  geom_sf(data = bb, fill = "red", colour = "red", alpha = 0.2) +
  coord_sf(datum = st_crs(5179))

별다른 설정이 없다면 이렇게 꽉차게 그려지게 된다.

ggplot() + 
  geom_sf(data = st_difference(aa, bb))

마지막으로 색 테마를 다르게 해서 셋팅했다.


더 보면 좋을 글들