---
title: "Wisconsin Cycling to School"
output:
  html_document:
    toc: true
    toc_depth: 5
    toc_float:
      collapsed: false
      smooth_scroll: true
editor_options:
  chunk_output_type: console
---

# Input Data & Configuration

## Libraries

```{r libs, eval = TRUE, echo = FALSE, results = "show", warning = FALSE, error = TRUE, message = FALSE}
date()
rm(list=ls())
library(tidyverse)
library(ggmap)
library(sf)
library(osrm)
library(smoothr)
library(magick)
library(ggnewscale)
library(rsvg)
library(httr)
library(jsonlite)
library(parallel)
fig.height <- 6
set.seed(1)
source("./R/functions.R")
runLoop <- TRUE
```

## Configuration

```{r config, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE}
options(osrm.server = "http://127.0.0.1:5001/")
options(osrm.profile = "bike")
brouter_url <- "http://127.0.0.1:17777/brouter"
brouter_profile <- "safety"
register_stadiamaps(key = substr(read_file(file = "api_keys/stadia_api_key"), 1, 36))
WI_schools <- st_transform(st_read(dsn = "data/Schools/Wisconsin_Public_Schools_-5986231931870160084.gpkg"), crs = 4326)
WI_schools <- WI_schools %>% mutate(geom = SHAPE)
```

## Subset Schools

```{r subsetSchools, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE}
WI_schools <- subset(WI_schools, !is.na(LAT) & !is.na(LON) & GRADE_RANGE == "09-12")
```

Non-virtual, grades 9-12.

## Loop through WI Schools

```{r mainloop, eval = runLoop, echo = FALSE, results = "show", warning = FALSE, error = TRUE, message = TRUE}
radius <- 3 # miles
levels <- c(1)
res <- 100
threshold <- units::set_units(1, km^2)

gridList <- list()
routesList <- list()

indexVec <- 1:nrow(WI_schools)
#indexVec <- 1:50
jj <- 1;
bad.school.vec <- c()

for(j in indexVec){

    school_location <- WI_schools[j,]

    cycle_boundary_m <- radius*1609
    cycle_boundary_poly <- osrmIsodistance( loc = school_location, breaks = cycle_boundary_m, res = res )
    cycle_boundary_poly <- st_make_valid(cycle_boundary_poly)
    cycle_boundary_poly <- fill_holes(cycle_boundary_poly, threshold)
    cycle_boundary_poly <- st_transform(cycle_boundary_poly, crs = 4326)

    cellsize <- 1e-2
    grid <- st_make_grid(cycle_boundary_poly, cellsize = cellsize, what = "polygons", square = FALSE)
    grid <- st_intersection(cycle_boundary_poly, grid)

    grid <- st_make_valid(grid)

    grid_pts <- st_centroid(grid)

    grid_coods <- st_coordinates(grid_pts)
    school_focus_location <- school_location %>% select(LAT, LON)

    routes <- list(NULL)
    for(i in 1:nrow(grid_coods) ) {
        query <- paste0(
            brouter_url,
            "?lonlats=", grid_coods[i,1], ",",grid_coods[i,2], "|",
            school_focus_location$LON, ",", school_focus_location$LAT,
            "&profile=", brouter_profile,
            "&alternativeidx=0&format=geojson"
        )
        response <- GET(query)

        if( response$status_code == "200" ){
            route_run <- st_read(content <- content(response, as = "text"), quiet = TRUE)
            routes[[i]] <- route_run
        }else{
            routes[[i]] <- NA
        }
    }

    bad.cell <- which(is.na(routes))

    if(length(bad.cell) > 0){
        routes <- routes[-bad.cell]
        grid <- grid[-bad.cell,]
    }

    if(length(routes) > 0){
        routes <- st_transform(bind_rows(routes), crs = 4326)
        gridList[[jj]] <- grid
        routesList[[jj]] <- routes
        jj <- jj + 1
    }else{
        routes <- NA
        bad.school.vec <- c(j, bad.school.vec)
        cat( WI_schools$SCHOOL[j], "has zero routes to school and has been removed from analysis.\n")
    }

}

WI_schools <- WI_schools[-bad.school.vec,]

saveRDS(WI_schools, "./R/data/WI_schools.rds")
saveRDS(gridList, "./R/data/gridList.rds")
saveRDS(routesList, "./R/data/routesList.rds")
```

```{r showLists, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE}
routesList <- readRDS(file = "./R/data/routesList.rds")
gridList <- readRDS(file = "./R/data/gridList.rds")

not.cycleway.vec <- c()

for(j in 1:length(gridList)){

    grid <- gridList[[j]]
    routes <- routesList[[j]]

    total.time.vec <- routes %>% pull(total.time)
    grid <- cbind(grid, total.time = as.numeric(total.time.vec))

    x.vec <- c()
    for( i in 1:nrow(grid) ){
        route <- routes[i,"messages"] # Grid cell i to school j
        x <- routeChar(route)
        x.vec <- c(x.vec, x)
    }

    grid <- cbind(grid, T.cycleway = x.vec)
    grid <- cbind( grid, not.cycleway = (grid$total.time - grid$T.cycleway)/60)
    gridList[[j]] <- grid

    not.cycleway.vec <- c(not.cycleway.vec, median(grid$not.cycleway))

}

ggplot(data.frame(not.cycleway = not.cycleway.vec), aes(not.cycleway)) + geom_histogram(fill = "grey", color = "black") + theme_bw()
```

# Archive

```{r chunklast, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE}
date()
sessionInfo()
```
