🌊

National Badevandsvarsel

Henter udløbspunkter fra Miljøportalen…
Aktive varsler 0
Ingen aktive varsler
Mine favoritter 0
🤍Ingen favoritter — klik ❤️ på et punkt i kortet
Om Risiko

National Badevandsvarsel · Danmarks vandmiljø

Et screeningsværktøj der visualiserer forureningsrisiko fra regnbetingede kloakoverløb (CSO) ved alle aktive udløbspunkter i Danmark, baseret på officielle PULS-data, VP3 vandområdeplandata, DMI/Open-Meteo-nedbørsmodel og CMEMS' Østersø-havmodel.

Formål

Regnbetingede udløb opstår når nedbør overstiger kapaciteten i fælleskloakerede systemer, og urenset spildevand ledes direkte til vandmiljøet. Kortet beregner en løbende forureningsrisiko per udløbspunkt ud fra historisk overløbsfrekvens, observeret og prognosticeret nedbør samt sæsonafhængig patogenoverlevelse. Risikoen kobles til målsatte kystvandområder og EU-badevandslokaliteter via Miljøstyrelsens vandområdeplaner (VP3).

Værktøjet er til screening og forskning. Risikoscorerne er modelbaserede estimater — ikke målte forureningskoncentrationer — og erstatter ikke officielle badevandsvarsler fra Miljøstyrelsen.

Datakilder

KildeIndholdLicens / opdatering
PULS stamdata
vRegnbetingedeUdloebStamdata
21.556 aktive udløb: navn, kommune, recipient vandområde, koordinaterÅbne data · årlig
PULS udledning
vRegnbetingedeUdloebUdledning
Årlig udledt volumen (m³) og antal overløbshændelser per udløb per årÅbne data · årlig
Open-Meteo / DMI
HARMONIE AROME 2 km
Timevis nedbør: 7 dages historik + 48t prognose inkl. rådata per timeCC BY 4.0 · 4×/døgn
VP3 vandområdeplaner
vp3_2endelig2025 (WFS)
Kystvandområder, badevandslokaliteter og RBU-punkter fra vandområdeplanerne 2021–2027 efter genbesøget (dec. 2025)Åbne data · ved planrevision
VP3 søer og vandløb
vp3_2e2025_soe_samlet / vandloeb_samlet
Geometri for søer (polygoner) og vandløb (linjer) — bruges til at maskere alge- og strømvisualisering til reelle vandområderÅbne data · ved planrevision
VP3 RBU-register
forb_id-felt i RBU-laget
Myndighedsfastsat officiel recipient for en delmængde (~1%) af RBU-punkterne — højeste prioritet i søvurderingens Trin 0, se SøvurderingÅbne data · ved planrevision
DHM Højdekurver
DHMHoejdekurver_Kote2_5 (Datafordeleren GraphQL)
Konturpunkter (2,5 m ækvidistance) brugt til flow-retning mellem ID15-oplande i sø-, kystvand- og vandløbsvurderingens ID15-metoderÅbne data · Datafordeleren
DCE ID15-delvandoplande
landbrugsgeodata.fvm.dk
3.355 autoritative delvandoplande fra Aarhus Universitets nationale kvælstofmodel — grundlaget for søers, kystvandes og vandløbslinjers opstrøms-/retningsmatchingÅbne data · ved modelrevision
CMEMS Østersø-model
cmems_mod_bal_phy_anfc_PT1H-i
Strømretning og -hastighed (uo/vo) samt havvandstemperatur (thetao) for danske farvande, ~10 km opløsning, hentet via Copernicus Marine ToolboxCopernicus-licens · time-vis
OpenStreetMapBaggrundskortODbL

De to PULS-datasæt samkøres på udløbets navn. Volumen angives i kubikmeter i kilden og omregnes til liter ved visning (1 m³ = 1.000 L). VP3-data hentes som GeoJSON via Miljøministeriets WFS-tjeneste og gemmes som statiske filer. CMEMS-strømdata hentes server-side hver time og cachés både på serveren og i browserens lokale lager. Søers, kystvandes og vandløbslinjers ID15-baserede matching (RBU-koblinger, ID15-flow-graf, rejsetider, kystvand-gruppering og vandløbsretning) er en engangs/periodisk offline-beregning (se scripts/id15/), ikke en runtime-forespørgsel — resultatet gemmes som statiske JSON-filer (id15-lake-matches.json, id15-kystvand-matches.json, vandlob-directions.json), appen henter ved indlæsning. Selve søernes matching sker i to trin: match-lakes-via-id15.js bygger den terrænbaserede opstrøms-mængde og markerer usikre (kanal-tvetydige) udløb, hvorefter resolve-canal-ambiguity.py afgør dem geometrisk (punkt-til-polygon-afstand mod søernes faktiske form, ikke deres grove opland) — se Søvurdering for den fulde begrundelse.

CMEMS / Copernicus Marine

Strøm- og havtemperaturdata kommer fra Copernicus Marine Service (CMEMS) — EU's operationelle havovervågningstjeneste under Copernicus-programmet, drevet af Mercator Océan International på vegne af EU. Den fulde datakatalog og dokumentation findes på data.marine.copernicus.eu.

Konkret bruger appen produktet BALTICSEA_ANALYSISFORECAST_PHY_003_006 (datasæt-id cmems_mod_bal_phy_anfc_PT1H-i) — en analyse-/prognosemodel for fysiske forhold i Østersøen og danske indre farvande, med timevis opløsning og ~10 km rumlig gitterstørrelse. Herfra hentes tre variable:

  • uo, vo — øst-/nordgående strømkomponenter (m/s), brugt til strøm-kortlaget og opstrøms-vægtningen i badevandsvurderingen
  • thetao — havvands potentielle temperatur (°C), brugt som direkte input til algerisiko-modellen for kystvande

Data hentes server-side via det officielle copernicusmarine Python-værktøj (pypi.org/project/copernicusmarine), som kræver en gratis Copernicus Marine-brugerkonto. Hentningen sker hver time og gemmes både på serveren (persisteret på tværs af genstarter) og lokalt i browserens IndexedDB.

CMEMS-modellen er en videnskabeligt valideret oceanografisk model — markant mere pålidelig end appens egne heuristiske risikomodeller (se "Modelgennemgang & pålidelighed" nedenfor). Usikkerheden i vores brug af data stammer primært fra den relativt grove ~10 km opløsning, som kan afvige fra lokale forhold i smalle sunde, fjorde og havne.

Kortlag

Kortet indeholder ti toggelbare lag under Danmark-fanen:

LagIndholdFarvelogik
🌡 Bakterielt kortVarmekort over alle 21.556 udløbspunkterGrøn → amber → rød efter bakteriel risikoscore
🧬 Viralt kortVarmekort med separat viral risikomodelLilla gradient — vira overlever markant længere om vinteren
🌿 AlgerisikoVarmekort baseret på næringsstof-proxy × temperatur-gate (se Badevandsvurdering)Gul → grøn gradient efter algerisiko-score — ikke maskeret til præcise vandområde-polygoner for søer/vandløb (kun kystvande), se Begrænsninger
📍 UdløbspunkterIndividuelle PULS-udløb som cirklerRadius og farve efter risikoniveau; grå/stiplet ved ingen data
⚡ 24h VarslingRing-markører ved udløb med forhøjet prognoserisikoRød stiplet ring ved forecastrisiko > 55 % og aktiv nedbør > 5 mm
🌊 Kystvande (VP3)Polygoner for de 109 målsatte kystvandområderGrøn/amber/rød udfyldning efter max af waterArea-tekstmatch og ID15-opstrøms-matching, se Kystvandvurdering
🔴 RBU-punkterVP3's regnbetingede udløbspunkter (RBU-registret) — officielt myndighedsregistrerede udledningssteder, adskilt fra PULS-udløbeneIngen risikofarvning — farve/størrelse/gennemsigtighed gradueres efter zoom-niveau (mere fremtrædende jo tættere man zoomer ind), rent informativt lag der viser hvor RBU-registrerede punkter fysisk ligger
🏖 BadevandsområderEU badevandsovervågningsstationer fra VP3. Klik åbner badevandsside med 7-dages nedbørsgraf, risikooversigt og opstrøms-matchede udløbCirkelmarkør i grøn/amber/rød ud fra bekræftet punkt-i-polygon-/punkt-nær-linje-match (sø → kystvand → vandløb); grå/"ukendt" hvis ingen bekræftet forbindelse — se Badevandsvurdering
〰 StrømRetningspile for havstrøm, kun over vandområder (testet mod VP3 kystvand-polygoner)Rotation = strømretning; farve/størrelse blå→gul→rød efter hastighed (0–1+ m/s)
🧭 VandløbsretningPile langs vandløbslinjer, der viser udledt strømretning — se Vandløbenes strømretningGrøn = sikker retning (>1 m højdeforskel mellem endepunkternes ID15-oplande); grå = usikker (retning vist, men under margen); ingen pil hvis retning ikke kunne afgøres

VP3-lagene indlæses fra statiske GeoJSON-filer ved opstart og farves når risikoberegningen er færdig. Alle lag håndhæves ved hvert vejrdatarefresh — slukket lag forbliver slukket selv ved automatisk opdatering.

Datakvalitet

Hvert udløbspunkt får en kvalitetskode efter hvor pålideligt overløbsgrundlaget er. Manglende data vises eksplicit — ingen værdier opfindes.

KodeBetydningAntal
Reelle dataFaktisk overløbsfrekvens + volumen fra PULS4.683
Verificeret nulBekræftet nul overløb det pågældende år14.554
EstimeretFrekvens beregnet fra volumen (log-log model, r=0,54)1.204
UtilstrækkeligHverken volumen eller frekvens oplyst1.115

Stamdata-feltet Outflow bruges ikke som datagrundlag — det er et designestimat, ikke en målt udledning, og er systematisk for lavt.

Risikomodel

Den aktive forureningsrisiko er produktet af overløbssandsynlighed og sværhedsgrad, begrænset til intervallet 0–1.

Overløbssandsynlighed
Poverløb = min( Pbase × I(nedbør) × 3 , 1 )
Pbase = antal overløb/år ÷ 73 (regnvejrsdage/år i DK)
Intensitetsfaktor — nul-forankret
I = sigmoid( (nedbør − 5) / 4 ) × ramp
ramp = clamp( (nedbør − 1) / 6 , 0 , 1 )
Ved 0 mm → I = 0. Ved 5 mm → I ≈ 0,33. Ved 12 mm → I ≈ 0,85. Nul nedbør giver altid nul risiko.
Sværhedsgrad
S = min( log₁₀(volumen/hændelse + 1) / 5 , 1 )
Samlet risiko
R = Poverløb × (0,6 + 0,4 × S)
Hvis nedbørsdata mangler returneres ingen risiko — punktet vises gråt og udløser aldrig varsel.
NiveauIntervalTolkning
LavR < 0,20Begrænset risiko
Moderat0,20–0,60Forhøjet — relevant ved badning og indvinding
Høj≥ 0,60Undgå kontakt med vandmiljøet

Nedbørsmodel

Antecedent nedbør — forudgående regn der mætter jord og fylder kloakker — er den primære udløsende faktor. Hver times nedbør de seneste 7 dage vægtes eksponentielt efter alder.

Vægtet antecedent nedbør
nedbør = Σ p(t) × e−alder(t) / τH
τH = 3,0 dage — hydrologisk hukommelse (jordmætning / kloakbelastning). Regn fra i går bidrager 72 %, fra 3 dage siden 37 %.

Nedbør hentes fra Open-Meteo (best_match — DMI HARMONIE-AROME for Danmark, ECMWF for Bornholm og randzoner) på et 0,25°-gitter (~17×28 km) over de ~170 celler med faktiske PULS-udløbspunkter. Serveren opvarmer proaktivt alle celler ved opstart og hvert 3. time — matcher DMI HARMONIE-modellens egen opdateringstakt, så data aldrig er ældre end kildens seneste modelkørsel — via individuelle enkelt-lokationskald med 10 parallelle forbindelser og 200 ms stagger. Samlet API-forbrug: ~1.360 kald/dag. Cache-TTL: 3 timer. Svar sendes med no-cache + ETag — 304 Not Modified ved uændret data.

GET /api/weather/allReturnerer hele det opvarmede grid. Hourly-arrays ekskluderet for at holde payload lille. no-cache + ETag — browser revaliderer altid, 304 ved uændret data.
GET /api/debugDiagnostik: cache-størrelse, varme celler, seneste fejl og sample-data.
GET /api/weather/hourlyTimevis nedbørsdata (hourlyObs + hourlyFore) hentes on-demand pr. celle når brugeren åbner et varselkort — ikke ved sideindlæsning. Reducerer initial payload markant.
GzipAlle API-svar komprimeres med gzip. JSON-payloads reduceres typisk 70–80% over wire.

Nedbørsgrafen i varselkortene viser −24t (grå søjler) og +24t prognose (blå søjler). Rød søjle markerer kraftig nedbør over 5 mm/t.

Patogenmodel

Når et overløb har fundet sted, aftager forureningen over tid. Bakterier og vira modelleres separat med sæsonafhængig henfaldstid τ, drevet af vandtemperatur og dagslys.

Bakteriel henfaldstid (E. coli, enterokokker)
τbakt = 1,0 × Q₁₀(20−T)/10 / L
Q₁₀ = 2,0 · T = vandtemperatur · L = dagslys/12. Sommer ≈ 0,6 dage, vinter ≈ 8 dage.
Viral henfaldstid (norovirus, coliphager)
τviral = 2,0 × Q₁₀,ᵥ(20−T)/10 / Lᵥ
Q₁₀,ᵥ = 4,0 · UV-effekt kun ved T ≥ 12 °C. Sommer ≈ 2,4 dage, vinter op til ≈ 40 dage.
Residualforurening med sedimentrebound
Rresidual(t) = 1,08 × e−t / τ
Sedimentrebound modellerer resuspension ~24t efter hændelse (Servais et al.). Kun for bakterier — ikke vira.

Genbrugt til søers opstrøms-matching: samme τ-model bruges til at nedvægte et opstrøms udløbs bidrag til en sø efter beregnet rejsetid dertil (se Søvurdering). Matematisk er e−(t+rejsetid)/τ identisk med at gange det allerede tids-henfaldne residual med endnu en faktor e−rejsetid/τ — samme fysik, ingen ny model, blot anvendt på transportafstand i stedet for kun "tid siden hændelse".

Badevandsvurdering

Badevandslokaliteterne fra VP3 (EU's badevandsovervågning) vises som en enkelt, samlet risikomarkør pr. lokalitet. Beregningen sker udelukkende server-side (se badevand-risk.js) og genberegnes hvert 15. minut for alle 1.039 badesteder samtidig. Farven bestemmes af tre kilder i prioriteret rækkefølge — alle tre kræver en bekræftet hydrologisk forbindelse, ikke blot geografisk nærhed.

Trin 1 — Sø: ligger badevandspunktet inden for (eller inden for en tolerancezone af) en målsat VP3-sø, bruges dens egen risikoberegning (se Søvurdering).

Trin 2 — Kystvand-polygon: ligger badevandspunktet ikke inden for nogen sø, men inden for et af de 109 målsatte kystvandområder, bruges dette i stedet (se Kystvandvurdering).

Trin 3 — Vandløb: ligger badevandspunktet hverken ved en sø eller et kystvand, men inden for en bufferzone af en vandløbslinje med bekræftet retning, bruges linjens egne opstrøms-matchede udløb. Er selve strømretningen for linjen markeret usikker, mærkes matchet tilsvarende "vandløb, usikker retning" i detaljepanelet.

Geometrisk match bruger en tolerancezone (~500 m), ikke et strengt punkt-i-polygon-krav. Et badevandspunkt lige uden for kanten af en forenklet sø-/kystvandpolygon (fx en bugt, hvor selve geometrifilen har afskåret et hjørne for at spare datamængde) matcher stadig, så længe det er inden for tolerancen. Uden dette ville badesteder, der reelt ligger i vandet, kunne fejlagtigt vises som "ingen data", udelukkende fordi den forenklede polygon ikke ramte deres præcise koordinat.

Fem mulige tilstande, ikke bare "tal eller intet":

  • Reel score (kilde: sø/kystvand/vandløb) — mindst én bekræftet, opstrøms udledning fundet, risikoen viser en beregnet procent.
  • "Ingen data" — hverken geometrisk match eller nogen bekræftet udledningskilde fundet. Vises som en grå, eksplicit "ingen data"-tekst, aldrig som et tal (heller ikke 0%) — et manglende match er ikke det samme som en bekræftet, målt nulrisiko.
  • "Bekræftet ingen udledning" (nyt, grøn markering) — kun for søer: ID15's terrænsporede opland har eksplicit fundet nul PULS-udløb i hele oplandet, og ingen anden uafhængig kilde (RBU, navnematch, vandløbsindløb) finder noget som helst. Dette er en positiv, data-funderet bekræftelse — ikke fravær af undersøgelse, men en undersøgelse der bekræftede fravær. Udledt 100% automatisk fra data, ingen manuel liste.
  • "Serverdata utilgængelig" — serverens data er forældet (>45 min) eller ikke hentet endnu. Vises grå med et advarselsikon, adskilt fra "ingen data", fordi det er en helt anden påstand ("vi ved det ikke lige nu" vs. "der er intet at vide").
Der findes ingen lokal, klient-side fallback-beregning længere. Tidligere faldt appen tilbage til en fuld, langsom (6+ sekunder) geometri-genberegning i browseren, hvis serverdata manglede — inklusiv en ren radius-baseret "nærmeste udløb inden for 15 km, uanset faktisk forbindelse"-metode. Den metode er fjernet permanent, efter at have vist sig at inkludere udløb i helt andre kommuner uden nogen hydrologisk forbindelse til det pågældende badested (se Søvurdering). Serveren er nu eneste autoritative kilde, med et par klokketimers udsving mellem opdateringer som prisen for det.

Algerisiko (🌿): Et separat, supplerende risikolag baseret på en forenklet, ikke-videnskabeligt kalibreret heuristik — ikke en valideret model. Algeopblomstring (herunder cyanobakterier) er en forsinket reaktion (dage-uger) på næringsstoftilførsel, kombineret med tilstrækkelig varme til reel vækst — modsat bakteriel/viral risiko, som er en mere øjeblikkelig konsekvens af selve overløbshændelsen. Modellen kombinerer:

Alge påvirker ikke længere badestedets farve/varselsniveau. Badevandsmarkørens samlede risikobadge (og alt, der udløser et varsel) bestemmes udelukkende af den højeste af bakteriel og viral risiko — algescore vises fortsat som sit eget lag (kortlaget, tooltip-procenter, detaljepanelet), men indgår ikke i det tal, der farver markøren rød/gul/grøn eller trigger et push-varsel. Ændringen er bevidst: algemodellen vurderes for usikker (ukalibreret, ingen afstands-/strømbaseret henfald, ikke valideret mod faktiske observationer) til at kunne løfte eller sænke selve sikkerhedsvurderingen på linje med den bedre funderede bakterielle/virale risiko. Varslingssystemet (både push-notifikationer og "Varsler"-fanens alarmliste) har af samme grund aldrig brugt algescore — kun foreRisk (bakteriel prognose).
  • Næringsstof-proxy: 7-dages nedbør (afstrømning) × udløbets historiske volumen (større udløb ≈ mere næringsstof pr. hændelse)
  • Temperatur-gate: en sigmoid centreret ~18°C — algevækst er stort set fraværende under ~12°C og øges markant over ~18-20°C

Vandtemperatur hentes fra to kilder afhængig af recipienttype: kystvande bruger CMEMS' Østersø-model (variablen thetao, samme datasæt som strøm), mens søer, åer og vandløb ikke dækkes af CMEMS og i stedet får vandtemperaturen estimeret ud fra et 72-timers glidende gennemsnit af lufttemperatur via en Mohseni-Stefan-lignende sigmoid-model. Alge har bevidst ingen afstands- eller strømbaseret henfald i nogen af modellerne nedenfor — næringsstof-/temperaturmekanismen er ikke en punktkilde-spredningsproces på samme måde som patogener.

Algerisiko-modellen er en forsøgsvis, ukalibreret tilnærmelse — den er IKKE valideret mod faktiske alge-observationer i danske farvande, og bør tolkes som en grov indikator, ikke en pålidelig prognose.
Badevandsvurderingen er en modelbaseret indikator for CSO-risiko. Den afspejler ikke de officielle badevandsprofiler fra Miljøstyrelsen, som baseres på flerårige bakteriemålinger og lokale forureningskilder.

Søvurdering

De 973 målsatte søer fra VP3 farves efter fire kilder, kombineret via den højeste værdi pr. risikotype — RBU, ID15 og navnematch supplerer hinanden (alle bruges, når flere findes), vandløbsindløb er en jævnbyrdig fjerde kilde. Der er ingen ren geografisk nærhedsfallback — en sø uden nogen af de fire kilder viser eksplicit "ingen data", frem for et gættet tal baseret alene på afstand (se begrundelse i boksen nedenfor).

RBU — Officiel recipient (VP3-register): VP3's eget RBU-lag har et felt (forb_id) hvor myndigheden for en del af punkterne selv har registreret den officielle recipient. Dækker kun omkring 60 søer, men er 100% pålideligt når til stede.

ID15 — Terrænbaseret opstrøms-matching med rejsetids-henfald: Den bredeste kilde (~644 søer), baseret på DCE's 3.355 autoritative delvandoplande, flow-retning fra DHM-højdedata og Manning's ligning for transporthastighed — se de tekniske detaljer i boksen nedenfor.

Navnematch: PULS' waterArea-felt sammenlignes eksakt (efter normalisering af æ/ø/å, store/små bogstaver og kendte præfikser) mod søens ov_navn.

Vandløbsindløb (retningsbekræftet): for vandløbssegmenter der beviseligt løber ind i søen (segmentets endepunkt rører søens polygon, og vandlob-directions.json bekræfter — confidence "sikker" — at strømmen går mod søen, ikke væk fra den), medregnes de tilknyttede udløb med luftlinje-afstandshenfald fra udløb til søens indløbspunkt. Segmenter med bekræftet afløbs-retning (fx en sø's eget udløb til en nedstrøms sø/fjord) bidrager slet ikke — hverken via denne kilde eller de tre ovenstående.

Bekræftede afløbsudløb udelukkes fra ALLE fire kilder, ikke kun vandløbsindløbstieren. Et konkret, fundet tilfælde: et udløb på Fiskebæk Å (Farum Søs egen afstrømning mod Furesøen, bekræftet retning væk fra søen) var koblet ind via ID15 med 0 timers registreret rejsetid — dvs. fuld, uhenfaldet vægt, selvom vandet fysisk bevæger sig væk fra søen. At blot tilføje en retningsbevidst kilde løste ikke problemet i sig selv, fordi den ældre, retningsblinde ID15-kilde stadig konkurrerede om samme maks-værdi. Løsningen: for hver sø identificeres bekræftede afløbssegmenter direkte via deres geometri (uafhængigt af om udløbet nogensinde blev koblet til segmentet i det underliggende matchdatasæt — den kobling viste sig selv at mangle for de konkrete udløb, der forårsagede fejlen), og ethvert udløb, hvis egne koordinater ligger på et sådant segment, udelukkes eksplicit fra RBU/ID15/navnematch/vandløbsindløb samtidig.

Badested-specifik afstandshenfald (isotropisk model): en stor sø kan have flere bugte langt fra hinanden — et udløb i den ene ende bør ikke automatisk give samme score til et badested i den modsatte ende. Hvert badested inden for søen får derfor sin egen score, beregnet ved at henfalde hvert enkelt bidragende udløbs egen, rå score med luftlinje-afstanden fra udløbet til netop det badested (ikke søens polygon generelt), omregnet til en antaget rejsetid via en antaget blandingshastighed. "Isotropisk" betyder spredning antages lige stor i alle retninger — som ringe i vandet, ikke en rettet strøm. Der findes ingen kendt kilde til intern strømretning i danske søer; dette er den bedste tilnærmelse, der kan bygges uden en sådan kilde, og en reel forbedring af den tidligere "hele søen får ét fælles tal"-tilgang, men ikke det samme som en ægte strømningsberegning.

"Bekræftet ingen udledning" — en tredje, positiv kategori: hvis ID15's terrænsporede opland eksplicit har fundet nul PULS-udløb i hele søens opland (ikke blot manglet i datasættet — en direkte krydstjek mod alle 973 søer viste, at 970 af dem har et eksplicit ja/nej-svar, kun 3 er reelt ubehandlede), og ingen af de tre øvrige kilder finder noget som helst, markeres søen som bekræftet risikofri — grønt, med en forklarende tekst, ikke "ingen data". Forskellen er afgørende: "ingen data" betyder "vi ved det ikke", "bekræftet ingen udledning" betyder "vi har undersøgt og fundet intet". Udledt 100% automatisk fra data — ingen manuelt vedligeholdt liste.

Detaljer om ID15-metoden:

  • Datagrundlag: DCE's (Aarhus Universitet) ID15-delvandoplande — 3.355 autoritative, landsdækkende afvandingsoplande (medianstørrelse ~13 km²), samme datagrundlag DCE selv bruger til den nationale kvælstofmodel.
  • Flow-retning mellem oplande: for hvert opland hentes minimumshøjden blandt DHM Højdekurvers konturpunkter inden for oplandets egen grænse. Et opland peger nedstrøms mod enhver nabo, der er mindst 1 meter lavere.
  • Stopper ved andre søer: opstrøms-sporingen standser ved enhver anden VP3-sø, den støder på undervejs.
  • Kanal-tvetydighed løst geometrisk: for søer forbundet af en kort kanal sammenlignes den faktiske afstand til søens egen, fysiske form (ikke det grove opland) mod enhver nedstrøms nabosø.
  • Rejsetid (Manning's ligning): V = (1/n)·R2/3·S1/2 (Chow 1959). Korteste samlede rejsetid beregnes med Dijkstras algoritme, henfaldes med samme τ-model som "tid siden udledning".
Det mest usikre led i ID15-kæden er den hydrauliske radius (R) — ingen målte tværsnitsdata for danske vandløb, kun en litteraturbegrundet skalerings-metode.

Kystvandvurdering

Kystvandes risiko farves efter tre kilder, kombineret via den højeste værdi — tekstmatch, ID15-opstrøms-matching, og en afgrænset havnavns-fallback som sidste udvej. Alle tre er beskyttet af en fælles, fysisk afstandsgrænse (10 km), der forhindrer et udløb i at tælle med for et kystvand, det reelt ikke ligger i nærheden af — uanset hvor godt teksten matcher.

Tekstmatch: PULS' waterArea-felt sammenlignes mod kystvand-polygonens ov_navn/ov_id/ho_na, efter samme normalisering (æ→ae, ø→oe, å→aa, sænket case) som søernes navnematch. Matcher både eksakt og delvist (fx "Kattegat" i PULS matcher korrekt "Kattegat, Aalborg Bugt" i VP3) — men kun inden for 10 km fra selve kystvand-polygonens kant, se boksen nedenfor for hvorfor det er afgørende.

Hvorfor delvist tekstmatch kræver en fysisk afstandsgrænse: PULS' recipient-navne er ofte generiske ("Kattegat", "Lillebælt"), mens VP3 opdeler kysten i mange specifikke underområder ("Kattegat, Aalborg Bugt", "Lillebælt, Bredningen"). Et rent tekstmatch uden afstandsbegrænsning viste sig katastrofalt: seks vidt forskellige kystvandpolygoner fra Frederikshavn til Sjælland — flere hundrede kilometer fra hinanden — endte med identisk risikoscore, fordi de alle matchede samme brede "Kattegat"-tekst. Omvendt kan et enkelt PULS-punkts recipient-tekst være direkte fejlregistreret (fx et udløb ved Aarhus tagget "Stavns Fjord", en fjord ved Samsø 35+ km væk) — her hjælper normalisering intet, fordi teksten er identisk, men fysisk forkert. Løsningen i begge tilfælde er den samme: et udløb tæller kun med for et kystvand, hvis dets egne koordinater ligger inden for 10 km af polygonens kant, uanset hvor godt eller dårligt teksten matcher. 10 km er et pragmatisk, eksplicit valgt loft — ingen dansk eller europæisk badevandsstandard angiver en fast påvirkningsradius for et enkelt udløb (det afhænger reelt af strøm, tidevand og udledningsmængde), så tallet er ikke fagligt udledt, men en bevidst afvejning mellem at fange reelle nære forbindelser og udelukke fjerne fejlkoblinger.

ID15-baseret opstrøms-matching: samme grundmetode og DCE-datagrundlag som søernes ID15-kilde, men anvendt omvendt — et kystvand modtager typisk fra mange oplande på én gang. Sporingen stopper ved enhver sø, den støder på undervejs, af samme grund som søernes egen tilsvarende regel. Beskyttet af samme 10 km-grænse som tekstmatch.

Havnavns-fallback (sidste udvej): Danmark har kun et lille, fast antal officielle, overordnede havområdenavne (Kattegat, Skagerrak, Østersøen, Bælthavet, Nordsøen, Vesterhavet). Når hverken tekstmatch eller ID15 finder noget som helst for en given polygon, forsøges disse navne som en absolut sidste mulighed — stadig beskyttet af samme 10 km-grænse. Løser tilfælde hvor en specifik VP3-underinddeling (fx "Djursland Øst") og PULS' egen, endnu bredere tekst ("Kattegat") slet ikke deler nogen tekststreng at matche på, selvom de reelt er samme farvand.

Badested-specifik afstands- og retningsvægtning: som for søerne beregnes hvert badesteds egen score isotropisk (afstandshenfald fra hvert bidragende udløb til netop det badested, ikke kystvandets polygon generelt) — nødvendigt fordi en enkelt kystvand-polygon kan dække en meget lang kyststrækning (Øresund-polygonen dækker fx hele vejen fra Helsingør til Dragør, over 90 km, med 180+ udløb samlet).

Retningsbevidst model — kystvandenes eneste kilde, hvor ægte strømretning bruges (ikke isotropisk gæt): for hvert udløb mere end 500 m fra badestedet beregnes skalarproduktet mellem CMEMS' faktiske strømvektor (uo/vo) VED UDLØBET og retningen fra udløb mod badestedet. Et positivt produkt betyder strømmen (helt eller delvist) bevæger sig mod badestedet — udløbet er bekræftet opstrøms og medregnes, henfaldet med den målte strømhastighed (ikke en antaget konstant). Et negativt eller nul produkt betyder nedstrøms eller tværgående — udløbet udelukkes helt, samme princip som søernes afløbsudelukkelse (Fiskebæk Å-sagen). Findes der ikke strømdata for netop det udløbs gittercelle (fx ved en midlertidigt fejlet CMEMS-hentning), udelukkes udløbet ikke — det falder i stedet tilbage til den isotropiske, afstandsbaserede model for netop det udløb, for at undgå endnu en tavs fejltilstand. Udløb inden for 500 m medregnes altid, uanset strømretning — CMEMS' egen gitteropløsning (~10 km) kan ikke meningsfuldt afgøre "opstrøms"/"nedstrøms" på så kort afstand, og et rent skalarprodukt tæt på nul kunne ellers tippe til den forkerte side af ren måleunøjagtighed (fundet ved et konkret, rapporteret tilfælde, hvor et udløb praktisk talt samme sted som badestedet blev fejlagtigt udelukket). Skulle alle et kystvands udløb ende bekræftet nedstrøms for et givent badested, vises lokationen korrekt som "ingen data" (med angivelse af hvilket vandområde der er matchet), ikke som et vildledende "match uden udløb".

De tre kilder kombineres pr. risikotype (bakteriel/viral/alge/prognose) ved at tage den højeste værdi — samme kombinationsprincip søerne bruger.

Vandløbenes strømretning

Lag-vælgerens "🧭 Vandløbsretning" viser en pil pr. vandløbslinje, der peger i den udledte strømretning — grøn hvor retningen anses for sikker, grå hvor den er usikker. Ingen pil vises, hvis retningen slet ikke kunne afgøres.

Metode: hver vandløbslinjes to endepunkter matches til deres respektive ID15-delvandopland (samme oplandsdata som Sø- og Kystvandvurderingen). Det opland med lavest minimumshøjde regnes som nedstrøms — samme grundprincip som selve ID15-flow-grafen mellem oplande er bygget på. Forskellen skal være mindst 1 meter (samme, allerede kalibrerede margen som Søvurderingens flow-retning) for at blive markeret sikker; er forskellen mindre, vises pilen stadig — som det bedst tilgængelige gæt — men farvet grå.

  • Begge endepunkter i samme opland: ID15-oplandenes kilometerstore opløsning kan pr. definition ikke sige noget meningsfuldt om retningen for en linje, der ikke krydser en oplandsgrænse — ingen pil vises for disse linjer.
  • Kun ét endepunkt matchet, eller intet højdedata for et af oplandene: ingen pil vises (typisk direkte kystudledninger eller linjer nær datasættets kant).
Metoden kræver ikke at de to endepunkters oplande er naboer — et fald i minimumshøjde er gyldigt uanset hvor mange mellemliggende oplande linjen krydser, siden vand pr. definition løber nedad. Det betyder metoden afgør retning pålideligt, men kan ikke skelne "denne linje er hele vandløbets fulde, sammenhængende forløb" fra "denne linje er ét segment af et længere forløb, der tilfældigvis starter højere og slutter lavere". Tilstrækkeligt til visning af pile på selve linjen, men bør ikke over-fortolkes som en fuld hydrologisk rute-rekonstruktion.

Modelgennemgang & pålidelighed

Denne side samler alle modeller, appen bruger, med links til deres videnskabelige/tekniske baggrund, og en ærlig vurdering af hvor meget de scorede værdier kan stoles på. Modellerne er ikke lige troværdige — nogle bygger på etableret hydrologisk teori, andre er bevidst simple heuristikker, konstrueret specifikt til dette værktøj uden ekstern validering.

ModelGrundlagPålidelighed
Bakteriel overløbsrisiko Eksponentielt henfald af antecedent nedbør (τ ≈ 2-4 dage, sæsonjusteret) kombineret med udløbsspecifik overløbssandsynlighed fra PULS' historiske hændelsesdata. Samme τ-model bruges nu også til at nedvægte søers opstrøms-matchede udløb efter beregnet rejsetid (se Søvurdering) — τ er baseret på litteraturens T90-værdier for E. coli (Miljøstyrelsen 2002/2003: 0,5 time-3 døgn i havvand, stærkt lys-/temperaturafhængig). 🟡 Moderat-høj. Bygger på reelle, målte overløbshændelser for ~22% af punkter (resten estimeret via log-log-regression, se Datakvalitet). Selve henfaldsprincippet (eksponentiel antecedent nedbør) er velkendt i hydrologisk litteratur, men τ-værdien er ikke lokalt kalibreret mod målte bakteriekoncentrationer i dansk vand.
Viral risiko Samme struktur som bakteriel model, men med længere τ (vira overlever markant længere, særligt om vinteren) — se Hokajärvi et al. (2023) og Gonzalez/Perez et al. (RSC 2024) for de underliggende T90-værdier for norovirus/coliphage. Bruges ligeledes til rejsetids-henfald for søers opstrøms-matching. 🟡 Moderat. Det relative forhold (vira overlever længere end bakterier) er veldokumenteret i litteraturen, men de konkrete τ-værdier i denne model er skønnede, ikke kalibreret mod danske virusmålinger.
Sø-opstrøms-matching (ID15 + rejsetid) DCE's ID15-delvandoplande + flow-retning fra DHM-højdedata (min. 1 m margin) + Manning's ligning for transporthastighed (V=(1/n)·R2/3·S1/2, Chow 1959) + Dijkstra korteste-rejsetid + geometrisk kanal-tvetydighedsopløsning, koblet til bakterie-/viral-T90-henfaldet ovenfor. Bekræftede afløbssegmenter (identificeret via vandløbenes egen retningsdata) udelukker eksplicit de udløb, der sidder på dem, fra alle fire søkilder samtidig. Badested-specifik score via isotropisk afstandshenfald, ikke ét fælles tal for hele søen. 🟡 Moderat. Oplandsgeometri og højdedata er autoritative kilder (DCE/DHM); flow-retning og rejsetid er en velbegrundet, men ikke dansk-kalibreret tilnærmelse. Afløbsudelukkelsen er testet og bekræftet mod et konkret, fundet tilfælde (Fiskebæk Å ved Farum Sø). Den isotropiske model er retningsblind af mangel på en kendt kilde til intern sø-strømretning — en reel forbedring af "hele søen får ét tal", men ikke en ægte strømningsberegning.
Kystvand-opstrøms-matching (ID15 + retning) Samme ID15-flow-graf som søernes udgave, grupperet pr. kystvand, kombineret med tekstmatch (10 km-afstandsbegrænset) og en havnavns-fallback for de fem-seks officielle danske havområdenavne — se Kystvandvurdering. Badested-specifik score via isotropisk afstandshenfald, med et retningsbevidst lag ovenpå: udløb udelukkes helt, hvis CMEMS' strømvektor bekræftet peger væk fra badestedet. 🟡 Moderat. Samme datagrundlag som søernes ID15-kilde. Retningsudelukkelsen bruger faktisk, målt strømdata (ikke et gæt) når til stede, men CMEMS' ~10 km gitteropløsning betyder den nærmeste tilgængelige strømmåling for et kystnært udløb kan ligge et stykke ude i vandet og derfor ikke perfekt afspejle lokale kyststrømme. Retningstesten er en skarp 0/1-grænse (skalarprodukt > 0), ikke en gradvis vægtning — et udløb med strøm næsten vinkelret på retningen mod badestedet kan tippe til enten side af en lille måleunøjagtighed.
Vandløbenes strømretning Samme ID15-flow-graf og samme 1 m-margin som ovenstående, anvendt på hver vandløbslinjes to endepunkter — se Vandløbenes strømretning 🟡 Moderat for sikre (grønne) pile, lav-moderat for usikre (grå). Afgør pålideligt HVILKEN retning der er nedstrøms, men ikke om en given linje er hele vandløbets forløb eller ét segment deraf. Indeks-matchingen mellem retningsdata og selve linjegeometrien er endnu ikke bekræftet ved en reel kørsel.
Algerisiko Næringsstof-proxy (7-dages nedbør × udløbsvolumen) × temperatur-gate (sigmoid ~18°C). Indgår ikke i badevandsmarkørens farve/varselsniveau — kun bakteriel/viral risiko bestemmer denne, se Badevandsvurdering. 🔴 Lav-moderat, eksplicit ukalibreret. Kombinationen af næringsstoftilførsel og temperatur-tærskel er en anerkendt kvalitativ mekanisme fra algeopblomstrings-forskning, men denne konkrete formel er konstrueret til appen uden kalibrering mod faktiske klorofyl-a- eller cyanobakterie-målinger. Bør tolkes som en grov retningsindikator, ikke en kvantitativ prognose — netop derfor eksplicit udelukket fra selve sikkerhedsvurderingen.
Strømretning (kystvande, udelukkelse) CMEMS' fysiske Østersø-model (uo/vo) ved udløbets position, brugt til en binær opstrøms/nedstrøms-test (skalarprodukt mod retningen til badestedet) — se Kystvandvurdering. Bruges KUN til kystvande, ikke søer (ingen kendt kilde til intern sø-strømretning) og ikke vandløb (som allerede har egen retningsdata). 🟢 Høj for selve strømdata (valideret oceanografisk model fra Copernicus Marine), 🟡 moderat for udelukkelseslogikken — en skarp 0/1-grænse uden gradvis vægtning, følsom over for målingsstøj ved næsten-vinkelrette strømme, og begrænset af CMEMS' ~10 km gitteropløsning nær kysten.
Ferskvandstemperatur-estimat Mohseni-Stefan-lignende sigmoid, konverterer 72-timers gennemsnitlig lufttemperatur til vandtemperatur for søer/åer/vandløb 🟡 Moderat. Selve modeltypen er velkendt i hydrologisk litteratur til præcis dette formål (se Mohseni, Stefan & Erickson, 1998), men parametrene (μ, α, β, γ) i denne implementering er generiske, ikke kalibreret specifikt til danske vandløb/søer.
24-timers prognose Samme risikomodel som "nu", men med DMI/Open-Meteos 48-timers nedbørsprognose som input i stedet for observeret nedbør 🟢 Afhænger primært af selve vejrprognosens kvalitet (DMI HARMONIE-AROME er en etableret, opererativ prognosemodel), ikke af noget ekstra usikkerhedslag fra vores side ud over selve risikomodellens egne begrænsninger ovenfor.

Sådan skal scorerne tolkes

  • Relativ rangering er mere troværdig end absolutte tal. At udløb A scorer højere end udløb B under samme vejrforhold er en rimelig konklusion. At udløb A's "34%" betyder præcis 34% sandsynlighed for målbar forurening er ikke noget, modellen kan garantere.
  • Store, samtidige udsving efter vejrhændelser er forventede, ikke nødvendigvis fejl — se diskussionen om algerisiko efter vedvarende regn ovenfor.
  • Bakteriel/viral risiko er bedre underbygget end algerisiko, som er den nyeste og mindst validerede model i værktøjet.
  • Værktøjet er bygget til screening og prioritering — at pege på hvor det er mest relevant at undersøge nærmere — ikke som erstatning for officielle badevandsmålinger eller myndighedsvarsler.

Begrænsninger

  • Overløbsfrekvens er kun reelt målt for ~22 % af punkter; resten er verificeret nul, estimeret eller markeret som utilstrækkelig.
  • Nedbør opløses på 0,25°-gitter (~17×28 km) — konvektive byger under ~10 km diameter udjævnes.
  • Tidspunkt for seneste faktiske overløbshændelse foreligger ikke som åbne data; residualmodellen aktiveres heuristisk.
  • Tekstmatch mellem PULS waterArea og VP3 ov_navn suppleres nu af ID15-baseret opstrøms-matching og en afgrænset havnavns-fallback (se Kystvandvurdering) — men et lille antal badesteder (typisk med genuint isolerede eller usædvanligt navngivne recipient-tekster) mangler stadig enhver bekræftet kilde og viser eksplicit "ingen data".
  • Kystvandenes retningsudelukkelse er en skarp 0/1-grænse (skalarprodukt > 0), ikke en gradvis vægtning — et udløb med strøm næsten vinkelret på retningen mod badestedet kan tippe til enten side af en lille måleunøjagtighed i CMEMS-data.
  • Søernes isotropiske afstandsmodel antager spredning lige stor i alle retninger (som ringe i vandet) — der findes ingen kendt kilde til intern sø-strømretning i Danmark, så en sø med en reel, kraftig indre strøm væk fra et badested vil stadig kunne overvurderes, blot mindre end tidligere, hvor hele søen delte ét fælles tal.
  • Vandløbenes strømretningspile afgør pålideligt HVILKEN vej der er nedstrøms, men ikke om en enkelt linje udgør vandløbets fulde forløb — se Vandløbenes strømretning. Indeks-matchingen mellem retningsberegning og kortets linjegeometri er endnu ikke bekræftet ved en reel kørsel.
  • Modellen skelner ikke mellem salt-, brak- og ferskvand i patogenoverlevelse.
  • Ingen tidevandsmodellering — kystvandenes retningsmodel bruger CMEMS' strømvektor direkte, men tidevandscykler inden for en enkelt dag fanges ikke.
  • Strømdata (CMEMS) har ~10 km rumlig opløsning og opdateres hver time — lokale strømforhold i smalle sunde og havne kan afvige fra modellen, og et kystnært udløbs nærmeste tilgængelige strømmåling kan ligge et stykke ude i vandet.
  • Strøm-kortlaget viser data fra seneste timelige opdatering, ikke en løbende prognose.
  • Algerisiko-modellen er en ukalibreret heuristik, ikke en videnskabeligt valideret prognose — den bruger ikke faktiske observationer af algeopblomstring til at kalibrere sine parametre, og har bevidst intet afstands- eller strømbaseret henfald.
  • Vandtemperatur i søer/åer/vandløb er estimeret fra lufttemperatur, ikke direkte målt — kan afvige fra faktiske forhold, særligt i dybe søer med større termisk træghed end modellen antager.
  • Algerisiko-varmekortet er ikke maskeret til præcise vandområde-polygoner for søer/åer/vandløb (kun kystvande dækkes af polygondata) — det viser risiko centreret på selve udløbspunkterne med en lille spredningsradius, ikke en nøjagtig afgrænsning af vandfladen.
  • Alle antagne hastighedskonstanter (sø-blanding, kystvands-blanding — begge 0,3 m/s hvor ikke andet foreligger) er eksplicit ikke-målte tilnærmelser, ikke dansk-kalibrerede værdier.

Videnskabelige referencer

  • Beaudeau, P. et al. (2001). Water Research — referenceværdi for bakteriel henfaldstid.
  • Blaustein, R.A. et al. (2013). Water Research — Q₁₀ = 2,0 for bakteriel mørkinaktivering.
  • Sinton, L.W. et al. (2002). Applied and Environmental Microbiology — sollys som dominerende dræbningsfaktor.
  • Servais, P. et al. (2007/2010). Science of the Total Environment — sedimentrebound efter CSO.
  • Hokajärvi, A.M. et al. (2023). Water Research — viral henfaldstid og Q₁₀,ᵥ.
  • Flannery, J. et al. (2012). Global Water Pathogen Project — UV-effekt på vira under 12 °C.
  • Miljøstyrelsen (2002/2003). Hygiejnisk kvalitet af spildevand fra offentlige renseanlæg — T90-litteraturgennemgang for E. coli i hav- og ferskvand.
  • Chow, V.T. (1959). Open-Channel Hydraulics — Gauckler-Manning-formlen og Manning's n-tabeller, brugt til rejsetidsberegning i søers opstrøms-matching.
  • Leopold, L.B. & Maddock, T. (1953). The Hydraulic Geometry of Stream Channels — regional skalering af kanalgeometri (hydraulisk radius) fra opstrøms areal.

Data: Miljøportalen (PULS) · Miljøstyrelsen (VP3) · Open-Meteo / DMI · OpenStreetMap.
Kildekode: github.com/KrestenBersoe/dkvand
Debug: Datakilder & cache-status

Beregner…
📍 Klik på et udløbspunkt for at se risikoanalyse
Badevandslokalitet
Samlet forureningsrisiko
Opdelt risiko
🦠 Bakterier
🧬 Virus
🌿 Alger
🌡 Temperatur
💧 Vand
☀️ Luft (dagens højeste)
🌬 Vind og strøm
💨 Vind (nu)
🌊 Strøm
Nedbør — 7 dage · nu · prognose
Indlæser vejrdata…
Udløb der påvirker badevandet
Indlæser…
Samlet risiko for overløb
Nu vs. 24-timers prognose
📍 Nu
⚡ 24h prognose
Vandkvalitet — supplerende indikatorer
Oplysninger
Nedbør — 7 dage · nu · prognose
Indlæser vejrdata…
Datakilder & cache-status
Indlæser…