roadnoise
Transparent, screening-level road traffic noise in Python for environmental-noise consultants, planners and researchers working in the context of the EU Environmental Noise Directive (END, Directive 2002/49/EC).
- CNOSSOS-EU road source model – Directive 2002/49/EC Annex II as introduced by Commission Directive (EU) 2015/996 and amended by Commission Delegated Directive (EU) 2021/1226: vehicle categories 1, 2, 3, 4a, 4b (5 reserved), rolling and propulsion noise per octave band 63 Hz – 8 kHz, speed laws, road-surface, studded-tyre, temperature, gradient and acceleration corrections, line-source emission per metre.
- Propagation (screening) – geometric divergence, ISO 9613-1 atmospheric absorption at any temperature / humidity, flat-ground ground effect (CNOSSOS-EU homogeneous + favourable, or ISO 9613-2 general method), single-edge diffraction (CNOSSOS-EU Δdif with ground terms, ISO 9613-2 Dz, or Maekawa), optional +3 dB facade reflection.
- Receivers – segmentation of road lines into point sources, regular grids, facade receivers.
- Indicators – Lday, Levening, Lnight, Lden (5/10 dB penalties, 12/4/8 h or Member-State variants) and END exposure statistics (people per 5 dB band, optional rounding to hundreds).
- CRTN – the UK Calculation of Road Traffic Noise (1988) as an independent quick check.
- I/O – GeoJSON in, ESRI ASCII grid / GeoJSON out; GeoTIFF with the
rasterextra; geopandas helpers with thegeoextra. Onlynumpyis required.
Scope.
roadnoiseis a screening tool. It is not a certified or conformance-tested CNOSSOS-EU implementation and must not be used on its own for strategic noise maps reported under the END. See Differences to full CNOSSOS-EU.
Installation
pip install roadnoise # numpy only
pip install "roadnoise[raster]" # + rasterio for GeoTIFF output
pip install "roadnoise[geo]" # + geopandas/shapely helpers
Python 3.9 – 3.13.
Quick start
import roadnoise as rn
# Emission per metre of 1104 cars/h + 96 heavy vehicles/h at 50 km/h
lw = rn.line_sound_power({"1": 1104, "3": 96}, 50) # dB re 1 pW/m, 8 bands
print(rn.a_weighted(lw)) # ~84.1 dB(A)
# A road from AADT, a barrier, a building, facade receivers
road = rn.Road.from_aadt([(0, 0), (400, 0)], aadt=24000, speed=50, heavy=0.08)
barrier = rn.Barrier([(50, 12), (350, 12)], height=3.0)
building = rn.Building([(150, 40), (250, 40), (250, 60), (150, 60)], height=12.0)
pts, _ = rn.facade_receivers(building.footprint, spacing=5.0)
res = rn.compute_levels([road], pts, receiver_height=4.0,
barriers=[barrier], buildings=[building])
res.lden, res.lnight # dB(A) per receiver
grid = rn.compute_grid([road], cell=10.0, margin=100.0, barriers=[barrier])
grid.levels["lden"] # (nrows, ncols), north-up
table = rn.exposure_statistics(res.lden, population=3.0, round_to=100)
print(table.to_text("People per Lden band"))
See examples/quickstart.py for a complete script.
Command line
roadnoise emission --flow 1200 --speed 50 --heavy 0.08
roadnoise emission --flow 1200 --speed 90 --heavy 0.15 --surface "2-layer ZOAB" --json
roadnoise grid roads.geojson --cell 10 -o lden.asc # ESRI ASCII grid
roadnoise grid roads.geojson --cell 10 -o lden.tif # needs roadnoise[raster]
roadnoise grid roads.geojson --cell 10 -o map.asc --indicator all --barriers walls.geojson
roadnoise receivers roads.geojson dwellings.geojson -o out.geojson \
--population-field population --round-to 100
roadnoise crtn --flow 20000 --speed 75 --heavy-pct 10 --distance 20
roadnoise surfaces
Common propagation options: --method cnossos|iso9613, --ground G,
--temperature, --humidity, --max-distance, --segment, --facade,
--buildings, --barriers, --assume-projected.
GeoJSON input
Coordinates must be in a projected CRS in metres. Files without a legacy crs
member whose coordinates look like longitude/latitude are rejected (override with
--assume-projected). Road properties (case-insensitive):
| property | meaning |
|---|---|
AADT |
annual average daily traffic (veh/day); or give q_day, q_evening, q_night (veh/h) |
heavy / heavy_pct |
heavy-vehicle fraction (0–1) / percentage |
speed, speed_heavy |
km/h (default 50; heavy defaults to speed) |
medium_share |
share of heavy vehicles that are category 2 (default 0 → all category 3) |
two_wheeler |
motorcycle fraction (category 4b) |
surface |
Table F-4 surface name (roadnoise surfaces) |
gradient |
% (applied half uphill, half downhill) |
temperature, studded_ratio, studded_months |
emission corrections |
Barriers: LineStrings with height (m). Buildings: Polygons with height (m).
Receivers: Points with optional height (m) or a Z coordinate.
What is implemented, and how it was checked
Coefficient tables (all shipped, none are placeholders)
| table | source | verification |
|---|---|---|
| F-1 AR, BR, AP, BP (cat. 1, 2, 3, 4a, 4b) | Directive (EU) 2021/1226, Annex point (19)(a) | 160 values machine-compared with the EUR-Lex text of the directive |
| F-4 road surfaces αi,m, βm, validity speeds (15 surfaces) | Directive (EU) 2021/1226, Annex point (19)(b) | 540 values machine-compared with the EUR-Lex text |
| F-2 studded tyres ai, bi | Directive (EU) 2015/996, Appendix F (not replaced in 2021) | transcribed from the Official Journal PDF and checked by hand |
| F-3 acceleration CR, CP | Directive (EU) 2015/996, Appendix F (not replaced in 2021) | transcribed from the Official Journal PDF and checked by hand |
| Km temperature coefficients | Annex II §2.2.3, formula (2.2.10) | from the text |
| A-weighting AWCf,i | Directive (EU) 2021/1226, amendment to §2.5.5 | from the text |
Note that the 2021 Table F-1 differs from the 2015 one (e.g. category 1
AR at 1 kHz is 100.1 dB, not 97.3 dB) – older tools may still use the
2015 numbers. Category 5 has no coefficients in either directive: it raises an error
unless you supply coefficients with load_coefficients_csv() (format:
category,coefficient,63,…,8000 with rows AR, BR, AP, BP; values are range-checked).
National road surfaces can be loaded with load_surface_csv()
(name,category,63,…,8000,beta[,v_min,v_max]).
Emission formulas (Annex II §2.2)
(2.2.1) line source, (2.2.2)–(2.2.3) total power and the 20 km/h floor, (2.2.4)–(2.2.5) rolling noise, (2.2.6)–(2.2.9) studded tyres, (2.2.10) temperature, (2.2.11)–(2.2.12) propulsion, (2.2.13)–(2.2.16) gradient, (2.2.17)–(2.2.18) acceleration near junctions, (2.2.19)–(2.2.20) road surface (with a warning outside the validity speed range).
Propagation
- Adiv = 20 lg d + 11 (2.5.12); Aatm = α d / 1000 (2.5.13).
- α from the ISO 9613-1 pure-tone formulae at exact band mid-frequencies. The implementation reproduces ISO 9613-2 Table 2 (e.g. 20 °C / 70 %: 0.1, 0.3, 1.1, 2.8, 5.0, 9.0, 22.9, 76.6 dB/km) at all six tabulated temperature/humidity pairs to the printed precision (unit-tested).
- CNOSSOS-EU ground effect (2.5.14)–(2.5.20) for homogeneous and favourable conditions with Gs = 0 for the road platform; long-term level (2.5.9) with an occurrence p per period.
- CNOSSOS-EU diffraction (2.5.21) with C″ = 1 (single edge), Δground(S,O) and Δground(O,R) as amended in 2021, curved-ray path differences in favourable conditions (2.5.24)–(2.5.27), and the 2021 diffraction criterion (δ > −λ/20 and the Rayleigh criterion δ > λ/4 − δ*).
- ISO 9613-2: general ground method (Table 3), alternative A-weighted method (eq. 10), Dz with Kmet (eq. 14, 18) capped at 20 dB, Abar = Dz − Agr ≥ 0, optional Cmet.
- Maekawa barrier attenuation in the Kurze–Anderson closed form.
The 2015/2021 Official Journal prints the ground-effect and diffraction equations as images. They were implemented from the published formula structure (term names, bounds, special cases quoted in the text) together with the standard CNOSSOS-EU formulation, and are unit-tested against independent hand calculations of those equations – but they could not be compared character-by-character with the OJ text.
CRTN (UK, 1988)
Basic noise level (18 h and 1 h), speed and % heavy correction, gradient (+0.3 dB/%), road surface, distance, ground cover, angle of view and +2.5 dB facade. Not implemented: the barrier chart, the gradient speed reduction, the low-flow correction and conversions from LA10 to Lden. CRTN predicts LA10,18h, not an END indicator; use it as a cross-check only. The Nordic prediction methods are not included.
Validation in the test suite
ISO 9613-2 Table 2 absorption values; hand calculations of every emission correction and of the ground and diffraction equations; energetic summation (60 ⊕ 60 = 63.01 dB, ten equal sources +10 dB); Lden (equal levels give L + 6.39 dB, Member-State period variants); flow doubling +3.01 dB; a long, finely segmented road over hard ground matches the analytic line-source integral L = LW′ − 10 lg(4d) + 3 within 0.05 dB; symmetry and monotonic decay with distance; higher barriers shield more; CRTN reference point (75 km/h, 0 % heavy gives a 0 dB speed correction; 20 000 veh/18 h gives a basic noise level of 72.1 dB(A)). Coverage is above 95 %.
Differences to full CNOSSOS-EU
roadnoise deliberately simplifies the propagation part. Results can differ
significantly from a conformant CNOSSOS-EU implementation, in particular in
built-up areas:
- Flat ground only. No digital terrain model, no mean ground plane per path, no equivalent heights, no embankments or cuttings; ground factor G is uniform.
- No path finding. One straight vertical propagation plane per source–receiver pair; no "rubber-band" convex hull and no multiple diffraction: only the single most effective edge (largest path difference) is used, so thick buildings and double barriers are under-estimated.
- No lateral (vertical-edge) diffraction and no reflections from facades or barriers (image sources). The optional +3 dB facade term is a flat correction.
- Barriers and building walls are thin edges at their top height; absorption of barrier surfaces is ignored.
- The favourable-condition occurrences p (defaults day 0.5, evening 0.75, night 1.0) are screening assumptions, not directional meteorological statistics.
- The AADT → hourly-flow split (default 70 % day / 20 % evening / 10 % night) and the
heavy-vehicle split (default all category 3) are placeholder assumptions;
provide
q_day/q_evening/q_night,medium_shareand counts where available. - No statistical urban approach, no population/dwelling assignment rules of Annex II §2.8 beyond the facade receiver helper and the per-band exposure table.
- Sound power is computed once per road and per END period; there is no hourly traffic model.
Citation
If you use roadnoise, please cite it via CITATION.cff. Key references:
- Directive 2002/49/EC of the European Parliament and of the Council relating to the assessment and management of environmental noise (OJ L 189, 18.7.2002).
- Commission Directive (EU) 2015/996 establishing common noise assessment methods (OJ L 168, 1.7.2015).
- Commission Delegated Directive (EU) 2021/1226 amending, for the purposes of adapting to scientific and technical progress, Annex II to Directive 2002/49/EC as regards common noise assessment methods (OJ L 269, 28.7.2021).
- Kephalopoulos S., Paviotti M., Anfosso-Lédée F. (2012). Common noise assessment methods in Europe (CNOSSOS-EU). JRC Reference Report EUR 25379 EN.
- ISO 9613-1:1993 Acoustics – Attenuation of sound during propagation outdoors – Part 1: Calculation of the absorption of sound by the atmosphere.
- ISO 9613-2:1996 Part 2: General method of calculation.
- Maekawa Z. (1968). Noise reduction by screens. Applied Acoustics 1(3), 157–173; Kurze U. J., Anderson G. S. (1971). Sound attenuation by barriers. Applied Acoustics 4(1), 35–53.
- Department of Transport and Welsh Office (1988). Calculation of Road Traffic Noise. HMSO, London.
License
MIT © Yusuf Eminoğlu
Metadata
Release files for roadnoise 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| roadnoise-0.1.0.tar.gz | 64.7 kB | With provenance | Details for roadnoise-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| roadnoise-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for roadnoise-0.1.0-py3-none-any.whl |
Total release size: 114.4 kB
Release files / roadnoise-0.1.0.tar.gz
| Download URL | roadnoise-0.1.0.tar.gz |
|---|---|
| Size | 64.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ecf361d41136a209515a17e22fff3d64749c842f1cb449ab02e12ee6a7263535
|
|
BLAKE2b-256 checksum How to use checksums |
347f3d5fc4f3897301c361473a0d6d883a0bf386587ece1cf4bc02c1b14d7352
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logRelease files / roadnoise-0.1.0-py3-none-any.whl
| Download URL | roadnoise-0.1.0-py3-none-any.whl |
|---|---|
| Size | 49.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
25a6ca9f9fe36427d100277959ab6ee91155a4c0a4398577841e542bf15e6013
|
|
BLAKE2b-256 checksum How to use checksums |
a294a82d98f886a3e4294639dba040805dc89c8e0a7ff45c844f935de51db868
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logSecurity for roadnoise 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for roadnoise-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.