---
title: "지도제작 대회"
subtitle: "황해"
description: |
황해를 접한 대한민국 도시를 알아보자.
author:
- name: 이광춘
url: https://www.linkedin.com/in/kwangchunlee/
affiliation: 한국 R 사용자회
affiliation-url: https://github.com/bit2r
title-block-banner: true
format:
html:
theme: flatly
code-fold: true
code-overflow: wrap
toc: true
toc-depth: 3
toc-title: 목차
number-sections: true
highlight-style: github
self-contained: false
default-image-extension: jpg
filters:
- lightbox
lightbox: auto
link-citations: true
knitr:
opts_chunk:
message: false
warning: false
collapse: true
comment: "#>"
R.options:
knitr.graphics.auto_pdf: true
editor_options:
chunk_output_type: console
---
# 해안선
## 전세계 해안선
[참고자료: [Intro to spatial data in R - Open and plot raster and vector data with base plot](https://nceas.github.io/oss-lessons/spatial-data-gis-law/3-mon-intro-gis-in-r.html)]{.aside}
```{r}
library(tidyverse)
library(sf)
# library(rgdal)
# 세계 해안선 shapefile을 불러옵니다.
world_coastline <- st_read("data/ne_10m_coastline/ne_10m_coastline.shp")
plot(st_geometry(world_coastline))
```
## 대한민국
```{r}
# korea_geo_sgg <- gadm("KOR", level=2, path="data/", version="latest", resolution=1) %>%
# st_as_sf()
korea_sgg_geo <- terra::readRDS("data/gadm/gadm41_KOR_2_pk.rds") %>% st_as_sf()
korea_sgg_geo |>
ggplot() +
geom_sf()
```
## 대한민국 해안선
```{r}
korea_coastline <- st_join(korea_sgg_geo, world_coastline, join = st_intersects)
# st_join(korea_sgg_geo, world_coastline, join = st_difference)
plot(st_geometry(korea_coastline))
```
# 경기도
## 시군구
- 총 5 시군구: 김포시, 안산시 단원구, 화성시, 평택시, 시흥시
```{r}
sf_use_s2(FALSE)
admin_sf <- st_read("data/HangJeongDong_ver20230401.geojson")
gg_incheon_sf <- admin_sf %>%
filter(sidonm %in% c("경기도")) %>%
group_by(sidonm, sggnm) %>%
summarize(geometry = st_union(geometry)) %>%
mutate(바다인접 = ifelse(str_detect(sggnm, "김포|안산|화성|평택|시흥"), "바다인접", "비인접")) %>%
ungroup()
gg_incheon_sf %>%
ggplot() +
geom_sf(aes(fill=바다인접), linewidth = 0.1) +
ggrepel::geom_text_repel(
aes(label = sggnm, geometry = geometry), stat = "sf_coordinates",
min.segment.length = 1, size = 3
) +
theme_void() +
scale_fill_manual(values = c("gray95", "skyblue")) +
labs(title = "경기도 바다인접 시군구",
fill = "바다인접 여부")
```
## 항구
- 공공데이터 [해양수산부 항만정보](https://www.data.go.kr/data/15088273/fileData.do)
```{r}
ports <- read_csv("data/해양수산부_항만정보_20210105.csv",locale=locale('ko',encoding='euc-kr'))
ports %>%
filter(str_detect(항만위치, "^경기"))
```
```{r}
fishing_sf <- st_read("data/해양경찰청_낚시어선 출입항 항포구 위치정보_20221129/D159-6.낚시어선 출입항 항포구 위치정보_v1.0.shp")
fishing_sf <- st_transform(fishing_sf, crs = st_crs(gg_incheon_sf))
fishing_sf %>%
ggplot() +
geom_sf() +
ggrepel::geom_text_repel(
aes(label = DEPART_NM, geometry = geometry), stat = "sf_coordinates",
min.segment.length = 1, size = 3
) +
theme_void() +
labs(title = "해양경찰청 낚시어선 출입항")
```
## 경기도 X 낚시항포구
```{r}
# gg_incheon_sf %>%
# st_touches(fishing_sf %>% select(DEPART_NM, geometry), left=FALSE)
gg_fishing_sf <- st_crop(fishing_sf, xmin = 126.3797, xmax = 127.8495,
ymin = 36.893530, ymax = 38.29204)
ggplot() +
geom_sf(data = gg_incheon_sf) +
geom_sf(data = gg_fishing_sf, color = "red") +
ggrepel::geom_text_repel(
data = gg_fishing_sf,
aes(label = DEPART_NM, geometry = geometry), stat = "sf_coordinates",
min.segment.length = 1, size = 3
) +
theme_void() +
labs(title = "해양경찰청 낚시어선 출입항")
```
## 경기도 X 어촌어항
- [해양수산부 어촌어항관리시스템](https://naraport.mof.go.kr/)
```{r}
library(readxl)
library(tidyverse)
library(httr)
library(jsonlite)
## 국가어항
nport_raw <- read_excel("data/어촌어항.xlsx", sheet = "국가어항", skip = 2)
ggport_tbl <- nport_raw %>%
janitor::clean_names(ascii = FALSE) %>%
filter(str_detect(주소, "^경기")) %>%
mutate(주소 = ifelse(어항_명 == "제부항", "경기도 화성시 서신면 제부리 289-20", 주소))
```
```{r}
#| eval: false
get_lonlat <- function(address) {
address_resp <- GET(url = 'https://dapi.kakao.com/v2/local/search/address.json',
query = list(query = address),
add_headers(Authorization = paste0("KakaoAK ", Sys.getenv("DAUM_MAP_API_KEY"))))
address_list <- address_resp %>%
content(as = 'text') %>%
fromJSON()
address_tbl <- address_list$documents$road_address %>%
dplyr::select(x,y) %>%
mutate(x = as.numeric(x),
y = as.numeric(y))
return(address_tbl)
}
# get_lonlat(kpmg_addr)
safely_get_lonlat <- safely(get_lonlat, otherwise = "error")
ggport_geo <- ggport_tbl %>%
mutate(data = map(주소, safely_get_lonlat))
# get_lonlat(ggport_tbl$주소[5])
# get_lonlat("경기도 화성시 서신면 제부리 289-20")
ggport_geo <- ggport_geo %>%
mutate(lonlat = map(data, "result")) %>%
mutate(lonlat = ifelse(어항_명 == "제부항", list(data.frame(x = 126.6228811, y=37.1795305)), lonlat)) %>%
mutate(lon = map(lonlat, select, x) %>% unlist,
lat = map(lonlat, select, y) %>% unlist)
ggport_geo %>%
write_rds("data/ggport_geo.rds")
```
```{r}
ggport_geo <- read_rds("data/ggport_geo.rds")
ggport_geo_sf <- ggport_geo %>%
sf::st_as_sf(coords = c("lon", "lat"), crs = 4326, agr = "constant")
ggplot() +
geom_sf(data = gg_incheon_sf, aes(fill = 바다인접), linewidth = 0.1, show.legend = FALSE) +
geom_sf(data = ggport_geo_sf, aes(color = 어항_종류)) +
ggrepel::geom_text_repel(
data = ggport_geo_sf,
aes(label = 어항_명, geometry = geometry), stat = "sf_coordinates",
min.segment.length = 1, size = 3
) +
theme_void() +
labs(title = "경기도 국가/지방어항 현황",
color = "어항 종류") +
ggrepel::geom_text_repel(
data = gg_incheon_sf,
aes(label = sggnm, geometry = geometry), stat = "sf_coordinates",
min.segment.length = 1, size = 3, show.legend = FALSE
) +
scale_fill_manual(values = c("skyblue", "gray95")) +
scale_color_manual(values = c("지방어항" = "blue", "국가어항" = "red",
"바다인접" = "black", "비인접" = "orange"))
```
# 5 구시군 투개표
## 대선 (2022년)
:::{.panel-tabset}
### 득표수
```{r}
library(krvote)
library(janitor)
library(gt)
library(gtExtras)
ggport_sgg <- krvote::election_20220309$득표율 %>%
filter( str_detect(시도명, "^경기"),
str_detect(구시군명, "^화성|^평택|^김포|^안산시단원구|^시흥"))
ggport_sgg_table <- ggport_sgg %>%
pivot_longer(이재명:계, names_to = "후보", values_to = "득표") %>%
group_by(구시군명, 후보) %>%
summarise(득표 = sum(득표)) %>%
filter(후보 != "계") %>%
ungroup() %>%
mutate(후보 = case_when( 후보 == "윤석열" ~ "국민의힘",
후보 == "이재명" ~ "민주당",
TRUE ~ "기타")) %>%
group_by(구시군명, 후보) %>%
summarise( 득표 = sum(득표)) %>%
ungroup() %>%
pivot_wider(names_from = 후보, values_from = 득표) %>%
janitor::adorn_totals(where = "col", name = "합계")
ggport_sgg_table %>%
relocate(기타, .before = 합계) %>%
gt() %>%
fmt_integer(columns = 국민의힘:합계) %>%
cols_align(columns = 구시군명, align = "center") %>%
tab_spanner(
label = "대선 후보 정당",
columns = c(국민의힘, 민주당, 기타)
) %>%
gt_theme_538() %>%
tab_header(
title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
subtitle = md("`제20대 대통령선거`")
) %>%
tab_style(
style = list(cell_fill(color = "blue"),
cell_text(color = "white")),
locations = cells_body(columns = 민주당,
rows = 민주당 > 국민의힘)
) %>%
tab_style(
style = list(cell_fill(color = "red"),
cell_text(color = "white")),
locations = cells_body(columns = 국민의힘,
rows = 민주당 < 국민의힘)
)
```
### 득표율
```{r}
ggport_sgg_table %>%
adorn_percentages() %>%
gt::gt() %>%
fmt_percent(columns = 국민의힘:합계, decimals = 1) %>%
cols_align(columns = 구시군명, align = "center") %>%
tab_spanner(
label = "대선 후보 정당",
columns = c(국민의힘, 민주당, 기타)
) %>%
gt_theme_538() %>%
tab_header(
title = md("경기도 서해 인접 5개 구시군 정당별 득표율(%)"),
subtitle = md("`제20대 대통령선거`")
) %>%
tab_style(
style = list(cell_fill(color = "blue"),
cell_text(color = "white")),
locations = cells_body(columns = 민주당,
rows = 민주당 > 국민의힘)
) %>%
tab_style(
style = list(cell_fill(color = "red"),
cell_text(color = "white")),
locations = cells_body(columns = 국민의힘,
rows = 민주당 < 국민의힘)
)
```
:::
## 총선 (2020년)
:::{.panel-tabset}
### 득표수
```{r}
library(stringi)
general_sgg <- krvote::general_2020 %>%
filter( str_detect(시도, "^경기"),
str_detect(선거구, "^화성|^평택|^김포|^안산시단원구|^시흥"))
general_sgg_table <- general_sgg %>%
unnest(data) %>%
## CP949 인코딩 처리
mutate(구분_cp949 = iconv(구분, "euc-kr", "utf-8")) %>%
mutate(구분 = ifelse(is.na(구분_cp949), 구분, 구분_cp949)) %>%
group_by(선거구, 구분) %>%
summarise( 득표 = sum(사람수)) %>%
filter(구분 != "무표투표수",
구분 != "기권수",
구분 != "선거인수",
구분 != "투표수",
구분 != "계") %>%
ungroup() %>%
mutate(구분 = case_when( str_detect(구분, "민주당") ~ "민주당",
str_detect(구분, "미래통합") ~ "국민의힘",
TRUE ~ "기타")) %>%
group_by(선거구, 구분) %>%
summarise(득표 = sum(득표)) %>%
ungroup() %>%
pivot_wider(names_from = 구분, values_from = 득표) %>%
janitor::adorn_totals(where = "col", name = "합계")
general_sgg_table %>%
relocate(기타, .before = 합계) %>%
gt() %>%
fmt_integer(columns = 국민의힘:합계) %>%
cols_align(columns = 선거구, align = "center") %>%
tab_spanner(
label = "대선 후보 정당",
columns = c(국민의힘, 민주당, 기타)
) %>%
gt_theme_538() %>%
tab_header(
title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
subtitle = md("`제21대 국회의원선거`")
) %>%
tab_style(
style = list(cell_fill(color = "blue"),
cell_text(color = "white")),
locations = cells_body(columns = 민주당,
rows = 민주당 > 국민의힘)
) %>%
tab_style(
style = list(cell_fill(color = "red"),
cell_text(color = "white")),
locations = cells_body(columns = 국민의힘,
rows = 민주당 < 국민의힘)
)
```
### 득표율
```{r}
general_sgg_table %>%
adorn_percentages() %>%
gt::gt() %>%
fmt_percent(columns = 국민의힘:합계, decimals = 1) %>%
cols_align(columns = 선거구, align = "center") %>%
tab_spanner(
label = "대선 후보 정당",
columns = c(국민의힘, 민주당, 기타)
) %>%
gt_theme_538() %>%
tab_header(
title = md("경기도 서해 인접 5개 구시군 정당별 득표율(%)"),
subtitle = md("`제21대 국회의원선거`")
) %>%
tab_style(
style = list(cell_fill(color = "blue"),
cell_text(color = "white")),
locations = cells_body(columns = 민주당,
rows = 민주당 > 국민의힘)
) %>%
tab_style(
style = list(cell_fill(color = "red"),
cell_text(color = "white")),
locations = cells_body(columns = 국민의힘,
rows = 민주당 < 국민의힘)
)
```
:::
## 지선 - 도지사 (2022년)
:::{.panel-tabset}
### 득표수
```{r}
local_sido_raw <- krvote::local_sido_20220601 %>%
filter(str_detect(선거구명, "^경기")) %>%
unnest(data) %>%
filter(str_detect(구시군명, "^화성|^평택|^김포|^안산시단원구|^시흥")) %>%
pivot_longer(더불어민주당_김동연:기권수) %>%
separate(name, into = c("정당", "후보"), sep = "_") %>%
filter(!is.na(후보)) %>%
group_by(구시군명, 정당) %>%
summarise(득표 = sum(value)) %>%
ungroup()
local_sido_table <- local_sido_raw %>%
mutate(정당 = case_when( str_detect(정당, "민주당") ~ "민주당",
str_detect(정당, "국민의힘") ~ "국민의힘",
TRUE ~ "기타")) %>%
group_by(구시군명, 정당) %>%
summarise(득표 = sum(득표)) %>%
ungroup() %>%
pivot_wider(names_from = 정당, values_from = 득표) %>%
janitor::adorn_totals(where = "col", name = "합계")
local_sido_table %>%
relocate(기타, .before = 합계) %>%
gt() %>%
fmt_integer(columns = 국민의힘:합계) %>%
cols_align(columns = 구시군명, align = "center") %>%
tab_spanner(
label = "지방선거 도지사 후보 정당",
columns = c(국민의힘, 민주당, 기타)
) %>%
gt_theme_538() %>%
tab_header(
title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
subtitle = md("`제8대 지방선거`")
) %>%
tab_style(
style = list(cell_fill(color = "blue"),
cell_text(color = "white")),
locations = cells_body(columns = 민주당,
rows = 민주당 > 국민의힘)
) %>%
tab_style(
style = list(cell_fill(color = "red"),
cell_text(color = "white")),
locations = cells_body(columns = 국민의힘,
rows = 민주당 < 국민의힘)
)
```
### 득표율
```{r}
local_sido_table %>%
adorn_percentages() %>%
gt::gt() %>%
fmt_percent(columns = 국민의힘:합계, decimals = 1) %>%
cols_align(columns = 구시군명, align = "center") %>%
tab_spanner(
label = "지방선거 도지사 후보 정당",
columns = c(국민의힘, 민주당, 기타)
) %>%
gt_theme_538() %>%
tab_header(
title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
subtitle = md("`제8대 지방선거`")
) %>%
tab_style(
style = list(cell_fill(color = "blue"),
cell_text(color = "white")),
locations = cells_body(columns = 민주당,
rows = 민주당 > 국민의힘)
) %>%
tab_style(
style = list(cell_fill(color = "red"),
cell_text(color = "white")),
locations = cells_body(columns = 국민의힘,
rows = 민주당 < 국민의힘)
)
```
:::
## 지선 - 구시군장 (2022년)
:::{.panel-tabset}
### 득표수
```{r}
local_sgg_raw <- krvote::local_sgg_20220601 %>%
filter(str_detect(시도명, "^경기")) %>%
filter(str_detect(구시군명, "^화성|^평택|^김포|^안산|^시흥")) %>%
mutate(득표 = parse_number(득표)) %>%
group_by(구시군명, 정당) %>%
summarise(득표 = sum(득표)) %>%
ungroup()
local_sgg_table <- local_sgg_raw %>%
mutate(정당 = case_when( str_detect(정당, "민주당") ~ "민주당",
str_detect(정당, "국민의힘") ~ "국민의힘",
TRUE ~ "기타")) %>%
group_by(구시군명, 정당) %>%
summarise(득표 = sum(득표, na.rm = TRUE)) %>%
ungroup() %>%
pivot_wider(names_from = 정당, values_from = 득표, values_fill = 0) %>%
janitor::adorn_totals(where = "col", name = "합계")
local_sgg_table %>%
relocate(기타, .before = 합계) %>%
gt() %>%
fmt_integer(columns = 국민의힘:합계) %>%
cols_align(columns = 구시군명, align = "center") %>%
tab_spanner(
label = "지방선거 구시군의 장 후보 정당",
columns = c(국민의힘, 민주당, 기타)
) %>%
gt_theme_538() %>%
tab_header(
title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
subtitle = md("`제8대 지방선거`")
) %>%
tab_style(
style = list(cell_fill(color = "blue"),
cell_text(color = "white")),
locations = cells_body(columns = 민주당,
rows = 민주당 > 국민의힘)
) %>%
tab_style(
style = list(cell_fill(color = "red"),
cell_text(color = "white")),
locations = cells_body(columns = 국민의힘,
rows = 민주당 < 국민의힘)
)
```
### 득표율
```{r}
local_sgg_table %>%
adorn_percentages() %>%
gt::gt() %>%
fmt_percent(columns = 국민의힘:합계, decimals = 1) %>%
cols_align(columns = 구시군명, align = "center") %>%
tab_spanner(
label = "지방선거 구시군의 장 후보 정당",
columns = c(국민의힘, 민주당, 기타)
) %>%
gt_theme_538() %>%
tab_header(
title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
subtitle = md("`제8대 지방선거`")
) %>%
tab_style(
style = list(cell_fill(color = "blue"),
cell_text(color = "white")),
locations = cells_body(columns = 민주당,
rows = 민주당 > 국민의힘)
) %>%
tab_style(
style = list(cell_fill(color = "red"),
cell_text(color = "white")),
locations = cells_body(columns = 국민의힘,
rows = 민주당 < 국민의힘)
)
```
:::