# Zonebuilder hackathon

## 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):

    remotes::install_github("zonebuilders/zonebuilder")
    remotes::install_github("itsleeds/pct")

    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

    zones_west_yorkshire = pct::get_pct_zones("west-yorkshire")
    zones_leeds_official = zones_west_yorkshire %>% filter(lad_name == "Leeds")

    leeds_centroid = tmaptools::geocode_OSM(q = "Leeds", as.sf = TRUE)

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

    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:

    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.

    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)

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

    devtools::install_github("itsleeds/geofabrik")
    library(geofabrik)
    leeds_shop_polygons = get_geofabrik(leeds_centroid, layer = "multipolygons", key = "shop", value = "supermarket")

We have pre-saved the results as follows:

    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")

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

Robin to create UK example

#### Demo Dutch cities and commuting

See demo Dutch cities vignette