Source code for the paper "Growing urban bicycle networks", exploring algorithmically the limitations of urban bicycle network growth
This is the source code for the scientific paper Growing urban bicycle networks by M. Szell, S. Mimar, T. Perlman, G. Ghoshal, and R. Sinatra. The code downloads and pre-processes data from OpenStreetMap, prepares points of interest, runs simulations, measures and saves the results, creates videos and plots.
Paper: https://www.nature.com/articles/s41598-022-10783-y
Data repository: zenodo.5083049
Visualization: GrowBike.Net
Videos & Plots: https://growbike.net/download
The main folder/repo is bikenwgrowth
, containing Jupyter notebooks (code/
), preprocessed data (data/
), parameters (parameters/
), result plots (plots/
), HPC server scripts and jobs (scripts/
).
Other data files (network plots, videos, results, exports, logs) make up many GBs and are stored in the separate external folder bikenwgrowth_external
due to Github's space limitations.
conda create --override-channels -c conda-forge -n OSMNX python=3.8.2 osmnx=0.16.2 python-igraph watermark haversine rasterio tqdm geojson
conda activate OSMNX
conda install -c conda-forge ipywidgets
pip install opencv-python
conda install -c anaconda gdal
pip install --user ipykernel
python -m ipykernel install --user --name=OSMNX
Run Jupyter Notebook with kernel OSMNX (Kernel > Change Kernel > OSMNX)
For multiple, esp. large, cities, running the code on a high performance computing cluster is strongly suggested as the tasks are easy to paralellize. The shell scripts are written for SLURM.
parameters/cities.csv
, see below.sbatch scripts/download.job
, but OSMNX throws too many connection issues, so manual supervision is needed)code/*.py
, parameters/*
, scripts/*
./mastersbatch_analysis.sh
./mastersbatch_export.sh
./cleanup.sh
./fixresults.sh
(to clean up results in case of amended data from repeated runs)Single (or few/small) cities could be run locally but require manual, step-by-step execution of Jupyter notebooks:
parameters/cities.csv
, see below.parameters/parameters.py
prune_measure = "betweenness"
, poi_source = "railwaystation"
prune_measure = "betweenness"
, poi_source = "grid"
prune_measure = "closeness"
, poi_source = "railwaystation"
prune_measure = "closeness"
, poi_source = "grid"
prune_measure = "random"
, poi_source = "railwaystation"
prune_measure = "random"
, poi_source = "grid"
relation["boundary"="administrative"]["name:en"="Copenhagen Municipality"]({{bbox}});(._;>;);out skel;