Skip to content

Instantly share code, notes, and snippets.

@idshklein
Last active March 15, 2021 21:05
Show Gist options
  • Save idshklein/bacdfc15d05a8f4479365f7bdd1cb0d9 to your computer and use it in GitHub Desktop.
Save idshklein/bacdfc15d05a8f4479365f7bdd1cb0d9 to your computer and use it in GitHub Desktop.
library(tidyverse)
library(sf)
library(esri2sf)
library(tidygraph)
library(sfnetworks)
library(ggspatial)
Sys.setlocale(locale = "hebrew")
# https://gisviewer.jerusalem.muni.il/arcgis/rest/services/BaseLayers/MapServer
jlm_net <- esri2sf("https://gisviewer.jerusalem.muni.il/arcgis/rest/services/BaseLayers/MapServer/27") %>%
st_transform(2039)
schools <- esri2sf("https://gisviewer.jerusalem.muni.il/arcgis/rest/services/BaseLayers/MapServer/3") %>%
st_transform(2039)
minhalim <- esri2sf("https://gisviewer.jerusalem.muni.il/arcgis/rest/services/BaseLayers/MapServer/41") %>%
st_transform(2039)
buildings <- esri2sf("https://gisviewer.jerusalem.muni.il/arcgis/rest/services/BaseLayers/MapServer/30") %>%
st_transform(2039)
AOI <- minhalim %>%
filter(NAME=="גוננים") %>%
st_cast("POLYGON")
rel_schools <- AOI %>%
st_intersection(schools) %>%
filter(str_detect(department,"חובה")) %>%
st_jitter(1)
net <- AOI %>%
st_intersection(jlm_net)
rel_buildings <- buildings %>%
st_centroid() %>%
st_intersection(AOI)
rel_net <- net %>%
st_cast("LINESTRING") %>%
as_sfnetwork() %>%
filter(group_components() == 1) %>%
activate(nodes) %>%
mutate(rn = as.character(row_number())) %>%
st_network_blend(c(rel_schools$geoms)) %>%
mutate(type = ifelse(is.na(rn),"school","node")) %>%
st_network_blend(c(rel_buildings$geoms)) %>%
mutate(type = ifelse(is.na(type),"building",type)) %>%
group_by(type) %>%
mutate(rn = row_number(),
id = paste(type,rn,sep = "_")) %>%
activate(edges) %>%
mutate(weight = edge_length())
helper <- rel_net %>%
activate(nodes) %>%
as_tibble() %>%
pull(type)
building_idx <- which(helper == "building")
schools_idx <- which(helper == "school")
cost_matrix = st_network_cost(rel_net, from = building_idx, to = schools_idx)
nodes <- rel_net %>%
activate(nodes) %>%
st_as_sf()
nodes[building_idx,"nearset"] = apply(cost_matrix, 1,which.min)
nodes %>%
st_as_sf() %>%
filter(!is.na(nearset)) %>%
st_transform(4326) %>%
ggplot() +
annotation_map_tile(zoom=16) +
geom_sf(aes(color = factor(nearset)),size = 3)+
geom_sf(data = nodes %>% st_as_sf() %>% st_transform(4326) %>% filter(type == "school"),color = "black",size = 5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment