## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  message = FALSE, 
  warning = FALSE,
  fig.height = 7,  
  fig.width = 7,
  dpi = 75
)

## ----eval = FALSE-------------------------------------------------------------
# # install from CRAN
# install.packages("geofi")
# 
# # Install development version from GitHub
# remotes::install_github("ropengov/geofi")

## ----include = FALSE, eval = TRUE---------------------------------------------
# Let's first create a function that checks if the suggested 
# packages are available
check_namespaces <- function(pkgs){
  return(all(unlist(sapply(pkgs, requireNamespace,quietly = TRUE))))
}
apiacc <- geofi::check_api_access()
pkginst <- check_namespaces(c("sf","dplyr","patchwork","ggplot2"))
apiacc_pkginst <- all(apiacc,pkginst)

## ----eval = apiacc_pkginst----------------------------------------------------
library(geofi)
library(sf)
library(dplyr)
muni <- get_municipalities()
point <- municipality_central_localities()
crs <- st_crs(muni)
crs$input

## ----crss, eval = apiacc_pkginst----------------------------------------------
muni_4326 <- st_transform(muni, "EPSG:4326")
crs <- st_crs(muni_4326)
crs$input

library(ggplot2)
  
p1 <- ggplot(muni |> st_union()) + 
  geom_sf() + 
  labs(subtitle = "EPSG:3067")
p2 <- ggplot(muni_4326 |> st_union()) + 
  geom_sf() +
  labs(subtitle = "EPSG:4326")
library(patchwork)
wrap_plots(list(p1,p2), nrow = 1) +
  plot_annotation(title = "Map of Finland in two different CRS")

## ----largest, fig.width=5, eval = apiacc_pkginst------------------------------
# compute area
muni$area <- sf::st_area(muni)
# largest
muni |> 
  arrange(desc(area)) |> 
  slice(1:10) |> 
  ggplot() + 
  geom_sf() + 
  geom_sf_label(aes(label = name_fi)) +
  labs(title = "largest 10")
  # smallest
muni |> 
  arrange(area) |> 
  slice(1:10) |> 
  ggplot() + 
  geom_sf() + 
  geom_sf_label(aes(label = name_fi)) +
  labs(title = "smallest 10")


## ----subsetting, eval = apiacc_pkginst----------------------------------------
greater_helsinki <- c('Espoo','Helsinki','Vantaa','Hyvinkää',
                      'Järvenpää','Kauniainen','Kerava','Kirkkonummi',
                      'Mäntsälä','Nurmijärvi','Pornainen','Sipoo','Tuusula','Vihti')
greater_helsinki_polygon <- muni |> filter(municipality_name_fi %in% greater_helsinki)

ggplot(greater_helsinki_polygon) + 
  geom_sf() +
  geom_sf(data = point |> 
            filter(teksti %in% toupper(greater_helsinki)))

## ----bb_poly, eval = apiacc_pkginst-------------------------------------------
bounding_box_polygon <- st_as_sfc(st_bbox(muni |> filter(municipality_name_fi %in% greater_helsinki)))

ggplot(st_intersection(bounding_box_polygon, muni)) + 
  geom_sf() +
  geom_sf(data = point |> filter(teksti %in% toupper(greater_helsinki)))

## ----bb_point, eval = apiacc_pkginst------------------------------------------
bounding_box_point <- st_as_sfc(st_bbox(point |> filter(teksti %in% toupper(greater_helsinki))))

ggplot(st_intersection(bounding_box_point, muni)) + 
  geom_sf() +
  geom_sf(data = point |> filter(teksti %in% toupper(greater_helsinki)))

## ----neighbours,  fig.height = 5, eval = apiacc_pkginst-----------------------
helsinki <- muni |>  filter(municipality_name_fi == "Helsinki")
neigbour_codes <- st_intersection(muni,helsinki) |> 
  pull(municipality_code)

ggplot(muni |> filter(municipality_code %in% neigbour_codes)) +
  geom_sf() +
  geom_sf_label(aes(label = municipality_name_fi))

## ----unioin, eval = apiacc_pkginst--------------------------------------------
muni$area_class <- cut_number(x = as.numeric(muni$area), n = 3)

muni |> 
  filter(area_class == levels(muni$area_class)[1]) |> 
  st_union() |> 
  ggplot() +
  geom_sf()

## ----union2, eval = apiacc_pkginst--------------------------------------------
muni |> 
  group_by(area_class) |>
  summarise() |> 
  ggplot() +
  geom_sf(aes(fill = area_class))

## ----centroids, fig.width=5, eval = apiacc_pkginst----------------------------
muni_centroids <- st_centroid(muni)

ggplot() +
  geom_sf(data = muni) +
  geom_sf(data = muni_centroids, color = "blue") +
  # plot also the municipality_central_localities
  geom_sf(data = municipality_central_localities(), color = "red")


## ----buffers, fig.width=5, eval = apiacc_pkginst------------------------------
muni_centroids_buffer <- muni_centroids |>
    st_buffer(dist = 15000)

ggplot() +
  geom_sf(data = muni) +
  geom_sf(data = muni_centroids_buffer) +
  geom_sf(data = muni_centroids, shape = 3)

## ----muonio, fig.width=5, eval = apiacc_pkginst-------------------------------
muonio <- muni |> filter(municipality_name_fi == "Muonio")

grid_sf <- st_make_grid(muonio, cellsize = c(2000,4000), what="polygons") |>
    st_sf()

grid_clip <- st_intersection(grid_sf, muonio)
grid_clip$rank <- 1:nrow(grid_clip)

ggplot(grid_clip) +
  geom_sf(aes(fill = rank), color = alpha("white", 1/3), size = 3) +
  scale_fill_viridis_c() +
  theme_minimal()

## ----voronoi, fig.height = 9, eval = apiacc_pkginst---------------------------
library(geofi)
library(sf)

muni_voronoi <- municipality_central_localities() |> 
  st_union() |>
  st_voronoi() |> 
  st_cast() |> 
  st_sf() |> 
  st_intersection(st_union(muni)) |> 
  mutate(rnk = 1:n())

ggplot(muni_voronoi) + 
  geom_sf(aes(fill = rnk)) +
  geom_sf(data = municipality_central_localities(), shape = 4) +
  scale_fill_fermenter(palette = "YlGnBu") +
  theme_minimal() +
  theme(axis.text = element_blank(),
        axis.title = element_blank(),
        panel.grid = element_blank(),
        legend.position = "none")

## ----kunnat, eval = apiacc_pkginst--------------------------------------------
kunta <- geofi::municipality_central_localities() |>  
  select(teksti,kuntatunnus) |>
  mutate(kuntatunnus = as.integer(kuntatunnus)) |>
  select(-teksti) |>
  left_join(geofi::municipality_key_2025 |> select(municipality_code, municipality_name_fi),
            by = c("kuntatunnus" = "municipality_code")) |>
  rename(teksti = municipality_name_fi)
kunta

## ----dmatrix, eval = apiacc_pkginst-------------------------------------------
d_list <- list()
kuntadatan_teksti_ja_kuntatunnus <- sf::st_drop_geometry(kunta) |>
  select(teksti,kuntatunnus)
for (i in 1:nrow(kunta)){
  dist_tmp <- sf::st_distance(x = kunta[i,], y =  kunta)
  tibble(origin_name = kunta[i,]$teksti,
         origin_code = kunta[i,]$kuntatunnus) |>
    bind_cols(kuntadatan_teksti_ja_kuntatunnus |> rename(destination_name = teksti,
                                                          destination_code = kuntatunnus)) |>
    mutate(dist = dist_tmp[1,]) -> d_list[[i]]
}
kunta_dist <- do.call("bind_rows", d_list) |>
  mutate(dist = as.numeric(dist))
head(kunta_dist)

## ----nearest, eval = apiacc_pkginst-------------------------------------------
ggplot(kunta_dist |>
         filter(origin_name == "Helsinki") |>
         arrange(dist) |> slice(1:20),
       aes(x = dist, y = reorder(destination_name, dist), label = round(dist))) +
         geom_col() + geom_text(aes(x = 1000), color = "white", hjust = 0) +
  labs(title = "Nearest 20 municipality localities to Helsinki", x = "distance in meters")

## ----dist0, eval = apiacc_pkginst---------------------------------------------
# We firt need the country map as a single polygon
geofi::get_municipalities() |> 
  sf::st_union() |> 
  # then we need to compute the centroid of that polygon
  sf::st_centroid() -> fin_centroid

# The let's find the nearest neighbour with
distance <- st_distance(x = fin_centroid, y = kunta)
kuntadatan_teksti_ja_kuntatunnus |> 
  mutate(dist = as.numeric(distance)) |> 
  arrange(dist) -> closest_to_center
head(closest_to_center)

## ----dist1, eval = apiacc_pkginst---------------------------------------------
furthest20 <- kunta_dist |>
         filter(origin_name == closest_to_center[1,]$teksti) |>
         arrange(desc(dist)) |> slice(1:20)
ggplot(furthest20,
       aes(x = dist, y = reorder(destination_name, dist), label = round(dist))) +
  geom_col() + geom_text(aes(x = 10000), color = "white", hjust = 0) +
  labs(title = paste("Furthest 20 municipality localities \nfrom the most central locality of ", closest_to_center[1,]$teksti), x = "distance in meters")

## ----dist2, eval = apiacc_pkginst---------------------------------------------
sf_lahto <- kunta |> 
  filter(teksti %in% closest_to_center[1,]$teksti) |>
  select(teksti)
sf_paate <- kunta |> 
  filter(teksti %in% furthest20$destination_name) |> 
  select(teksti)

triplst <- list()
for (i in 1:nrow(sf_paate)){
triplst[[i]] <- rbind(
  sf_lahto,
  sf_paate[i,]
) |> 
  summarize(m = mean(row_number()),do_union=FALSE) |> 
  st_cast("LINESTRING")
}
trips <- do.call("rbind", triplst)

ggplot() +
  geom_sf(data = muni |> st_union(), alpha = .3) +
  geom_sf(data = trips, color = "dim grey") +
  geom_sf_label(data = sf_lahto, aes(label = teksti)) +
  geom_sf_text(data = sf_paate, aes(label = teksti))

