## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(echo = TRUE)

## ----libs, warning = FALSE, message = FALSE-----------------------------------
library(geomander)

library(ggplot2)
library(dplyr)
library(stringr)

library(sf)
library(tinytiger)

## ----results = 'hide', eval = FALSE, message = FALSE--------------------------
# blockRockland <- create_block_table(state = 'NY', county = 'Rockland')
# blockOrange <- create_block_table(state = 'NY', county = 'Orange')
# 
# block <- bind_rows(blockRockland, blockOrange)

## -----------------------------------------------------------------------------
data("orange")
data("rockland")
block <- bind_rows(rockland, orange)

## ----results = 'hide', eval = FALSE, message = FALSE--------------------------
# school <- tt_unified_school_districts(state = 'NY') |> filter(str_detect(NAME, 'North Rockland'))

## -----------------------------------------------------------------------------
data("nrcsd")
school <- nrcsd

## -----------------------------------------------------------------------------
block |> ggplot() + 
  geom_sf() +
  geom_sf(data = school, fill = NA, color = 'red') +
  theme_void()

## -----------------------------------------------------------------------------
block <- block |> geo_filter(to = school)

## -----------------------------------------------------------------------------
block |> mutate(id = row_number()) |> 
  ggplot() + geom_sf() +
  geom_sf(data = school, fill = NA, color = 'red') 

## -----------------------------------------------------------------------------
block$trim <- block |> geo_trim(to = school, bool = TRUE)

block |> ggplot() + geom_sf(aes(fill = trim)) + 
  geom_sf(data = school, fill = NA, lwd = 1.5)

## -----------------------------------------------------------------------------
block <- block |> filter(trim)

## ----data---------------------------------------------------------------------
data("towns")

block |> ggplot() +
  geom_sf() +
  theme_void() +
  geom_sf(data = towns, aes(fill = as.character(ID)))

## -----------------------------------------------------------------------------
matched <- geo_match(from = block, to = towns, method = 'centroid')

## -----------------------------------------------------------------------------
block |> 
  ggplot() +
  geom_sf(aes(fill = as.character(matched))) +
  theme_void() +
  labs(fill = 'Match')

## -----------------------------------------------------------------------------
block <- block |> mutate(TownID = matched) |> 
  mutate(TownID = ifelse(county != '087', 8, TownID)) 

## ----message = FALSE----------------------------------------------------------
adj <- adjacency(shp = block)

comp <- check_contiguity(adj = adj, group = block$TownID)

which(comp$component > 1)

## -----------------------------------------------------------------------------
block$TownID[409] <- 7
block$TownID[586] <- 2
block$TownID[591] <- 4

## -----------------------------------------------------------------------------
comp <- check_contiguity(adj = adj, group = block$TownID)

which(comp$component > 1)

## ----eval = 'redist' %in% installed.packages()--------------------------------
library(redist)
map <- redist_map(block, pop_tol = 0.02, ndists = 7, adj = adj)

sims005 <- redist_smc(map, nsims = 50, counties = TownID, silent = TRUE)

plans <- get_plans_matrix(sims005) |> unique(MARGIN  = 2)

par <- redist.parity(plans = plans, total_pop = block$pop)

comp <- redist.compactness(shp = block, plans = plans, adj = adj, measure = 'EdgesRemoved')

comp_m <- comp |> group_by(draw) |> summarize(mean = mean(EdgesRemoved))

pick <- tibble(parity = par) |> bind_cols(comp_m) |> slice_max(order_by = mean, n = 1) |> pull(draw)

## ----eval = 'redist' %in% installed.packages()--------------------------------
block |> 
  mutate(district = plans[,pick]) |> 
  group_by(district) |> 
  summarize(across(starts_with('vap'), sum))

