서울시 선거구지도를 그려봤으니, 경기도 선거구까지만 지도로 표현해보려고 했는데, 몇가지 문제가 생겼다. 안산시 선거구를 그릴때, 행정동 정보를 이용해서 그룹화해서 경계를 병합하여 아래 그림과 같이 그릴 수 있었다. 그런데 좌측하단에 작은 섬이 하나 포함되면서 전체적으롤 지도가 넓은지역을 포함해야 하다보니 공백영역이 많아 보여 효율적인 표현이 어려웠다.
결론적으로 아래 그림처럼 불필요한 영역을 제거하면서 공간영역을 조금 더 효율적으로 표현할 수 있었다. 과정을 하나씩 정리해보려 한다.
대부동 공간데이터를 가지고 그리면 아래 그림처럼 나온다. 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
함수를 이용하여 공간을 빼기만 하면 된다. 섬이 제거된 걸 볼 수 있다.
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))
마지막으로 색 테마를 다르게 해서 셋팅했다.