This project investigates the structural and social accessibility of public benches in Aarhus municipality, Denmark, through the lens of hostile architecture and counter-mapping. Using bench data from OpenStreetMap and road traffic noise data from Miljøstyrelsen, benches are classified as hostile, non-hostile, or sleep-friendly on the basis of their design features and acoustic environment — with particular attention to their accessibility for people experiencing rough sleeping. A counter-map hosted on our ShinyApp is proposed as a proof-of-concept for making visible the spatial realities that conventional cartographic data leaves unrecorded. The project is developed as part of the Spatial Analytics course within the bachelor-level elective Cultural Data Science at Aarhus University.
data/
└── gadm/ # where the Danish municipality data is stored upon its download in MAIN.rmd
└── ringVejGade/ # our Aarhus areas based on Ringvejen and Ringgaden
└── benches_osm_municipality.rds # bench data for Aarhus municipality
└── benches_osm_ringgade.rds # bench data for Aarhus area based on Ringgaden
└── benches_osm_ringvej.rds # bench data for Aarhus area based on Ringvejen
└── gadm36_DNK_2_sp.rds # saved version of the Danish municipality data
└── aarhus_night_streetNoise_municipality.gpkg # the road noise pollution data downloaded and restricted to Aarhus municipality in Road_Noise_Pollution_Data_Download.RMD
└── aarhus_night_streetNoise_ringgade.gpkg # the road noise pollution data downloaded and restricted to Aarhus area based on Ringgaden in MAIN.rmd in Road_Noise_Pollution_Data_Download.RMD
└── aarhus_night_streetNoise_ringvej.gpkg # the road noise pollution data downloaded and restricted to Aarhus area based on Ringvejen in MAIN.rmd in Road_Noise_Pollution_Data_Download.RMD
out/
└── afterNoise_benchClassification_municipality.csv # distribution of classified benches (also based on road noise pollution); Aarhus municipality
└── afterNoise_benchClassification_ringgade.csv # distribution of classified benches (also based on road noise pollution); Aarhus area based on Ringgaden
└── afterNoise_benchClassification_ringvej.csv # distribution of classified benches (also based on road noise pollution); Aarhus area based on Ringvejen
└── benchesVSnoisePollution_municipality.csv # counts and proportions of benches subjected to above 50 dB Lnight road noise; Aarhus municipality
└── benchesVSnoisePollution_ringgade.csv # counts and proportions of benches subjected to above 50 dB Lnight road noise; Aarhus area based on Ringgaden
└── benchesVSnoisePollution_ringvej.csv # counts and proportions of benches subjected to above 50 dB Lnight road noise; Aarhus area based on Ringvejen
└── initial_benchClassification_municipality.csv # distribution of classified benches (before road noise pollution); Aarhus municipality
└── initial_benchClassification_ringgade.csv # distribution of classified benches (before road noise pollution); Aarhus area based on Ringgaden
└── initial_benchClassification_ringvej.csv # distribution of classified benches (before road noise pollution); Aarhus area based on Ringvejen
shinyApp/ # folder used to run the ShinyApp
└── data/ # copy of data/ in root, used for running the data_pipeline.r
└── rsconnect/
└── app.r # file used to run the ShinyApp
└── app_data.rds # data serialisation, i.e., saved R object for the ShinyApp data
└── data_pipeline.r # file used to prepare app_data.rds for the ShinyApp
MAIN.Rmd # MAIN script
Road_Noise_Pollution_Data_Download.RMD # not to be run; originally used for loading the road noise data
README.md
LICENSE.txt
Set the chooseBasemap variable in the second code chunk of MAIN.Rmd to select the spatial extent for the analysis:
chooseBasemap <- "municipality" # options: "ringvej", "ringgade", "municipality"This controls which basemap is used throughout — Aarhus municipality as a whole, or the smaller areas bounded by Aarhus ringvej or ringgade respectively.
The ShinyApp (our counter-map), titled BENCH-marks For Care, can be accessed via the following link, where Shiny-io is used to deploy our ShinyApp without needing to establish a new server: https://aiswarya.shinyapps.io/BenchmarksForCare/. Otherwise, running the ShinyApp requires running multiple files, within the BenchmarksForCare/ folder: (1) run data_pipeline.R, which loads and prepares all the data for the Shiny App (incl. classifications and voronoi diagrams). This is then saved to the app_data.rds file. (2) run app.R, which sets up the app and runs the application with the specified user interface.
N.B.: Unless you make changes to the data_pipeline.R script, the app_data.rds file may be used as is and app.R may be run directly. However, if issues do occur when running app.R, feel free to run data_pipeline.R, ensure the app_data.rds is saved in the appropriate location relative to your working directory, and restart the R session, before re-running app.R.
Most data is downloaded or generated automatically on first run. However, note the following:
- Noise pollution data (from Miljøstyrelsen via MiljøGIS) exceeds GitHub's file size limits and cannot be downloaded programmatically. Pre-processed versions clipped to each basemap are saved in data/ and loaded directly — the code originally used for downloading the data can be found in the Road_Noise_Pollution_Data_Download.RMD, but should not be run.
- Output files (classification counts, noise proportion tables) are saved automatically to out/ during the run of MAIN.rmd.
All data uses the WGS84 (EPSG:4326) CRS; no manual CRS conversion is required on input. Voronoi analysis transforms to EPSG:25832 (UTM 32N) internally.
This work is licensed under a Creative Commons Attribution 4.0 International License.
Aiswarya Roy (202308450@post.au.dk) and Mie Norre Engemann (202309344@post.au.dk)
Cultural Data Science, Spatial Analytics - Spring 2026
