황해2

황해를 접한 대한민국 도시를 알아보자.

저자
소속

1 대한민국 해안선

1.1 대한민국 지도

코드
library(sf)
library(giscoR)
library(tidyverse)
library(ggrepel)
library(krvote)
sf_use_s2(FALSE)

korea_sf <- giscoR::gisco_get_countries(
        year = "2020",
        epsg = "4326",
        resolution = "01",
        country = "KR"
    ) 

plot(st_geometry(korea_sf))

1.2 해안선

GSHHG: A Global Self-consistent, Hierarchical, High-resolution Geography Database 아주 상세한 육지와 해안을 구분하는 해안선을 기준으로 인접한 경기도 선거구를 특정한다.

  • full resolution: Original (full) data resolution.
  • high resolution: About 80 % reduction in size and quality.
  • intermediate resolution: Another ~80 % reduction.
  • low resolution: Another ~80 % reduction.
  • crude resolution: Another ~80 % reduction.
코드

# coastline_sf <-  giscoR::gisco_coastallines

i_world_coastline <- st_read("data/gshhg-shp-2.3.7/GSHHS_shp/i/GSHHS_i_L1.shp")
#> Reading layer `GSHHS_i_L1' from data source 
#>   `E:\quarto\map_challenge\data\gshhg-shp-2.3.7\GSHHS_shp\i\GSHHS_i_L1.shp' 
#>   using driver `ESRI Shapefile'
#> Simple feature collection with 32830 features and 6 fields
#> Geometry type: POLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -180 ymin: -68.91981 xmax: 180 ymax: 83.63339
#> Geodetic CRS:  WGS 84

i_coastline_sf <- i_world_coastline %>% 
  st_crop(st_bbox(korea_sf))

ggplot(i_coastline_sf) +
  geom_sf(color = "blue", fill = "blue", alpha = 0.2) +
  # Zoom on Korea
  # coord_sf(
  #   xlim = c(korea_bbox['xmin'],  korea_bbox['xmax']),
  #   ylim = c(korea_bbox['ymin'],  korea_bbox['ymax'])
  # ) +
  theme_minimal() +
  theme(
    plot.background = element_rect(
      fill = "black",
      color = "black"
    ),
    panel.grid = element_blank(),
    axis.text = element_text(colour = "grey90")
  )

1.3 결합

코드
korea_coast_sf <- st_join(korea_sf, i_coastline_sf)

ggplot(korea_coast_sf) +
  geom_sf(color = "black", fill = "transparent", alpha = 0.2) +
  geom_sf(data = i_coastline_sf, color = "blue", fill = "transparent", alpha = 0.2) +
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    axis.text = element_text(colour = "grey90")
  ) 

1.4 항구

UN/LOCODE 표준으로 등재된 항구 코드 (KRPNC) 포함

코드
korea_port <- gisco_get_ports(year = "2013",
  country = "KOR")

korea_port <- st_transform(korea_port, st_crs(korea_coast_sf))

ggplot(korea_coast_sf) +
  geom_sf(color = "blue", fill = "white", alpha = 0.2) +
  geom_sf(data = korea_port, color = "red", size = 2) +
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    axis.text = element_text(colour = "grey90")
  ) +
  labs(
    title = "대한민국 항구", subtitle = "기준 2013년",
    caption = "항구 코드: UN/LOCODE 표준"
  )  +
  geom_text_repel(data = korea_port, aes(label = PORT_ID, geometry = geometry),
                   stat = "sf_coordinates", min.segment.length = 0, size = 5, 
                   max.overlaps = Inf, box.padding = 1.0)  

2 해안선 인접 선거구

2.1 제21대 총선 선구구

단순하고 가독성 높은 선거구 지도 제작을 위해 “서울”, “경기”, “부산”, “인천”, “광주” 를 제외!

코드
precinct_sf <- st_read("data/2020_21_elec_253.json")
#> Reading layer `2020_21_elec_253' from data source 
#>   `E:\quarto\map_challenge\data\2020_21_elec_253.json' using driver `GeoJSON'
#> Simple feature collection with 253 features and 4 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: 124.6097 ymin: 33.11187 xmax: 131.8713 ymax: 38.61695
#> Geodetic CRS:  WGS 84

kr_precinct_sf <- precinct_sf %>% 
  mutate(SGG_3 = str_remove(SGG_3, pattern = '^\\S*\\s'))

ggplot() +
  geom_sf(data = kr_precinct_sf) +
  geom_text_repel(data = kr_precinct_sf %>% filter(!SGG_1 %in% c("서울", "경기", "부산", "인천", "광주")), aes(label = SGG_3, geometry = geometry),
                  stat = "sf_coordinates", min.segment.length = 0,
                  max.overlaps = Inf, size = 3)

코드
kr_coast_sf <- st_filter(precinct_sf, i_coastline_sf, .predicate = st_overlaps)

ggplot() +
  geom_sf(data = kr_coast_sf) +
  geom_sf(data = korea_coast_sf, color = "blue", fill = "transparent") +
  geom_text_repel(data = kr_coast_sf, aes(label = SGG_3, geometry = geometry),
                   stat = "sf_coordinates", min.segment.length = 0, size = 3, 
                   max.overlaps = Inf, box.padding = 1.0) +
  labs(x = "",
       y = "")

코드
library(gt)
library(gtExtras)

kr_coast_sf %>% 
  sf::st_drop_geometry() %>% 
  mutate(SGG_3 = str_remove(SGG_3, pattern = '^\\S*\\s')) %>% 
  group_by(시도명 = SGG_1) %>% 
  summarise(선거구수 = n(),
            선거구 = paste0(SGG_3, collapse="|")) %>% 
  arrange(desc(선거구수)) %>% 
  janitor::adorn_totals(where = "row", name = "합계") %>%   
  gt::gt() %>% 
    cols_align(align = "center") %>% 
    gt_theme_538() %>% 
    tab_header(title = "해안선 인접 총선 선거구",
               subtitle = md("`선관위 제21대 선거구 기준`")) 
해안선 인접 총선 선거구
선관위 제21대 선거구 기준
시도명 선거구수 선거구
경기 13 김포갑|파주갑|고양을|김포을|파주을|고양병|안산단원갑|안산상록갑|평택을|안산단원을|화성갑|고양정|시흥을
부산 11 해운대갑|북강서을|남구갑|남구을|사하갑|중구영도구|사하을|수영|기장|서구동구|사상
전남 10 순천광양곡성구례을|여수갑|여수을|고흥보성장흥강진|나주화순|영암무안신안|해남완도진도|순천광양곡성구례갑|목포|담양함평영광장성
인천 8 연수갑|연수을|서구갑|중구강화옹진|서구을|남동갑|동구미추홀갑|동구미추홀을
경남 7 창원마산회원|거제|창원성산|통영고성|창원진해|창원마산합포|사천남해하동
충남 7 서산태안|보령서천|공주부여청양|당진|아산갑|아산을|홍성예산
경북 5 경주|군위의성청송영덕|영주영양봉화울진|포항북구|포항남울릉
울산 4 북구|남구을|동구|울주
전북 4 김제부안|정읍고창|익산갑|군산
강원 3 강릉|동해태백삼척정선|속초인제고성양양
서울 3 마포을|강서을|강서병
제주 3 제주을|서귀포|제주갑
합계 78 -

2.2 제21대 경기 선구구

코드
gg_precinct_sf <- precinct_sf %>% 
  filter(SGG_1 == "경기") %>% 
  mutate(SGG_3 = str_remove(SGG_3, "경기\\s+")) 

ggplot() +
  geom_sf(data = gg_precinct_sf) +
  geom_text_repel(data = gg_precinct_sf, aes(label = SGG_3, geometry = geometry),
                  stat = "sf_coordinates", min.segment.length = 0,
                  max.overlaps = Inf)

코드
gg_coast_sf <- st_filter(gg_precinct_sf, i_coastline_sf, .predicate = st_overlaps)

ggplot() +
  geom_sf(data = gg_coast_sf) +
  geom_sf(data = gg_precinct_sf, color = "blue", fill = "transparent") +
  geom_text_repel(data = gg_coast_sf, aes(label = SGG_3, geometry = geometry),
                   stat = "sf_coordinates", min.segment.length = 0, size = 3, 
                   max.overlaps = Inf, box.padding = 1.0) +
  labs(x = "",
       y = "")

코드

gg_coast_sf %>% 
  sf::st_drop_geometry() %>% 
  mutate(SGG_3 = str_remove(SGG_3, pattern = '^\\S*\\s')) %>% 
  mutate(= 1:n()) %>% 
  select(-SGG_2) %>% 
  select(, everything()) %>% 
  gt::gt() %>% 
    cols_align(align = "center") %>% 
    tab_header(title = "해안선 인접 총선 선거구",
               subtitle = md("`선관위 제21대 선거구 기준`")) %>% 
    cols_label(
      SGG_Code = "시군구 코드",
      SGG_1 = "시도명",
      SGG_3 = "선거구명"
    ) %>% 
    gt_theme_538() 
해안선 인접 총선 선거구
선관위 제21대 선거구 기준
시군구 코드 시도명 선거구명
1 2413902 경기 김포갑
2 2413202 경기 파주갑
3 2412002 경기 고양을
4 2413903 경기 김포을
5 2413203 경기 파주을
6 2412101 경기 고양병
7 2411901 경기 안산단원갑
8 2411801 경기 안산상록갑
9 2411502 경기 평택을
10 2411902 경기 안산단원을
11 2412801 경기 화성갑
12 2412201 경기 고양정
13 2412902 경기 시흥을

3 정밀 해안선 (경기)

코드
world_coastline <- st_read("data/gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp")
#> Reading layer `GSHHS_f_L1' from data source 
#>   `E:\quarto\map_challenge\data\gshhg-shp-2.3.7\GSHHS_shp\f\GSHHS_f_L1.shp' 
#>   using driver `ESRI Shapefile'
#> Simple feature collection with 179837 features and 6 fields
#> Geometry type: POLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -180 ymin: -68.92453 xmax: 180 ymax: 83.63339
#> Geodetic CRS:  WGS 84

gg_high_coastline <- world_coastline %>% 
  st_crop(st_bbox(gg_precinct_sf))

gg_coast_high_sf <- st_filter(gg_precinct_sf, gg_high_coastline, .predicate = st_overlaps)

ggplot() +
  geom_sf(data = gg_precinct_sf, fill = "transparent") +
  geom_sf(data = gg_coast_high_sf) +
  geom_sf(data = gg_high_coastline, color = "blue", fill = "transparent") +
  geom_text_repel(data = gg_coast_high_sf, aes(label = SGG_3, geometry = geometry),
                   stat = "sf_coordinates", min.segment.length = 0, size = 3, 
                   max.overlaps = Inf, box.padding = 1.0) +
  labs(x = "",
       y = "")

코드

gg_coast_high_sf %>% 
  sf::st_drop_geometry() %>% 
  mutate(SGG_3 = str_remove(SGG_3, pattern = '^\\S*\\s')) %>% 
  mutate(= 1:n()) %>% 
  select(-SGG_2) %>% 
  select(, everything()) %>% 
  gt::gt() %>% 
    cols_align(align = "center") %>% 
    tab_header(title = "해안선 인접 총선 선거구",
               subtitle = md("`선관위 제21대 선거구 기준`")) %>% 
    cols_label(
      SGG_Code = "시군구 코드",
      SGG_1 = "시도명",
      SGG_3 = "선거구명"
    ) %>% 
    gt_theme_538() 
해안선 인접 총선 선거구
선관위 제21대 선거구 기준
시군구 코드 시도명 선거구명
1 2413902 경기 김포갑
2 2413202 경기 파주갑
3 2412002 경기 고양을
4 2413903 경기 김포을
5 2413203 경기 파주을
6 2412101 경기 고양병
7 2411901 경기 안산단원갑
8 2411801 경기 안산상록갑
9 2411502 경기 평택을
10 2411902 경기 안산단원을
11 2412801 경기 화성갑
12 2412201 경기 고양정
13 2412902 경기 시흥을

4 정밀 해안선 (대한민국)

코드
world_coastline <- st_read("data/gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp")
#> Reading layer `GSHHS_f_L1' from data source 
#>   `E:\quarto\map_challenge\data\gshhg-shp-2.3.7\GSHHS_shp\f\GSHHS_f_L1.shp' 
#>   using driver `ESRI Shapefile'
#> Simple feature collection with 179837 features and 6 fields
#> Geometry type: POLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -180 ymin: -68.92453 xmax: 180 ymax: 83.63339
#> Geodetic CRS:  WGS 84

high_coastline <- world_coastline %>% 
  st_crop(st_bbox(precinct_sf))

coast_high_sf <- st_filter(precinct_sf, high_coastline, .predicate = st_overlaps)

ggplot() +
  geom_sf(data = precinct_sf, fill = "transparent") +
  geom_sf(data = coast_high_sf) +
  geom_sf(data = high_coastline, color = "blue", fill = "transparent") +
  geom_text_repel(data = coast_high_sf, aes(label = SGG_3, geometry = geometry),
                   stat = "sf_coordinates", min.segment.length = 0, size = 3, 
                   max.overlaps = Inf, box.padding = 1.0) +
  labs(x = "",
       y = "")

코드

coast_high_sf %>% 
  sf::st_drop_geometry() %>% 
  mutate(SGG_3 = str_remove(SGG_3, pattern = '^\\S*\\s')) %>% 
  group_by(시도명 = SGG_1) %>% 
  summarise(선거구수 = n(),
            선거구 = paste0(SGG_3, collapse="|")) %>% 
  arrange(desc(선거구수)) %>% 
  janitor::adorn_totals(where = "row", name = "합계") %>% 
  gt::gt() %>% 
    cols_align(align = "center") %>% 
    gt_theme_538() %>% 
    tab_header(title = "해안선 인접 총선 선거구",
               subtitle = md("`선관위 제21대 선거구 기준`"))
해안선 인접 총선 선거구
선관위 제21대 선거구 기준
시도명 선거구수 선거구
경기 13 김포갑|파주갑|고양을|김포을|파주을|고양병|안산단원갑|안산상록갑|평택을|안산단원을|화성갑|고양정|시흥을
부산 11 해운대갑|북강서을|남구갑|남구을|사하갑|중구영도구|사하을|수영|기장|서구동구|사상
전남 10 순천광양곡성구례을|여수갑|여수을|고흥보성장흥강진|나주화순|영암무안신안|해남완도진도|순천광양곡성구례갑|목포|담양함평영광장성
인천 8 연수갑|연수을|서구갑|중구강화옹진|서구을|남동갑|동구미추홀갑|동구미추홀을
경남 7 창원마산회원|거제|창원성산|통영고성|창원진해|창원마산합포|사천남해하동
충남 7 서산태안|보령서천|공주부여청양|당진|아산갑|아산을|홍성예산
경북 5 경주|군위의성청송영덕|영주영양봉화울진|포항북구|포항남울릉
서울 4 마포을|강서을|강서병|영등포갑
울산 4 북구|남구을|동구|울주
전북 4 김제부안|정읍고창|익산갑|군산
강원 3 강릉|동해태백삼척정선|속초인제고성양양
제주 3 제주을|서귀포|제주갑
합계 79 -