Merge pull request #18 from syounkin/sgy
Created New Script route_to_school.Rmd
This commit is contained in:
		
						commit
						bfa8e3880f
					
				
					 5 changed files with 493 additions and 1 deletions
				
			
		
							
								
								
									
										8
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										8
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -2,7 +2,7 @@ all: data containers cycle | ||||||
| 
 | 
 | ||||||
| data: osrm-data brouter-data | data: osrm-data brouter-data | ||||||
| containers: osrm-container brouter-container | containers: osrm-container brouter-container | ||||||
| cycle: cycle_brouter | cycle: WI-schools-cycle | ||||||
| 
 | 
 | ||||||
| walk: route_analysis.Rmd | walk: route_analysis.Rmd | ||||||
| 	R -e 'library("rmarkdown"); old_path <- Sys.getenv("PATH"); Sys.setenv(PATH = paste(old_path, "/usr/local/bin", sep = ":")); rmarkdown::render(knit_root_dir = "./", output_dir = "./html", input = "./route_analysis.Rmd", output_file = "./html/route_analysis.html")' | 	R -e 'library("rmarkdown"); old_path <- Sys.getenv("PATH"); Sys.setenv(PATH = paste(old_path, "/usr/local/bin", sep = ":")); rmarkdown::render(knit_root_dir = "./", output_dir = "./html", input = "./route_analysis.Rmd", output_file = "./html/route_analysis.html")' | ||||||
|  | @ -13,6 +13,12 @@ cycle_osrm: cycling_route_analysis.Rmd | ||||||
| cycle_brouter: cycling_route_analysis_brouter.Rmd | cycle_brouter: cycling_route_analysis_brouter.Rmd | ||||||
| 	R -e 'library("rmarkdown"); old_path <- Sys.getenv("PATH"); Sys.setenv(PATH = paste(old_path, "/usr/local/bin", sep = ":")); rmarkdown::render(knit_root_dir = "./", output_dir = "./html", input = "./cycling_route_analysis_brouter.Rmd", output_file = "./html/cycling_route_analysis.html")' | 	R -e 'library("rmarkdown"); old_path <- Sys.getenv("PATH"); Sys.setenv(PATH = paste(old_path, "/usr/local/bin", sep = ":")); rmarkdown::render(knit_root_dir = "./", output_dir = "./html", input = "./cycling_route_analysis_brouter.Rmd", output_file = "./html/cycling_route_analysis.html")' | ||||||
| 
 | 
 | ||||||
|  | route_to_school: route_to_school.Rmd | ||||||
|  | 	R -e 'library("rmarkdown"); old_path <- Sys.getenv("PATH"); Sys.setenv(PATH = paste(old_path, "/usr/local/bin", sep = ":")); rmarkdown::render(knit_root_dir = "./", output_dir = "./html", input = "./route_to_school.Rmd", output_file = "./html/route_to_school.html")' | ||||||
|  | 
 | ||||||
|  | WI-schools-cycle: WI-schools-cycle.Rmd | ||||||
|  | 	R -e 'library("rmarkdown"); old_path <- Sys.getenv("PATH"); Sys.setenv(PATH = paste(old_path, "/usr/local/bin", sep = ":")); rmarkdown::render(knit_root_dir = "./", output_dir = "./html", input = "./WI-schools-cycle.Rmd", output_file = "./html/WI-schools-cycle.html")' | ||||||
|  | 
 | ||||||
| osrm-container: ./docker/osrm/docker-compose.yml | osrm-container: ./docker/osrm/docker-compose.yml | ||||||
| 	cd ./docker/osrm/; docker compose up -d | 	cd ./docker/osrm/; docker compose up -d | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								R/data/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								R/data/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | ||||||
|  | # Ignore everything in this directory | ||||||
|  | * | ||||||
|  | # Except this file | ||||||
|  | !.gitignore | ||||||
|  | @ -32,3 +32,60 @@ getLTSForRoute <- function(i, route_table) { | ||||||
| 
 | 
 | ||||||
|   return(result) |   return(result) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | routeChar <- function(route){ | ||||||
|  | 
 | ||||||
|  |     if(is.na(route$messages)){ | ||||||
|  |         return(NA) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     text <- route$messages | ||||||
|  |     text <- gsub(x = text, pattern = "\\\"", replacement = "") | ||||||
|  |     text <- gsub(x = text, pattern = "\ ", replacement = "") | ||||||
|  |     text <- gsub(x = text, pattern = "\\[\\[", replacement = "") | ||||||
|  |     text <- gsub(x = text, pattern = "\\]\\]", replacement = "") | ||||||
|  |     foobar <- strsplit(text, split = "],[", fixed = TRUE) | ||||||
|  |     x <- lapply(foobar, function(x){strsplit(x, split = ",", fixed = TRUE)}) | ||||||
|  |     xx <- unlist(x) | ||||||
|  |     m <- matrix(xx, ncol = 13, byrow = TRUE) | ||||||
|  |     names.vec <- m[1,] | ||||||
|  | 
 | ||||||
|  |     if(nrow(m) == 2){ | ||||||
|  |         df <- data.frame(t(m[-1,])) | ||||||
|  |     }else{ | ||||||
|  |         df <- data.frame(m[-1,]) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     names(df) <- names.vec | ||||||
|  | 
 | ||||||
|  |     df2 <- within(df, { | ||||||
|  |         Time <- as.numeric(Time) | ||||||
|  |         stageTime <- diff(c(0,Time)) | ||||||
|  |         path <- grepl("highway=path", df$WayTags) | ||||||
|  |         residential <- grepl("highway=residential", df$WayTags) | ||||||
|  |         footway <- grepl("highway=footway", df$WayTags) | ||||||
|  |         primary <- grepl("highway=primary", df$WayTags) | ||||||
|  |         service <- grepl("highway=service", df$WayTags) | ||||||
|  |         cycleway <- grepl("highway=cycleway", df$WayTags) | ||||||
|  |         bike <- grepl("bicycle=designated", df$WayTags) | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     foo <- function(x){ | ||||||
|  |         ifelse(x$path, "path", ifelse(x$residential, "residential", ifelse(x$footway, "footway", ifelse(x$primary, "primary", ifelse(x$service, "service", ifelse(x$cycleway, "cycleway", "other")))))) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     df2 <- cbind(df2, highway = foo(df2)) | ||||||
|  |     df2 <- df2 %>% group_by(highway) %>% summarize(T = sum(stageTime)) | ||||||
|  | 
 | ||||||
|  |     df2 <- df2 %>% filter(!is.na(highway)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(!("cycleway" %in% df2$highway)){ | ||||||
|  |         return(0) | ||||||
|  |     }else{ | ||||||
|  |         return(df2[df2$highway == "cycleway",]$T) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										233
									
								
								WI-schools-cycle.Rmd
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								WI-schools-cycle.Rmd
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,233 @@ | ||||||
|  | --- | ||||||
|  | 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 <- FALSE | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## 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) | ||||||
|  | 
 | ||||||
|  | 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") | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if(length(bad.school.vec) > 0){ | ||||||
|  |     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") | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Read List Data | ||||||
|  | 
 | ||||||
|  | ```{r readLists, 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") | ||||||
|  | WI_schools <- readRDS(file = "./R/data/WI_schools.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)) | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Plot List Data | ||||||
|  | 
 | ||||||
|  | ### Best & Worst Schools | ||||||
|  | 
 | ||||||
|  | ```{r plots, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | ggplot(data.frame(not.cycleway = not.cycleway.vec), aes(not.cycleway)) + geom_histogram(fill = "grey", color = "black") + theme_bw() | ||||||
|  | 
 | ||||||
|  | register_stadiamaps(key = substr(read_file(file = "api_keys/stadia_api_key"), 1, 36)) | ||||||
|  | 
 | ||||||
|  | zoom.level <- 15 | ||||||
|  | k <- 306 #247 | ||||||
|  | 
 | ||||||
|  | bbox <- st_bbox(st_buffer(gridList[[k]], dist = 500)) | ||||||
|  | bbox <- c(left = as.double(bbox[1]), | ||||||
|  |           bottom = as.double(bbox[2]), | ||||||
|  |           right = as.double(bbox[3]), | ||||||
|  |           top = as.double(bbox[4])) | ||||||
|  | basemap <- get_stadiamap(bbox = bbox, zoom = zoom.level, maptype = "stamen_toner_lite") | ||||||
|  | 
 | ||||||
|  | ggmap(basemap) + geom_sf(data = gridList[[k]], aes(fill= not.cycleway), inherit.aes = FALSE) + scale_fill_gradient(low = "yellow", high = "red", limits = c(0,17), na.value = NA) | ||||||
|  | 
 | ||||||
|  | k <- 247 #306 | ||||||
|  | 
 | ||||||
|  | bbox <- st_bbox(st_buffer(gridList[[k]], dist = 500)) | ||||||
|  | bbox <- c(left = as.double(bbox[1]), | ||||||
|  |           bottom = as.double(bbox[2]), | ||||||
|  |           right = as.double(bbox[3]), | ||||||
|  |           top = as.double(bbox[4])) | ||||||
|  | basemap <- get_stadiamap(bbox = bbox, zoom = zoom.level, maptype = "stamen_toner_lite") | ||||||
|  | 
 | ||||||
|  | ggmap(basemap) + geom_sf(data = gridList[[k]], aes(fill= not.cycleway), inherit.aes = FALSE) + scale_fill_gradient(low = "yellow", high = "red", limits = c(0,17), na.value = NA) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Statewide Map | ||||||
|  | 
 | ||||||
|  | ```{r plots2, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | 
 | ||||||
|  | D <- cbind(WI_schools, not.cycleway.vec) | ||||||
|  | 
 | ||||||
|  | zoom.level <- 8 | ||||||
|  | 
 | ||||||
|  | bbox <- st_bbox(st_buffer(D, dist = 10e3)) | ||||||
|  | bbox <- c(left = as.double(bbox[1]), | ||||||
|  |           bottom = as.double(bbox[2]), | ||||||
|  |           right = as.double(bbox[3]), | ||||||
|  |           top = as.double(bbox[4])) | ||||||
|  | basemap <- get_stadiamap(bbox = bbox, zoom = zoom.level, maptype = "stamen_toner_lite") | ||||||
|  | 
 | ||||||
|  | ggmap(basemap) + geom_sf(data = D, aes(size = 2, color = not.cycleway.vec), inherit.aes = FALSE) + scale_color_gradient(low = "yellow", high = "red", na.value = NA) # , limits = c(0,17) | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Archive | ||||||
|  | 
 | ||||||
|  | ```{r chunklast, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | date() | ||||||
|  | sessionInfo() | ||||||
|  | ``` | ||||||
							
								
								
									
										192
									
								
								route_to_school.Rmd
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								route_to_school.Rmd
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,192 @@ | ||||||
|  | --- | ||||||
|  | title: "East High Cycling Routes" | ||||||
|  | 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") | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # External sources configurations | ||||||
|  | 
 | ||||||
|  | ## Open Source Routing Machine (OSRM) | ||||||
|  | 
 | ||||||
|  | ```{r osrm, eval = TRUE, echo = TRUE, results = "show", warning = FALSE, error = TRUE, message = FALSE} | ||||||
|  | options(osrm.server = "http://127.0.0.1:5001/") | ||||||
|  | options(osrm.profile = "bike") | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Brouter options | ||||||
|  | ```{r brouter, eval = TRUE, echo = TRUE, results = "show", warning = FALSE, error = TRUE, message = FALSE} | ||||||
|  | brouter_url <- "http://127.0.0.1:17777/brouter" | ||||||
|  | brouter_profile <- "safety" | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Stadia Maps API Key | ||||||
|  | 
 | ||||||
|  | ```{r stadiamaps, eval = TRUE, echo = TRUE, results = "show", warning = FALSE, error = TRUE, message = FALSE} | ||||||
|  | register_stadiamaps(key = substr(read_file(file = "api_keys/stadia_api_key"), 1, 36)) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Analysis | ||||||
|  | 
 | ||||||
|  | ## Create Bikeable Region Using OSRM | ||||||
|  | 
 | ||||||
|  | ```{r boundary, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | WI_schools <- st_transform(st_read(dsn = "data/Schools/Wisconsin_Public_Schools_-5986231931870160084.gpkg"), crs = 4326) | ||||||
|  | WI_schools <- WI_schools %>% mutate(geom = SHAPE) | ||||||
|  | 
 | ||||||
|  | school_focus <- data.frame(name = c("East High School"), NCES_CODE = c("550852000925")) | ||||||
|  | #school_focus <- data.frame(name = c("IMAP"), NCES_CODE = c("550008203085")) | ||||||
|  | school_location <- WI_schools %>% filter(NCES_CODE %in% school_focus$NCES_CODE) | ||||||
|  | 
 | ||||||
|  | radius <- 4 # miles | ||||||
|  | levels <- c(1) | ||||||
|  | res <- 100 | ||||||
|  | threshold <- units::set_units(1, km^2) | ||||||
|  | 
 | ||||||
|  | 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) | ||||||
|  | 
 | ||||||
|  | saveRDS(cycle_boundary_poly, "./R/data/cycle_boundary_poly.rds") | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Create Grid Over Bikeable Region | ||||||
|  | 
 | ||||||
|  | ```{r grid, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | cellsize <- 5e-3 | ||||||
|  | grid <- st_make_grid(cycle_boundary_poly, cellsize = cellsize, what = "polygons", square = FALSE) | ||||||
|  | grid <- st_intersection(cycle_boundary_poly, grid) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Compute Routes from Cell Centroids to School with brouter | ||||||
|  | 
 | ||||||
|  | ```{r routes, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | grid_pts <- st_centroid(grid) | ||||||
|  | grid_coods <- st_coordinates(grid_pts) | ||||||
|  | school_focus_location <- WI_schools %>% filter(NCES_CODE %in% school_focus$NCES_CODE) %>% 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) | ||||||
|  |   route_run <- st_read(content <- content(response, as = "text"), quiet = TRUE) | ||||||
|  |   route_run[["student_number"]] <- i | ||||||
|  |   routes[[i]] <- route_run | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | routes <- st_transform(bind_rows(routes), crs = 4326) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Notes: | ||||||
|  | 
 | ||||||
|  | - What does `st_transform(bind_rows(routes), crs = 4326)` do? | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Generate Map for Total Time | ||||||
|  | 
 | ||||||
|  | ## Set boundaries and get basemap | ||||||
|  | ```{r basemap, eval = TRUE, echo = TRUE, results = "show", warning = FALSE, error = TRUE, message = FALSE} | ||||||
|  | bbox <- st_bbox(st_buffer(cycle_boundary_poly, dist = 500)) | ||||||
|  | bbox <- c(left = as.double(bbox[1]), | ||||||
|  |           bottom = as.double(bbox[2]), | ||||||
|  |           right = as.double(bbox[3]), | ||||||
|  |           top = as.double(bbox[4])) | ||||||
|  | 
 | ||||||
|  | zoom.level <- 12 | ||||||
|  | basemap <- get_stadiamap(bbox = bbox, zoom = zoom.level, maptype = "stamen_toner_lite") | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Total Trip Time Map | ||||||
|  | 
 | ||||||
|  | ```{r sandbox3, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | track.length.vec <- routes %>% pull(track.length) | ||||||
|  | grid <- cbind(grid, track.length = as.numeric(track.length.vec)/1609) | ||||||
|  | 
 | ||||||
|  | total.time.vec <- routes %>% pull(total.time) | ||||||
|  | grid <- cbind(grid, total.time = as.numeric(total.time.vec)) | ||||||
|  | 
 | ||||||
|  | total.energy.vec <- routes %>% pull(total.energy) | ||||||
|  | grid <- cbind(grid, total.energy = as.numeric(total.energy.vec)) | ||||||
|  | 
 | ||||||
|  | gg1 <- ggmap(basemap) + geom_sf(data = subset(grid, track.length > 1), aes(fill = total.time), inherit.aes = FALSE) | ||||||
|  | 
 | ||||||
|  | ggsave(gg1, filename = "./figures/route-characteristics.pdf", width = 11, height = 8, units = "in") | ||||||
|  | 
 | ||||||
|  | gg1 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Routes Map | ||||||
|  | 
 | ||||||
|  | ```{r sandbox3b, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | gg2 <- ggmap(basemap) + geom_sf(data = routes, aes(color = "red"), inherit.aes = FALSE) | ||||||
|  | ggsave(gg2, filename = "./figures/routes.pdf", width = 11, height = 8, units = "in") | ||||||
|  | gg2 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Route Characteristics | ||||||
|  | 
 | ||||||
|  | ## Compute Percent of Trip on Cycleway | ||||||
|  | 
 | ||||||
|  | ```{r sandbox4, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | x.vec <- c() | ||||||
|  | for(j in 1:nrow(routes)){ | ||||||
|  |     foobar <- routeChar(routes[j, "messages"]) | ||||||
|  |     x.vec <- c(x.vec, foobar) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | grid <- cbind(grid, T.cycleway = x.vec) | ||||||
|  | grid <- cbind( grid, not.cycleway = (grid$total.time - grid$T.cycleway)/60) | ||||||
|  | 
 | ||||||
|  | gg3 <- ggmap(basemap) + geom_sf(data = grid, aes(fill= not.cycleway), inherit.aes = FALSE) + scale_fill_gradient(low = "yellow", high = "red", limits = c(0,17), na.value = NA) | ||||||
|  | ggsave(gg3, filename = "./figures/cycleway.pdf", width = 11, height = 8, units = "in") | ||||||
|  | gg3 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Archive | ||||||
|  | 
 | ||||||
|  | ```{r chunklast, eval = TRUE, echo = TRUE, results = "show", warning = TRUE, error = TRUE, message = TRUE} | ||||||
|  | date() | ||||||
|  | sessionInfo() | ||||||
|  | ``` | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bvarick
						bvarick