All notable changes to this project are documented here.
Format based on Keep a Changelog. Versioning follows Semantic Versioning.
- Sport category in the Events (OEDB) layer, with its own legend row, colour and 🏉 marker — first entries are two Fédérale 2 rugby matches (Avignon Le Pontet, Cavaillon) served by oedb-rs.
- Wikidata links in event popups: when an event carries
type_wikidata,place_wikidataorwikidataQIDs, the popup shows them as links to wikidata.org. - Marker clustering on the Events layer (Leaflet.markercluster): nearby events (e.g. the four spread-out Jeudis d'Orange evenings) group into a category-coloured count badge that splits apart on zoom.
- "Ajouter événement" shortcut under the Events legend, deep-linking to the submission form on the oedb-rs site.
- Single-day events now render a compact "weekday day month · HH:MM → HH:MM" period in their popup instead of the verbose "du … au …" range.
- "Events (OEDB)" incubator layer, fed by a brand-new companion repository: oedb-rs, a static OpenEventDatabase-compatible instance written in Rust and served by GitHub Pages. It ingests the Bison Futé DATEX II feed filtered on Vaucluse (
traffic.accident,traffic.roadwork,traffic.jam, …) plus manually curated events (the Jeudis d'Orange night markets,culture.market.night), purges expired events, and rebuilds every 3 hours. - Read API compatible with OEDB:
GET /api/event.json(GeoJSON FeatureCollection with OEDB properties),GET /api/event/{id}.json,GET /api/stats.json; sector queries (bbox,what,when) are provided client-side byoedb-client.js. - Write path via GitHub issues (on the companion repository): a form on the oedb-rs Pages site (map click to pick the position) pre-fills a GitHub issue form; adding the
approvedlabel triggers a rebuild that validates, persists and publishes the event. - The dataroads layer follows the standard incubator pattern: per-category legend rows (Accidents, Travaux, Bouchons, Culture, Autres) with clickable subtype filtering, freshness chip (3-hour schedule), URL state (
oedb), and category-coloured emoji markers with detailed popups (dates, place, source).
- Clusters are rebuilt after filtering their contents. Stop/give-way filtering already clears and recomputes its screen-grid clusters; network hierarchy likewise rebuilds route-label clusters. Bridge clusters now also recompute their size, label and tooltip after toggling Panoramax or Mapillary, using only photos from providers that remain visible.
- Clickable legend subtype rows, matching the network hierarchy. A complete row now hides or shows its subtype independently, dims when disabled, supports keyboard activation, and puts the parent layer eye in a partial state. This applies to roadside areas, bicycle routes, construction/proposed roads, accident severity, traffic levels, current road-event types, stop/give-way signs, and webcam categories.
- Roadside-area filtering is now genuinely cartographic. Car-pooling areas, rest areas, park-and-ride and laybys are stored in separate Leaflet subgroups, so clicking a legend row hides both the marker and any mapped footprint.
- User guides updated in French and English with the three visibility levels (family, layer, subtype).
- Real root cause of the Panoramax link opening our own map.
roadsidePhotosHtmlruns outside the mainDOMContentLoadedblock, so it can only reach helpers exposed onwindow(as Mapillary already was).panoramaxPageUrl/panoramaxImageUrlwere never exposed, so the reference resolved toundefinedand the thumbnail href fell back to#— clicking then opened dataroads itself (its map) in a new tab. Nowwindow.panoramaxPageUrl/window.panoramaxImageUrlare exposed and used, so the Panoramax thumbnail opens the real picture, symmetrically to Mapillary.
- Centralised the Panoramax/Mapillary street-photo services. All image URLs, viewer permalinks and provider labels now live in a single
StreetPhotoservice used by both the bridges and the roadside-area layers (backward-compatible wrappers kept), removing the previously duplicated helpers (providerLabel/bridgeProviderLabel, scattered URL builders).
- Panoramax viewer link uses the app's own canonical permalink. Following the format produced by the Panoramax viewer's own "Share" button —
${origin}/#focus=pic&pic=<id>(hash, not query) — instead of the earlier query-string guesses that fell back to the map.
- Clicking a roadside-area photo no longer closes the popup. The thumbnail now opens the source viewer in a new tab via an explicit handler that stops event propagation (keeps the Leaflet popup open) and opens exactly one tab.
- Legend label simplified. "Aires d'arrêt (layby)" is now just "Aires d'arrêt".
- Panoramax photo link now really opens the picture (not the map). Root cause found in the Panoramax web viewer: it decides the initial focus with
href.includes("&focus=pic"), sofocus=picmust be preceded by&. Our URL started with?focus=pic&…, so the check failed and it fell back to the map. Reordered to?pic=…&seq=…&focus=pic, making Panoramax behave symmetrically to the Mapillary link.
- Roadside-area photos open the sequence directly. Clicking a nearby Mapillary/Panoramax thumbnail now opens the source viewer (playable sequence) in a new tab instead of a lightbox. Removed the intermediate lightbox and the "▶ Séquence" caption link; the thumbnail hover icon is now an external-link arrow (↗).
- Panoramax sequence now opens on the origin instance viewer. Targeting the federated meta-catalog viewer (
api.panoramax.xyz) landed on the coverage map instead of the picture. Each photo's origin instance is now derived from its STACvialink (e.g.panoramax.openstreetmap.fr), which hosts a real picture viewer and shares the samepic/seqUUIDs, so "▶ Séquence" opens the focused, playable picture. Falls back topanoramax.openstreetmap.frifviais absent.
- Panoramax sequence link opened the wrong viewer. The link pointed to
panoramax.openstreetmap.fr, but nearby photos are fetched from the federatedapi.panoramax.xyzcatalog, whose UUIDs are only resolved by that host's viewer — so it fell back to the map. The "▶ Séquence" link now targetshttps://api.panoramax.xyz/?focus=pic&pic=…&seq=…. Caption shortened to "▶ Séquence".
- Panoramax "open source" link now reaches the playable sequence instead of the world map. The viewer URL used the legacy v3 hash format (
#focus=pic&pic=…); Panoramax v4 reads parameters from the query part (?focus=pic&pic=…), so the old link silently fell back to the map. Switched to the?format and added the sequence id (&seq=…, from the picture'scollection) so the picture opens focused and playable. Lightbox caption updated to "▶ ouvrir la séquence jouable".
- Laybys (
parking=layby) as a fourth roadside-area category. Roadside stopping areas along departmental roads (amenity=parking+parking=layby) now have their own legend row, counter and orange marker ("Aires d'arrêt"), fulfilling the first bullet of issue #7. Dataset grows to 213 areas (rest_area 109, layby 50, car_pooling 32, park_ride 22).
- Roadside areas mapped as relations are now included. Parkings/rest areas/car-pooling tagged on a multipolygon relation (e.g. the Parking de l'Île Piot P+R in Avignon,
relation/6543907) were missing: the Overpass query only fetched nodes/ways, andout tags geom;did not expand relation members. Switched toout geom;and addedrelation(...)for all three area types, assembling outer/inner rings into Polygon/MultiPolygon. - Wikidata link preserved on areas. The
wikidata(andwikimedia_commons) tag was being dropped by the converter, so the popup wrongly showed "aucun lien" even when present (Île Piot carriesQ113994752). It is now kept, along withalt_name,maxstay,maxheight,supervised.
- Surfacic footprint for roadside areas. When the OSM object is an area (149/160 features), the actual footprint is now drawn as a polygon with a light fill coordinated with the category colour, plus a centred marker; clicking the polygon opens the marker popup.
- Photo lightbox. Clicking a nearby Mapillary/Panoramax thumbnail now opens it enlarged in an in-app lightbox (Esc / click to close, link to the source), instead of leaving straight to the provider site.
- Wikidata signalling. Roadside-area popups now show the Wikidata link when present (
Qxxx →) and explicitly flag "aucun lien" when missing.
- Merged the two redundant "… sur OSM" buttons into a single OpenStreetMap line with compact voir / compléter actions.
- Panoramax accent aligned to the project's violet (
#7C3AED).
- Completeness & street-level photos on roadside areas. Each roadside-area popup now shows an OSM completeness indicator (present/missing key attributes: name, capacity, access, surface, lit, operator — with a score) plus nearby street-level photos from both Mapillary and Panoramax, fetched on popup open around the area (e.g. coverage exists on RD 950). Added View / Improve in OSM links to invite contribution. New Panoramax proximity search (
/api/searchby bbox, nearest picture within ~130 m).
- Roadside areas & car-pooling layer (issue #7). A new "Aires d'arrêt & covoiturage" section in the factual cartography family (not the incubator) surfaces related CD84 themes along departmental roads, sourced from OpenStreetMap: car-pooling areas 🚗 (
amenity=car_pooling), rest areas 🌳 (highway=rest_area) and park-and-ride🅿️ (amenity=parking+park_ride). One toggle, three legend swatches with per-category counters, distinct map markers and click-through popups (type, capacity, operator, access, OSM link). URL layer codeaires. roadside-areasOverpass dataset.scripts/update_osm_geojson.pynow buildsdata/osm/roadside-areas.geojson(160 points), refreshed on the usual twice-weekly OSM schedule. Parking is deliberately restricted to park-and-ride sites (excludingpark_ride=no) to stay on roadside stopping areas rather than the ~8,000 private car parks of the department.
- Native Waze traffic layer (issue #10). The "W" button can now render community Waze traffic as a real Leaflet layer instead of only the iframe: jam lines coloured by severity (level/speed) and incident markers (💥 accident,
⚠️ hazard, 🚧 roadworks, ⛔ road closed, 👮 police), with click-through popups (road, speed, delay, freshness). It activates automatically when a Waze for Cities partner feed is configured. WAZE_FEED_URLsecret +data/external/waze.geojsonpipeline.scripts/update_external_data.pynow fetches the official partner feed (alerts + jams) and converts it to GeoJSON on the usual 3 h schedule. Without the secret it writes aconfigured:falseplaceholder and the front-end keeps the Live Map iframe as a fallback.
- The Waze toolbar button dynamically chooses native layer vs. iframe fallback; tooltip updated accordingly.
- The unofficial Waze live-map endpoint returns HTTP 403 to datacenter IPs (GitHub Actions included) and cannot be scraped server-side, so the native layer is fed by the legal, server-reachable Waze for Cities feed. See README ("Activer la couche Waze native").
- Accident severity is now read from a black ring rather than size. Hospitalised injuries and slight injuries share the same dot radius (they were hard to tell apart); hospitalised and fatal crashes get a black ring, slight injuries keep a thin white outline. Only fatal crashes stay slightly enlarged. Legend and guides updated accordingly.
- Multi-year accidentology cloud (BAAC / ONISR): the road-safety layer now shows 2019→2024 injury crashes geolocated across the Vaucluse (1,923 points) instead of the single 2024 vintage. Inspired by loicbertrand.eu/accidents, it uses a dual visual encoding — colour = recency (recent crashes vivid/saturated orange, older ones dark red) and size = severity (fatal > hospitalised > slight). Points are drawn on a Leaflet canvas renderer for smoothness.
- Temporal dataviz in the legend: an old→recent colour scale, a per-year histogram of crash counts (colour-coded by recency), and a year-range slider (from / to) that filters the cloud live; per-severity counters update to the selected range.
scripts/build_accidents_vaucluse.py: reproducible builder that resolves the BAAC resource URLs via the data.gouv API (handling the inconsistent file names, incl. thecarcteristiquestypo), downloads Caractéristiques + Usagers per year, filters department 84, joins the worst per-accident severity, resolves commune names viageo.api.gouv.fr, and emits a compactdata/static/accidents-vaucluse.geojson.
- BAAC geolocation is patchier for older millésimes, so the cloud is denser on recent years — which also reinforces the "evolution over time" reading.
0.8.2 - 2026-07-21
- Waze Live Map embed now uses the French locale (
/fr/→ French UI and kilometres) and drops a pin at the centre, making the recentring on the current dataroads view explicit. (The embed already opened centred on the map's current position and zoom; confirmed against the official Waze iFrame parameterslat/lon/zoom.)
- User guide refreshed (FR
guide.htmlfromdocs/guide.wiki, and ENguide.en.htmlby hand) for the recent counting features: value badges (e.g.22k), multi-vintage evolution chart, station → road-axis highlight, and the new Waze "W" toolbar button. README (FR/EN) clarified: the FR guide is generated from the wiki, the EN guide is maintained by hand.
0.8.1 - 2026-07-21
- Waze toolbar button is now a compact "W" glyph button (matching the Mapillary "M" and Panoramax "P" buttons), placed to the left of the "M" button; its active state turns cyan while the live-map modal is open.
0.8.0 - 2026-07-21
- Traffic-count value badges (issue #15): counting stations now display the rounded AADT inside the circle (e.g.
22kfor 22,136 véh/j,5,3k, or the raw number below 1000), so the magnitude is readable at a glance without relying on colour. Circles remain sized by traffic threshold.
- Network-stats AADT range no longer depends on parsing popup HTML (which broke when the popup label changed to
véh/j): the numeric AADT is now stored on each station marker.
- Counting stations are rendered as
divIconbadges instead of plain SVG circles; hover feedback moved to CSS.
0.7.1 - 2026-07-21
- Counting station UX (issue #9 follow-up): clicking a station now draws a distinct indigo accent trace (with a white casing) over the road axis instead of reusing the hierarchy glow, so the road reads clearly as a line and no longer blends with the round count markers.
- Counting-station popup redesigned: wider and offset, with a compact header, the multi-year evolution chart moved to the top, and a two-column stats grid (MJA, taux PL, débit PL, classe) for better use of space.
0.7.0 - 2026-07-21
- Counting station → road axis highlight (issue #9): clicking a traffic-counting station now highlights the matching departmental road axis on the map (glow effect) and shows the axis details in the side panel, contextualising the count. Route matching is space/case-insensitive so CD84
D975resolves to OSMD 975.
highlightRoute()accepts anoptions.zoomflag; highlighting from a station click keeps the current view (no auto-recentre) so the station popup stays visible.
0.6.0 - 2026-07-21
- Real-time Waze traffic layer (issue #10): new "Waze" toolbar button opening the official Waze Live Map embed in a modal, showing community-reported jams and incidents in real time. The iframe is lazy-loaded and centred on the current map view when opened, and unloaded on close so it never polls in the background. Waze exposes no open data API for arbitrary areas, so this is the embed-based approach (no credentials); a Waze for Cities (CCP) feed could later add native markers if the department obtains one.
0.5.0 - 2026-07-21
- Traffic evolution per counting station (issue #23): counting-station popups now embed an inline SVG sparkline of the yearly AADT (MJA) history using the full multi-vintage data.gouv.fr / DataSud series (1996–2025), instead of only the latest year. A first→last trend indicator shows the absolute and percentage change over the period (▲/▼/▬ with cherry-red for increase, green for decrease), plus the number of vintages and the first→last values.
- Traffic-count loading keeps the complete yearly history per station (
stationsById) while still styling the marker by the most recent vintage.
- New compact Panoramax "P" toolbar button (vector-tile coverage traces), next to the Mapillary "M".
- New "Panneaux directionnels" layer (OSM
information=guidepost, ~2000 nodes in Vaucluse): clustered when zoomed out, real signposts at zoom ≥ 15, destination list in the popup, and a nearby Mapillary photo (green ring) when coverage exists — same behaviour as the stop/give-way layer. update_osm_geojson.pynow accepts dataset name arguments to refresh a single cache (e.g.python scripts/update_osm_geojson.py guideposts).
- Mapillary toolbar button shrunk to a compact stylised "M" to save toolbar space.
- Guidepost markers redesigned as real fingerposts (post + pointed direction blades, green dot for nearby Mapillary coverage) so they no longer look like speed/size limitation signs.
- Limitations: speed pictograms are now clustered when zoomed out (click a cluster to zoom in) and shown individually at zoom ≥ 13, so they are visible from the base zoom without cluttering the map.
- Limitations: size/weight restriction pictograms (height, width, weight, length) are now included in the same clusters as speed signs, and de-duplicated by type + value + ~1 km (like speed) so a sign carried by several overlapping way-segments no longer escapes the clusters as a stray picto.
- Limitations: dimension icons made semantically consistent — max width is now a horizontal arrow (
↔️ ), max height a vertical arrow (↕️ ) and max length a ruler (📏). - "Comptages CD84" toolbar button renamed to "Comptages"; "Panneaux directionnels" legend title now stacks "directionnels" as a smaller grey subtitle.
- Comptages (traffic-count stations) recoloured on a cherry-red (high traffic) → light-pink (low traffic) gradient.
- Panoramax accent colour switched to violet across the bridge viewer, photo markers and source dots.
- Left-column legend sections are now clearly delimited cards with a dark contour, so each feature's start/end is obvious at a glance.
- Removed the bridge hint text entirely ("Activez la couche, puis cliquez un pont." / "Cliquez un pont pour ouvrir la vue 3D.").
- "Convois exceptionnels" toolbar button hidden and disconnected (redundant with the road-hierarchy filters, little added value).
- "Sources photo" section (Panoramax 84 / Mapillary) removed from the left column to reduce clutter.
- iNaturalist clicks still missed intermittently with ENS visible: map snap-to-nearest observation, ENS pointer-events re-applied after pan/zoom, and explicit popup on marker click.
- iNaturalist markers scale with zoom (48px+ hit area); ENS polygons are non-interactive while observations are shown.
- iNaturalist markers use a 40px hit target on the marker pane (above ENS polygons); visual dots are 14–16px.
- Incubator bridge freshness label aligned with the real bi-weekly OSM GeoJSON workflow (Mon & Thu).
- User guide and bridge zoom hint updated for current cluster/geometry behaviour.
- iNaturalist observations were hard to click when ENS zones were visible: enlarged targets and correct layer stacking.
- Blank basemap after page refresh with bridges active: stop clearing Carto tiles on every zoom end; recover with a soft layout check instead of
redraw().
- Bridge clusters: smaller markers, tighter merge radius, and no cluster blobs once the OSM geometry profile is visible.
- Blank basemap when toggling or zooming the bridges layer: Carto tiles are kept at the back with retry on load errors.
- Ugly bridge rendering during rapid zoom +/-: markers hidden while zooming, debounced refresh, and geometry hysteresis.
- Redundant bridge geometry popup removed; click opens the analysis viewer directly.
- Collapsible legend sidebar on desktop; slide-out drawer on mobile (swipe and drag to dismiss).
- Bridge analysis panel: schematic view, photo gallery, and OSM metadata.
- Layer visibility icons no longer disappear after refreshing Bison Futé or construction data.
- Bridge clusters remain clickable at zoom 12+ when the geometry profile is shown.
0.3.1 - 2026-06-06
- Incubateur — Webcams: curated static layer (Bonpas traffic CD84, Mont Serein, Chalet Reynard) with map markers and external stream links.
- Guide utilisateur: incubator section for webcams; URL layer code
wcam.
0.3.0 - 2026-06-12
- Incubateur: bridges (OSM clusters, schematic viewer, Panoramax/Mapillary), ENS zones, and iNaturalist observations.
- Chiffres clés KPI dashboard; weather stations in Temps réel.
- Map URL state (viewport and layers) and home button to reset the department view.
- More compact header and sidebar; fixed repo link and version in the sidebar foot.
- Véloroutes hierarchy colours (EV17, EV8, V861); unified family and layer visibility controls.
- Bridge cluster markers, layer sync, and cluster click zoom.
- URL zoom and layer persistence; ENS/iNaturalist no longer dropped by background preload.
- GitHub Actions data workflows: rebase before push on concurrent updates.
0.2.1 - 2026-05-30
- Documentation fully translated to English: README, CHANGELOG, HTML meta tags, and JavaScript module headers.
- Polished GitHub README with live-demo badge, dataset table, and repository layout.
0.2.0 - 2026-05-30
- Bicycle routes layer: OSM
route=bicyclerelations for Vaucluse, weekly cache. VERSIONfile andscripts/project_meta.py/scripts/bump_version.pyfor centralized semver.CHANGELOG.md.
- Repository references aligned with
dataroads-FR84; footer redesigned (README credit + discreet repo link + version number). - Source freshness badges restyled to neutral gray pills.
- Bicycle routes placed before construction roads in the legend.
- Construction-roads Overpass query fixed (department 84 filter); Python script and map display criteria harmonized.
- Construction layer UX: no popup when empty; zero counts are sufficient.
- Empty
construction-roads.geojsoncache caused by an invalid Overpass query (administrative area misplaced inside a union).
0.1.0 - 2026-05-17
- Web map prototype: Vaucluse departmental network, communes, department boundary, 2024 crash data, CD84 traffic counts, Info Routière events, Avignon weather, OSM quality panel.
- Data refresh scripts
update_osm_geojson.pyandupdate_external_data.py. - GitHub Pages deployment and automated data-refresh workflows.