Urban Noise Mapping

This vignette shows how to prepare road-noise modelling inputs from building height data, OSM-style roads, greenspace, canopy height, and optional terrain data. The same input pattern used by svf() is used here: pass building footprints as x, choose the height column with height_field, and supply canopy/DEM rasters directly or let the function retrieve them.

library(gloBFPr)
library(sf)
library(terra)

The package includes a small building layer and companion raster examples. For a real study area, replace this with search_3dglobdf().

data(globfp_example)
data(globfp_example_dem)
data(globfp_example_canopy_height)

buildings <- globfp_example
dem <- rast(globfp_example_dem)
canopy_height <- rast(globfp_example_canopy_height)

names(buildings)

1 Prepare Inputs

By default, prepare_noisemodelling_inputs() and get_noise_map() download OSM roads from the bounding box of x. If measured traffic columns are not present, infer_osm_traffic() fills screening-level speed and traffic assumptions from the OSM highway class.

noise_inputs <- prepare_noisemodelling_inputs(
  x = buildings,
  height_field = "Height",
  datasource_greenspace = "esri",
  greenspace_zoom = 14,
  canopy_height = canopy_height,
  dem = dem,
  receiver = "grid",
  resolution = 25,
  quiet = FALSE
)

For measured traffic counts, pass a road layer with NoiseModelling traffic columns directly through roads. The inferred defaults are useful for screening or scenario comparisons, not calibrated regulatory maps.

Use prepare_noisemodelling_inputs() when you want to inspect or export the layers before running the external NoiseModelling solver.

noise_inputs <- prepare_noisemodelling_inputs(
  x = buildings,
  height_field = "Height",
  canopy_height = canopy_height,
  dem = dem,
  receiver = "grid",
  resolution = 25,
  quiet = TRUE
)

names(noise_inputs)
nrow(noise_inputs$receivers)

The prepared object contains:

  • buildings: building polygons with PK, HEIGHT, and optional POP.
  • roads: road lines with PK and CNOSSOS-style traffic columns.
  • ground: hard/green ground absorption polygons.
  • receivers: 3D receiver points, defaulting to 4 m height.
  • dem: optional terrain raster aligned for later export.

You can write a GeoPackage for inspection.

noise_inputs <- prepare_noisemodelling_inputs(
  x = buildings,
  roads = roads,
  canopy_height = canopy_height,
  dem = dem,
  out_dir = tempdir(),
  write = TRUE,
  quiet = TRUE
)

noise_inputs$gpkg

Fetch Canopy, Greenspace, and DEM Internally

The noise functions can follow the same style as svf(): provide datasource_canopy_height, datasource_greenspace, and key instead of supplying rasters. Roads are downloaded internally from the building extent unless you pass roads explicitly.

noise_inputs <- prepare_noisemodelling_inputs(
  x = buildings,
  height_field = "Height",
  min_tree_height = 2,
  datasource_canopy_height = "metachm",
  datasource_greenspace = "esri",
  opentopo_key = Sys.getenv("OPENTOPOGRAPHY_KEY"),
  receiver = "grid",
  resolution = 25,
  quiet = TRUE
)

opentopo_key is only needed when DEM retrieval is requested. Canopy height is used to classify green ground absorption; it is not treated as a hard acoustic barrier.

2 Run NoiseModelling

get_noise_map(run = TRUE) runs the official headless NoiseModelling WPS scripts. This requires Java 11 or newer (11<=version<=17). The first run can download the headless NoiseModelling release into the R user cache, or you can preinstall it with install_noisemodelling().

install_noisemodelling(version = "5.0.1")
noise_result <- get_noise_map(
  x = buildings,
  height_field = "Height",
  datasource_canopy_height = "metachm",
  datasource_greenspace = "esri",
  dem = dem,
  receiver = "grid",
  resolution = 25,
  run = TRUE,
  keep_files = TRUE,
  quiet = FALSE,
  java = 17
)
plot_noise_map(noise_result, period = "DEN", scalebar = TRUE)
plot_noise_map(noise_result, period = "DEN")

The result includes the prepared inputs, the raw RECEIVERS_LEVEL output, a spatial noise_map receiver layer with period-specific columns such as LAEQ_D, LAEQ_E, LAEQ_N, and LAEQ_DEN, the official NoiseModelling CONTOURING_NOISE_MAP polygons in isophones, the exported GeoJSON paths, logs from each WPS script, and the NoiseModelling runner path.

For production work, start with a building layer from search_3dglobdf() and replace OSM-inferred traffic with local speed and volume observations when available.

Advanced NoiseModelling Controls

get_noise_map() exposes the main acoustic controls used by Noise_level_from_source.groovy. The defaults are deliberately moderate for screening maps; increasing propagation distance, reflection order, diffraction, or ray export can make the run much slower.

noise_result <- get_noise_map(
  x = buildings,
  height_field = "Height",
  canopy_height = canopy_height,
  dem = dem,
  receiver = "grid",
  resolution = 25,
  run = TRUE,
  java = 17,
  reflection_order = 1,
  max_src_distance = 500,
  max_reflection_distance = 350,
  diffraction_horizontal = TRUE,
  diffraction_vertical = FALSE,
  wall_alpha = 0.1,
  humidity = 75,
  temperature = 31,
  favourable_occurrences = rep(0.5, 16),
  max_error = 0.1,
  export_source_id = FALSE,
  frequency_field_prepend = "HZ"
)
plot_noise_map(noise_result, period = "DEN", scalebar = TRUE)

Key controls:

  • reflection_order: maximum number of specular reflections on vertical surfaces. Higher values are more realistic in street canyons but much slower.
  • max_src_distance: maximum source-receiver search distance in meters. Larger values include farther roads.
  • max_reflection_distance: maximum distance used when searching walls for reflected paths.
  • diffraction_horizontal and diffraction_vertical: enable diffraction over horizontal edges or around vertical edges. NoiseModelling recommends horizontal diffraction for many propagation studies; vertical diffraction is mainly for rail and industrial sources under CNOSSOS-EU guidance.
  • wall_alpha: wall absorption coefficient. 0.1 is a common reflective facade assumption.
  • humidity, temperature, and favourable_occurrences: atmospheric absorption and meteorological propagation settings.
  • max_error: pruning threshold in dB for negligible source contributions. A smaller value can be more complete but slower.
  • export_source_id: keeps receiver levels by source id, useful for source contribution diagnostics.
  • rays_name: exports propagation rays or attenuation diagnostics to a table or file URL. This is mainly for debugging and can be very large.
  • noise_wps_args: passes named raw arguments to the NoiseModelling WPS script for advanced options not yet represented by a dedicated R argument.

The OSM traffic defaults used by infer_osm_traffic() mirror the category values embedded in NoiseModelling’s Import_OSM.groovy, including the cited Good Practice Guide assumptions. Import_OSM.groovy itself works from a local .osm, .osm.gz, or .osm.pbf extract; the current R workflow instead downloads roads from the building bounding box and applies matching traffic defaults in R.

If you already have a local OSM extract and want NoiseModelling to create the ROADS table itself, pass osm_file and leave roads = NULL.

You can download a regional .osm.pbf extract directly in R. osmextract is a convenient option when the area is available from a provider such as Geofabrik:

install.packages("osmextract")

osm_file <- osmextract::oe_get(
  place = "Detroit, Michigan",
  provider = "geofabrik",
  download_directory = tempdir(),
  force_download = FALSE
)

You can also download a known extract URL with base R:

osm_file <- file.path(tempdir(), "michigan-latest.osm.pbf")

utils::download.file(
  "https://download.geofabrik.de/north-america/us/michigan-latest.osm.pbf",
  osm_file,
  mode = "wb"
)
noise_result <- get_noise_map(
  x = buildings,
  height_field = "Height",
  canopy_height = canopy_height,
  dem = dem,
  osm_file = osm_file,
  receiver = "grid",
  resolution = 25,
  run = TRUE,
  java = 17
)

This uses your x buildings and ground preparation from R, but asks NoiseModelling’s Import_OSM.groovy to create the road network and traffic defaults from the OSM file.

mirror server hosted at Truenetwork, Russian Federation.