---
title: "Zonebuilder hackathon"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Zonebuilder hackathon}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  eval = FALSE,
  collapse = TRUE,
  comment = "#>"
)
```

## Introduction

**zonebuilder** is a package for exploring zoning systems.
This document contains ideas on challenges that can be tackled using zoning systems, example code to get started and suggestions of how to get involved.

## Setup

To ensure that you have the necessary software installed, try running the following lines of code in an R console (you need the latest version of the package):

```{r, eval=FALSE}
remotes::install_github("zonebuilders/zonebuilder")
remotes::install_github("itsleeds/pct")
```


```{r setup}
library(zonebuilder)
library(dplyr)
library(tmap)
tmap_mode("view")
```


Ideas for hackathon:

- Explore results from automated zoning of a range of cities
  - How many supermarkets in different zones of the city?
  - Explore how mode and distance of travel changes depending on city zones
  - Explore how to calculate traveltimes from zone to zone for different travel modalities
  - Explore how traveltimes from cityzones to citycentre for different modalities for multiple cities affect number of commuters
  - Find a datadriven method for defining the city centre (e.g. density of adresses, population density, building date, number of companies, number of nodes of the road infrastructure).
- Number of houses vs estimated population in different zones using UK data
- Demonstrate aggregagation of OD data into zoning system

```{r, eval=FALSE}
zones_west_yorkshire = pct::get_pct_zones("west-yorkshire")
zones_leeds_official = zones_west_yorkshire %>% filter(lad_name == "Leeds")
```


```{r, eval=FALSE}
leeds_centroid = tmaptools::geocode_OSM(q = "Leeds", as.sf = TRUE)
```

```{r, echo=FALSE, eval=FALSE}
saveRDS(zones_leeds_official, "zones_leeds_official.Rds")
piggyback::pb_upload("zones_leeds_official.Rds")
piggyback::pb_download_url("zones_leeds_official.Rds")
saveRDS(zones_leeds_zb, "zones_leeds_zb.Rds")
piggyback::pb_upload("zones_leeds_zb.Rds")
```

You can get and plot the output of the preceding code chunk with:

```{r}
leeds_centroid = readRDS(url("https://github.com/zonebuilders/zonebuilder/releases/download/0.0.1/leeds_centroid.Rds"))
zones_leeds_official = readRDS(url("https://github.com/zonebuilders/zonebuilder/releases/download/0.0.1/zones_leeds_official.Rds"))
zone_outline = zones_leeds_official %>%
  sf::st_buffer(dist = 0.0001) %>% 
  sf::st_union()
zones_leeds_zb = zb_zone(x = zone_outline, point = leeds_centroid)
tm_shape(zones_leeds_zb) + tm_borders() +
  tm_text("label")
```

## Explore results of automated zoning system

### Generate zones for different cities

The zoning systems works well to represent cities that have a clear centre (monocentric cities) with city zones connected by radial and circular orbital routes, such as Erbil:

```{r}
city_name = "Erbil"
city_centre = tmaptools::geocode_OSM(city_name, as.sf = TRUE)
zones_erbil = zb_zone(point = city_centre, n_circles = 5) 
tm_shape(zones_erbil) + tm_borders() +
  tm_text("label") +
  tm_basemap(server = leaflet::providers$OpenStreetMap)
# zb_view(zones_erbil)
```

The zoning system works less well for other cities, e.g. cities with asymetric and polycentric urban morphologies such as Dhakar, shown below.

```{r}
city_name = "Dhaka"
city_centre = tmaptools::geocode_OSM(city_name, as.sf = TRUE)
zones_dhaka = zb_zone(point = city_centre, n_circles = 5)
tm_shape(zones_dhaka) + tm_borders() +
  tm_text("label") +
  tm_basemap(server = leaflet::providers$OpenStreetMap)
```


```{r, eval=FALSE, echo=FALSE}
# Aim: get the largest cities in the world
cities_worldwide = rnaturalearth::ne_download(scale = 10, type = "populated_places")

city_names = c(
  "Dheli",
  "Mexico City",
  "Tokyo",
  "Beijing",
)

city_name = "Dheli"
city_centre = tmaptools::geocode_OSM(city_name, as.sf = TRUE)
zones_dhaka = zb_zone(point = city_centre, n_circles = 5)
tm_shape(zones_dhaka) + tm_borders() +
  tm_text("label")
```

### How many supermarkets in different zones of the city?


```{r, eval=FALSE}
devtools::install_github("itsleeds/geofabrik")
library(geofabrik)
leeds_shop_polygons = get_geofabrik(leeds_centroid, layer = "multipolygons", key = "shop", value = "supermarket")
```

```{r, eval=FALSE, echo=FALSE}
saveRDS(leeds_shop_polygons, "leeds_shop_polygons.Rds")
piggyback::pb_upload("leeds_shop_polygons.Rds")
piggyback::pb_download_url("leeds_shop_polygons.Rds")
saveRDS(leeds_centroid, "leeds_centroid.Rds")
piggyback::pb_upload("leeds_centroid.Rds")
piggyback::pb_download_url("leeds_centroid.Rds")
# leeds_roads = get_geofabrik(name = leeds_centroid)
# leeds_shop_points = get_geofabrik(leeds_centroid, layer = "points", key = "amenity", value = "shop")
```

We have pre-saved the results as follows:

```{r}
leeds_shop_polygons = readRDS(url("https://github.com/zonebuilders/zonebuilder/releases/download/0.0.1/leeds_shop_polygons.Rds"))
z = zb_zone(zones_leeds_official, point = leeds_centroid, n_circles = 5)
z_supermarkets = aggregate(leeds_shop_polygons["shop"], z, FUN = length)
tm_shape(z_supermarkets) +
  tm_polygons("shop", alpha = 0.5, title = "N. Supermarkets")
```

<!-- ![](https://user-images.githubusercontent.com/1825120/74724776-bb289f00-5234-11ea-9915-54cf0c5b75e4.png) -->

#### Explore how mode and distance of travel changes depending on city zones

```{r}

```


Robin to create UK example


#### Demo Dutch cities and commuting

See [demo Dutch cities vignette](https://zonebuilders.github.io/zonebuilder/articles/demo_dutch_cities.html)
