What FloodGuard is — and is not
FloodGuard turns how sealed a place is into action: a flood-susceptibility read, a sealing/permit decision, a drainage levy, a de-sealing target, and a forward-looking flood early-warning — at the scale of a plot, a ward, or a whole district, with Ghanaian legal citations and open, auditable data.
| System | What it does |
|---|---|
| 🛰 Google Flood Hub | Forecasts when & where rivers will flood (fluvial), 7-day. |
| 🏗 GARID (World Bank) | Builds the basin-scale Odaw drainage works. |
| 🛡 FloodGuard | Parcel/district scale: sealing %, the pluvial flood-susceptibility map, permit decisions, the levy, the de-sealing target, and a planner early-warning — the layer neither of the above reaches. |
Quick start — three steps
Who uses it & where to start
| You are… | Start with | You get |
|---|---|---|
| Citizen / developer | Citizen tab | “Is my plot too sealed? Will it flood? What do I do?” — a verdict + one fix + flood-proximity warning. |
| MMDA officer | Assembly / Permit + Permit cases | A point-bound statutory permit decision, the district de-seal target, the levy roll, an AMA Hydro Report PDF. |
| Politician / planner | District card + Flood simulator | An announce-able target (“de-seal X ha to contain a 50 mm storm”) and a validated flood-prone map. |
| CSO / press | 📋 Register + Flood simulator | A time-stamped public record of permit decisions and the sealing-vs-flooding evidence layer. |
1 · Citizen plot owner / developer
Assess a single plot and get the cheapest way to make it compliant and flood-safe. Set the location, draw the plot (✏ Draw plot — it auto-detects sealing from OpenStreetMap footprints + ESA WorldCover at 10 m for the exact shape), optionally add tree canopy and a green façade, then read the Verdict:
Drawing (works on phone and desktop): tap or click the map to drop each corner of the boundary — a control appears at the bottom-right showing the point count with ✓ Finish, ↶ Undo and ✕ Cancel. ✓ Finish becomes available once you have 3+ corners and closes the shape. (On desktop you can still double-click, press Enter to finish, Backspace to undo a corner and Esc to cancel; on a phone use the on-screen buttons — there is no keyboard and double-tap zooms the map.)
Then read the Verdict: Sealed Surface Index vs the cap, runoff, required retention, heat (WBGT), air quality, and ranked measures. Download the Plot report, AMA Hydro Report, or Schedule of Permit Conditions PDF.
2 · Existing building retrofit
For a building already up. Enter its GhanaPostGPS address and current surfaces and get: the de-sealing / on-site capture it needs, the stormwater levy now vs after retrofit, a costed two-route fix (de-seal or capture), and an owner notice you can issue by bill or SMS.
3 · Assembly / Permit MMDA
The planning officer’s screen. Click any plot to screen that location: a named proposed development + zoning check, a statutory REFUSE/REFER/NO STATUTORY BAR verdict bound to the District Assembly of the clicked point (point-in-polygon over ~260 districts), the location profile, the district sealing card + de-sealing planner, the before-the-storm read, and PDF outputs. Draw a parcel to measure sealing, a proposed building to simulate, or scan a whole ward.
4 · Permit cases MMDA
Lodge and track any permit through the statutory lifecycle (Act 925 / LI 2384): submission → processing fee → vetting → inspection → Technical Sub-Committee → Spatial Planning Committee → issuance. Seven permit types (development, planning, change of use, subdivision, demolition, temporary, signage), each with its own reference code, document checklist and inspections. A refusal can be appealed; an issued permit carries a validity/commencement clock and can be renewed. Every case gets a Development Climate-Resilience Score (0–100, grade A–E) and a numbered Schedule of Permit Conditions; an automatic EIA check (LI 1652) locks EPA clearance where required; committee actions are gated on quorum/majority with an audit trail. The applicant privacy notice (Act 843) is shown at collection and the register is officer-only.
Flood early-warning (for planners) planning
A forward-looking read of which areas are likely to flood in the forecast window — the planning analogue of GMet’s real-time My Flood Risk Accra app. It couples WHERE (the terrain susceptibility grid) with HOW MUCH / WHEN (a live rainfall + river forecast) and returns one early-warning level (low / moderate / high) plus pre-event and permit actions. For real-time street-level warning inside Accra it defers to GMet’s app. See the math in C · Flood susceptibility.
Flood map & rain simulator Greater Accra + national
Turn on 🌊 Flood-prone areas (rain simulator) from the map’s layer control. It shows a flood-susceptibility map (where water is likely to collect, from terrain + sealing) and a Rain slider (20–120 mm): heavier rain activates more area and the readout updates live. Validated blind against the recorded 2023–2026 flood register and, independently, the Global Flood Database (AUC 0.80). It is a screening pluvial-susceptibility map, not a depth forecast.
District de-sealing planner planners
On every district card, drag Contain storm (20–150 mm) and read how much de-sealing (or on-site retention) keeps that storm within the drainage design load. Set your own drain design mm and good-practice sealing %. The 🎯 headline gives an announce-able target; ⤓ District brief (PDF) exports a one-pager. The math is in F / B.
Reports & PDFs
| Report | What it is |
|---|---|
| Plot report | Sealing, runoff, retention, catchment, heat, measures for one plot. |
| AMA Hydro Report | The drainage assessment a building permit requires (Bye-law 2017 / LI 1630) + the no-build gate. |
| Schedule of Permit Conditions | Numbered, cited, enforceable-once-adopted conditions + resilience score. |
| District brief | Total sealing + de-seal/retention target + provenance, one page. |
| Decision notice | Issuable Notice of Permit Decision with legal grounds + signature block. |
| Owner notice | Retrofit notice keyed to the GhanaPostGPS address (bill / SMS / print). |
A · Sealing & the Sealed Surface Index (SSI) math
Every surface carries two independent properties: a runoff coefficient C (how much rain runs off) and an impervious fraction (how much infiltration/recharge it blocks). SSI prices sealing; C routes water — a green roof runs off little (low C) yet is still ~30 % “sealed” for SSI.
bare_soil. Traffic-light band: SSI ≤ 0.75·cap → green; ≤ cap → amber; else red.Surface coefficients (engine/constants.py · SURFACE_TYPES)
| Surface | runoff C | impervious | albedo |
|---|---|---|---|
| Roof (metal/concrete) | 0.90 | 0.95 | 0.20 |
| Asphalt / concrete paving | 0.88 | 0.98 | 0.12 |
| Block paving (sealed joints) | 0.80 | 0.85 | 0.30 |
| Gravel / compacted laterite | 0.50 | 0.40 | 0.25 |
| Permeable paving | 0.45 | 0.30 | 0.30 |
| Bare soil | 0.35 | 0.10 | 0.20 |
| Lawn / grass | 0.25 | 0.0 | 0.25 |
| Garden / dense veg / trees | 0.15 | 0.0 | 0.18 |
| Green roof (extensive) | 0.45 | 0.30 | 0.25 |
| Rain garden / bioretention | 0.10 | 0.0 | 0.20 |
| Water / pond | 1.0 | 0.0 | 0.07 |
Satellite sealing & the NDVI vegetation discount (backend/impervious.py)
Sources: C values compiled from DIN 1986-100, cross-checked to Chow, Maidment & Mays (1988) & ASCE, adjusted up for Accra’s clay soils. ESA WorldCover 2021 v200 (10 m). NDVI = Sentinel-2 green-season median.
B · Runoff & hydrology (Rational Method) math
Escarpment / catchment weighting (engine/runoff.py)
Engineering-grade rational method (engine/hydrology.py)
Design storms (representative — engine/constants.py)
| Storm | depth (mm) | peak i (mm/hr) |
|---|---|---|
| 2-yr | 45 | 60 |
| 5-yr | 65 | 85 |
| 10-yr (default) | 85 | 100 |
| 25-yr | 110 | 125 |
Published IDF curves in the engine: Kumasi — Abubakari, Kusi & Xiaohua (2017), Int. J. Eng. & Sci. 6(1):51–56 (Gumbel, 22-yr GMet record); Volta/Weta — Asante-Annor, Oti et al. (2024), HydroResearch 7. Accra (Logah 2013) & Tarkwa remain zone-approximate (figure/paywall only). All depths are representative pending official GMet/HSD per-station curves.
C · Flood susceptibility & early-warning math
Other flood signals
- Modelled river hazard — point-in-polygon over JRC Global River Flood Hazard maps (~928 m): 1-in-10-yr floodway → red, 1-in-100-yr floodplain → amber (engine/flood_hazard.py).
- Dam-spillage — Haversine distance to curated dam corridors (Weija, Akosombo/Kpong, Bagre, Bui, Tono, Vea) with an elevation ceiling (engine/dams.py).
- Recurrent register — documented 2023–2026 corridors + REGSEC communities; “documented history only — absence is not proof of safety”.
- Topographic position — centre elevation vs a ~350 m ring of DEM neighbours: ≤ −3 m ponding-prone; low-confidence where local relief < 2 m (DEM noise). Position, not flow routing.
Planner early-warning (backend/earlywarn.py)
Couples the terrain susceptibility grid (WHERE) with layered free forecasts (WHEN/HOW-MUCH): riverine = Google Flood Forecasting API (Flood Hub, 7-day); pluvial = NASA GPM IMERG if a token is set, else Open-Meteo. Forecast peak rainfall (clamped 20–120 mm) activates the grid; the level escalates from the pluvial flag (notable ≥ 30 mm, heavy ≥ 50 mm), the activated susceptibility band, the riverine severity, and a low-lying topographic amplifier → low / moderate / high with pre-event + permit actions.
Sources: MERIT Hydro (~90 m, HAND/TWI); JRC/GloFAS (Dottori et al. 2016); Open-Meteo (Copernicus DEM); Google Flood Hub; NASA GPM IMERG. Screening — not a hydrodynamic depth/extent forecast.
C2 · Rainfall × sealing → flood (how much rain an area can take) math
Answers: for a given rainfall and how sealed an area is, how much runoff results — and how much rain can it take before it floods? Uses the established SCS / NRCS Curve-Number method (backend/engine/floodcurve.py). Because the Curve Number rises with sealing, a more-sealed area turns more of the same rain into runoff and floods at a lower rainfall depth.
Wired into the adaptation simulator: each scenario shows the threshold shift, e.g. "this area floods at ~45 mm now → ~52 mm after de-sealing". Endpoint GET /api/floodcurve returns the point read + the full threshold-vs-SSI curve. Anchored (not fitted) by the documented 3 June 2015 event (212.8 mm on a highly-sealed core → ~196 mm runoff).
Sources: NRCS TR-55 (Curve-Number); Hollis 1975 (imperviousness × flood magnitude); Blum et al. 2020 (confounding); Logah et al. 2013 (Accra IDF); NOAA Accra extreme-rainfall report (2015 event).
C3 · Adaptation / scenario "what-if" simulator math
The 🌿 Adapt tool predicts the flood + heat effect of blue-green / nature-based measures applied at a chosen scale (parcel → ward → district), driven by SSI (backend/engine/scenario.py). It builds on physical parameters (storage mm/m³, impervious fraction, albedo, canopy) and derives the runoff reduction through the Rational Method at the local storm — it does not hard-code temperate reduction percentages (they collapse under Accra's intense convective storms).
Accra clay rule (enforced): Akuse vertisols + a high water table make infiltration unsuitable, so every soakaway/infiltration measure is modelled as lined detention needing a drainage outfall, never ground infiltration. Output includes the cost, the cost-effectiveness ranking, and the verdict "does it bring the area within the ~25–30 mm drainage design capacity?". Endpoints GET /api/scenario/catalogue + POST /api/scenario/simulate. Full cited basis: docs/SCENARIO_ENGINE_RESEARCH.md.
Sources: FLL / DIN 1986-100 (retention roofs); CIRIA C753; global bioretention meta-analysis (2025); Ziter et al. 2019 & Konijnendijk 2023 (canopy cooling); EPA Cool Roofs; Asare, Atun & Pfeffer 2023 (NbS in Accra, Land Use Policy). Screening — not a hydrodynamic simulation.
Adaptation as a permit prerequisite (the gate)
The simulator is wired into the permit lifecycle so a required remedy becomes a condition of grant, not just advice. When a lodged development exceeds the Assembly sealing cap or falls short on on-site retention — on declared sealing only (an assumed default is advisory, never a block) — the case shows an ⛔ Adaptation required card. The officer clicks Build compliant plan: the 🌿 Adapt simulator opens seeded from and locked to that plot (area + SSI fixed), the officer adds measures until the gap closes, then Attach as permit condition.
POST /api/applications/{id}/adaptation; enforced in transition_application (Gate 5), triggered from backend/permitconditions.py.
D · Heat, WBGT & cooling math
Felt temperature & cooling recommender
NWS/Rothfusz heat index and ECCC humidex are computed at local_Ta = 31 °C + ΔT (Accra design). The 🌳 Cooling prescription greedily chains the strongest tropical levers — tree canopy → reflective cool roof (albedo 0.60) → green roof — until WBGT drops into a safe band, each step with its °C drop and indicative cost (canopy 25, cool-roof 90, green-roof 550 GHS/m²).
Sources: EN ISO 7243:2017 (Class-2 acclimatised limit 28 °C); NWS WPC heat index; ECCC humidex. Tropical LST asphalt–grass differences 10–20 °C → near-surface air offset ~2–5 °C (calibration basis).
E · Air quality / phytoremediation math
| Constant | Value | Basis |
|---|---|---|
| Vd NO₂ | 0.30 cm/s | Hedera chamber; Delaria et al. 2020 ACP (0.15–0.51 cm/s stomatal) |
| Vd PM2.5 | 0.15 cm/s | leaf-scale; corrected down from 0.5 (was over-stated ~3–10×) |
| Ambient (Accra) | NO₂ 45 · PM2.5 37 µg/m³ | per-zone (regions.py); exceeds WHO 10 / 5 |
| Façade greening cost | 320 GHS/m² | indicative vertical greening |
Method & sources: Aduse-Poku et al. (2024), Environmental Advances 17:100568; (2025), Springer Urban Ecosystems 28:76. Ambient from Arku et al. (Accra) and Ghana fixed-site studies. Model-air feeds (Open-Meteo/CAMS) under-read Accra badly, so were deliberately not wired.
F · Stormwater levy & fees math
Permit fees (engine/fees.py)
Sources: LUSPA Act 925 s.116; LI 2384 Regs 44–45; calibrated to the Ga West Municipal Assembly 2024 Fee-Fixing Resolution (residential 6 GHS/m² ≈ gazetted GHS 822 for ~137 m²); World Bank Accra processing 0.625 % / GHS 50 floor. Retrofit unit costs (permeable 180, depave 60, rain garden 120, green roof 550 GHS/m²; soakaway 900, cistern 1200 GHS/m³) — illustrative.
G · Permitting & statutory logic math
Compliance (engine/mitigation.py)
A “compliant” verdict is a screening pass, provisional on a site percolation test — the first-flush infiltration credit is optimistic on Accra’s clay soils. Caps (residential 0.60 SSI / 25 mm retention; commercial 0.80/20; industrial 0.85/20; mixed 0.70/22; stricter on the Akuapem uplands).
Resilience score & Schedule of Conditions (backend/permitconditions.py)
Statutory refusal gate (backend/permitgate.py)
REFUSE on a hard prohibition (wetland/Ramsar LI 1659/Act 1115; riparian buffer Act 522 + WRC policy; forest reserve; road reservation Act 540/925/LI 2384/1630; transmission/rail wayleave Act 541/779; dam/river flood Act 925/927). REFER on a soft red (coastal, recurrent flood, slope, contamination). NO STATUTORY BAR otherwise. If the land screen is unreachable it returns screening_required — never a false “clear”.
Satellite riparian safety net (fixes the adjacent-to-water false-clear)
The watercourse/wetland layers key off OSM waterway lines + WDPA polygons, which miss informal ponds and unmapped wetlands — so a plot sitting next to open water could clear. FloodGuard now also scans the ESA WorldCover 10 m satellite around the point for open water (class 80) and wetland (90/95): nearest ≤ 75 m → REFER (likely inside the WRC riparian buffer; Act 522 + Buffer Policy + LI 1659 cited), ≤ 150 m → advisory. Kept soft (never an automatic refusal — 10 m can misclassify pools/shadows; an Assembly may elevate it). Limit (stated honestly): 10 m satellite catches open water — it misses narrow streams and dry-season / vegetated wetlands, so it narrows, not closes, the gap; always verify the water body on the ground.
Land tenure — State / institutional land (backend/landtenure.py)
Much peri-urban green survives because it is state / institutional land — University of Ghana, Achimota, military, research stations, teaching hospitals, statutory bodies — not because of any hydrological rule. A curated national layer (77 holdings, indicative boundaries, shared with the EPA scoping tool) flags when a point falls on such land. The verdict depends on the Applicant type AND whether the land is already developed:
- Government / institution-serving development → REFER (must be formally allocated by the custodian + Lands Commission first).
- Private on OPEN / undeveloped state land (e.g. University farmland) → REFUSE — not privately developable without release by the custodian; building on it is encroachment.
- Private on already-DEVELOPED state land (≥55 % built — e.g. Airport City, a hospital campus, a bank on leased ministry land) → REFER, not refuse: existing development implies a custodian lease/allocation already exists, so a private transaction is a title/lease-verification matter, not automatic encroachment. (This is why a check near an already-built landmark returns "refer/verify", not a claim that the existing building is illegal.)
Cited to the State Lands Act (Act 125), Lands Commission Act (Act 767), Land Act 2020 (Act 1036) + the custodian's statute. Boundaries are indicative, not cadastral — there is no open institutional-land cadastre in Ghana; the layer can slightly over-reach onto adjacent commercial land, so always confirm with the Lands Commission (Public & Vested Lands Division) / the custodian's Estate Office.
Land status & conservation value (backend/landstatus.py + conservation.py)
A classifier answers "why is this land still open?" by combining the tool's layers into one headline: institutional (tenure applies whether built or not) → built (already developed) → open water / wetland → flood-prone valley floor → vacant developable, each with its own recommendation. For protected, still-green land it then runs a conservation valuation — the existing flood + heat + air engines on the current vegetated state vs a fully-sealed counterfactual — to show what the district loses if it is sealed: extra runoff per design storm & per year (with tanker / Olympic-pool equivalence), local WBGT rise, and annual NO₂ / PM2.5 / CO₂ removal forgone (Aduse-Poku deposition-velocity method) with a cars-off-the-road equivalence. Screening valuation to support KEEPING green — the counterfactual is explicit (full sealing to typical development), not an engineering or monetary appraisal. GET /api/land-status?lat&lon.
Zoning & EIA
Zoning uses the gazetted scheme first, else a nationwide OpenStreetMap observed-land-use layer (indicative → an OSM non-conforming is a REFER, never an auto-REFUSE). EIA screening (LI 1652): factories/industry & fuel depots mandatory; hotels > 40 rooms, warehouses/commercial ≥ 5000 m², offices ≥ 10000 m², large housing ≥ 8000 m²; anything in a sensitive area (Schedule 5) mandatory → EPA clearance locked before grant.
Lifecycle clocks (backend/permitflow.py)
Service-level target 30 working days (LI 2384 Reg 44(10)); deemed-approval ~3 months (LI 1630 / Act 925 regime — confirm the exact instrument before relying on it). Both start at processing-fee payment. Permit validity 5 yr (LI 1630 Instrument 7). Committee actions gated on quorum (TSC 2, SPC 3) + majority.
H · Climate scenarios & national coverage math
| Climate zone | 10-yr depth/peak | annual mm | NO₂/PM2.5 | IDF source |
|---|---|---|---|---|
| Greater Accra (coastal savanna) | 85 / 100 | 780 | 45 / 37 | Logah 2013 |
| Western wet (Takoradi/Axim) | 112 / 135 | 1900 | 20 / 28 | Tarkwa |
| Forest Ashanti (Kumasi) | 105 / 122 | 1400 | 28 / 30 | Abubakari (published) |
| Transition (Sunyani/Techiman) | 95 / 115 | 1250 | 18 / 30 | scaled |
| Northern savanna (Tamale/Wa/Bolga) | 100 / 132 | 1050 | 14 / 50 | scaled convective |
| Volta (Ho/Hohoe) | 92 / 112 | 1150 | 14 / 28 | Weta 2024 (published) |
Zone resolved by lat/lon classifier else GhanaPostGPS prefix. All zone IDF representative pending official GMet/HSD curves.
National map layers
The overlays under the 🗺️ Map layers control that make the national picture legible:
- 🔥 Heat-island intensity — Landsat surface temperature rendered as a local anomaly (each pixel vs its ~7 km surroundings), so hot built-up / bare cores read red and cool green/water blue in every city — not just the hottest region (a fixed 24–46 °C absolute stretch washed out intra-city differences). Skin temp, not air; dry-season median.
−6…+8 °Cvs local average. - 🏗️ Settlement growth — year each area was first built-up, with a 🎞️ timelapse slider to watch a place develop. The animation uses the WSF remote-sensed series (1985→2019, annual) — the accurate progression that shows where the city expanded. (JRC GHSL reaches 2025 but back-casts development to 1985 and misses dense old cores, so it is used only for the 🇬🇭 National dashboard's built-up km² aggregate — 1,138→2,059 km², 1.81× since 2000 — not for the per-pixel animation.) The timelapse shows first urbanisation, not later redevelopment of already-built land.
- 🗺️ District / Assembly boundaries — all 261 MMDAs (hover for the name + region); Guan District (2021) is sourced from OpenStreetMap since it postdates the global ADM2 sets.
- Plus flood-susceptibility (national + Accra-fine) and development-on-flood-prone-land overlays, each with its own legend.
I · Early Warning & the alerting console math
Two linked surfaces that turn the analysis into action. The Early Warning
board (/earlywarning.html) answers what is coming, when, and
who it hits. The alerting console (/console.html)
is where an authorised body decides what to say about it. They are deliberately
separate: the board can be open in an operations room, while the power to issue stays
behind the console's review chain.
Where the forecast comes from
- Riverine — Google Flood Forecasting API (Flood Hub),
up to a 7-day horizon. FloodGuard reads the gauge inventory, each gauge's
warning / danger / extreme-danger thresholds, its current severity and
trend, and the full forecast time series. Requires
FLOODGUARD_FLOODHUB_KEY; without it the board says so plainly and the other two layers keep working. - Pluvial — Open-Meteo rainfall forecast (free, no key), banded at 30 mm/day (notable) and 50 mm/day (heavy).
- Terrain — the existing HAND/TWI/impervious susceptibility grid, which says where water collects regardless of what falls.
Lead time — the number decisions are made on
Severity says a flood is coming. Lead time says how long you have, and it is the figure an evacuation or drain-clearing decision actually turns on. It is computed as the hours from now until the forecast series first crosses a gauge threshold:
lead = min over crossed thresholds of ( tfirst crossing − tnow )
Two rules matter, and both exist because getting them wrong misreports urgency:
- The value in effect now is the timestep whose interval contains now, not the next one starting in the future. Forecast timesteps rarely align with the clock, so a naive "future only" test skips the current step and reports the next crossing — telling an officer they have 12 hours while the river is already over its danger level.
- The headline lead is the soonest crossing, not the highest. A gauge already above danger that reaches extreme in 12 h is dangerous now; the 12 h is an escalation, not a grace period. The board reports "already at or above danger; reaches extreme in 12 h".
Threats are ranked by severity first, then by soonest-acting — a severe gauge peaking in six hours outranks an extreme one peaking in five days, because the six-hour one is the one still open to action.
Who is exposed
Each threat is snapped to the MMDAs it speaks for (the containing assembly plus any within a 35 km influence radius, because a river does not stop at a boundary). For each we report built-up land in the susceptible band (settlement grid × flood susceptibility ≥ 0.55, sampled on a lattice clipped to the district) and permits this authority holds there — something no other early-warning product knows. Population is deliberately not reported: no gridded population layer is bundled, and a guessed headcount in an evacuation decision is worse than an honest blank. Ingesting GHS-POP would enable it.
Targeting the affected area (catchment, not district)
When Google is actively forecasting a flood at a gauge it publishes the predicted inundation extent — the actual area water is expected to reach. FloodGuard fetches that polygon (KML, decoded to a lat/lon ring) and uses it as the alert geometry, so a warning drafted from the board targets the catchment the flood will hit, not the administrative district it happens to sit in. The MMDA is kept as the human area description and the list of who is affected. When no extent is published — a gauge not currently in flood — targeting falls back to the district boundary, and the alert says which of the two it used. The board draws the extent on the map (hatched red) so an officer sees the real footprint before drafting.
Who may warn — the mandate matrix
FloodGuard does not warn anybody. It drafts; an authorised Ghanaian body decides, signs off and issues on its own channels. The console refuses to let an operator issue outside its own mandate:
- GMet — meteorological warnings (rain, storm, wind, heat). Ghana Meteorological Agency Act, 2004 (Act 682). Also Ghana's national CAP-authoring authority under the WMO/NOAA CAP implementation.
- Hydrological Services Department — riverine, coastal and dam-release hydrology. Departmental mandate, Ministry of Works and Housing.
- NADMO — disaster warning, public alerting and evacuation; the broadest mandate. NADMO Act, 2016 (Act 927).
- MMDA — local action within its own area. Local Governance Act, 2016 (Act 936). An assembly may issue a local action notice freely, but a public flood warning asserts a hydrological forecast that is not its mandate — it needs a co-signature from GMet, HSD or NADMO. This is the single most likely way a well-meaning assembly accidentally competes with the national warning voice, so it is enforced in code.
The review chain
draft → submitted → authorised → dispatched, with cancel and all-clear.
Enforced at every step:
- A named officer for every step — while the analysis tools stay open for the adoption phase, warning the public is never an open-access action. Reading the board is open; drafting, authorising, dispatching, cancelling an alert or forcing a feed poll all require a real, logged-in officer, so every move in an alert's life has a person against it.
- Two-person rule — the drafter cannot authorise their own public alert. Open-access preview cannot satisfy it at all, and says so rather than pretending.
- One dispatch, even under a race — if two officers press dispatch at the same instant, an atomic database transition lets exactly one through; the other is turned away before anything is sent, so a warning is never pushed twice.
- Unverified translations block dispatch — local-language blocks are machine-drafted seeds, marked unverified, and a named speaker must confirm the wording before a public alert can go out. A mistranslated evacuation instruction is worse than no translation.
- Every alert must carry an instruction and an expiry. An alert that says what is coming but not what to do does not change behaviour; one that never expires becomes a false alarm accumulating silently.
- Full chain of custody — who drafted, who confirmed each language, who authorised, who dispatched and on which channels, and what the outcome was.
CAP 1.2 — why FloodGuard is not another warning channel
Alerts are emitted as OASIS Common Alerting Protocol 1.2
(ITU-T X.1303bis) at /api/alerts/{id}/cap.xml, indexed by a CAP-over-RSS
feed at /api/alerts/feed.xml. Ghana is standing CAP up nationally through
GMet with WMO and NOAA, so emitting CAP means the authority's existing dissemination
rail consumes FloodGuard's output unchanged. Element order follows the CAP schema
sequence; polygons are emitted lat,lon and closed as the standard requires;
the evidence (forecast peak, susceptibility band, gauge severity, engine version)
travels with the message as CAP <parameter> entries so an
after-action review can see what it rested on. FloodGuard does not send SMS or
broadcast — dissemination stays on the authority's rail.
Delivery — pluggable, dormant by default
Dispatching an alert marks it live, mints the CAP document and records the channels the authority used. If the authority configures an automated delivery channel, dispatch also pushes the alert on it — otherwise nothing is sent and the receipt says so plainly. FloodGuard never carries a default sending account:
- Area broadcast (the safe default). A
webhookprovider POSTs the CAP 1.2 document to an endpoint the authority runs — its CAP aggregator or cell-broadcast gateway. It targets an AREA and carries no personal data, which is how a public warning should work. - SMS to a list. Gateway providers (Hubtel, mNotify) are wired to fire the moment the authority's credentials are set. Because a phone list is personal data, it is accepted only from a logged-in officer who confirms the numbers were collected with consent (Data Protection Act, 2012 (Act 843)); without both, the SMS path refuses rather than guesses.
- Honest receipts. Every dispatch records what actually went out — provider, status (sent / not-configured / skipped / failed) and detail — visible in the console and the audit trail. The console shows up-front whether pressing Dispatch reaches anyone or only records intent, so the button never implies delivery it cannot perform.
Skill: what is proven and what is not
- Spatial skill — measured, independent. Global Flood Database (Tellman et al. 2021), AUC 0.80, 95% detection. The grid puts flooding where flooding is observed.
- Operating point — the planning threshold is not an alerting threshold. At the screening value of 0.45 the false-alarm rate is ~51%: correct for deciding whether a permit needs a drainage condition, ruinous for public warning. The console publishes the full threshold sweep and recommends 0.55 for public dispatch (~67% detection, ~32% false alarm), keeping 0.45 for internal action notices. Youden's J is flat across that range and weights a miss and a false alarm equally — public warning does not, so the quieter end is chosen deliberately.
- Forecast timing skill — NOT established. Whether an alert fires on the right day cannot be shown from historical flood extents, because no archive exists of what the forecast said beforehand. FloodGuard therefore writes one: a background poller records every riverine observation and stitches consecutive polls into flood episodes carrying their first detection, so median lead time becomes measurable. Until episodes accumulate the tool reports "not yet established" rather than borrowing credibility from the spatial validation.
Demonstration mode
Because the Flood Forecasting API key is issued per Google Cloud project after a
manual enablement step, the board can run on built-in example gauges
(DEMO_MODE file at the repo root, or
FLOODGUARD_FLOODHUB_FIXTURE=1). Whenever it is on, a red
DEMONSTRATION DATA banner runs across the top of the board. A live key
always wins over demo mode, and the marker is never deployed to production.
Reliability & operations
Because this is a life-safety surface, availability is treated as a first-class concern:
- Quota-protected. The endpoints that reach Google Flood Hub are per-caller rate-limited (30 requests/min) so no burst of traffic can exhaust the forecasting API's request budget and take the board offline. The heavy calibration computation and the public CAP feed are throttled too. Gauge and threshold reads are additionally cached in-process (minutes to hours by data type) to keep normal use well inside the budget.
- Fail-loud, never fail-quiet. If the riverine feed is unavailable — no key, upstream error, or the key's project loses access — the board says so in a red banner and falls back to the always-on rainfall-forecast and terrain layers. A quiet board because the feed is off never looks like a quiet board because the country is dry.
- Self-maintaining record. The background poller archives the forecast every 30 minutes (Google keeps no history for us) and prunes raw observations older than 45 days on each run; the durable lead-time record lives in the flood-episode table and is kept indefinitely, so the database stays bounded over a full season.
- Restricted credential. The forecasting key is locked to the server's own IP addresses, so even a leaked key is useless from anywhere else.
J · Economic damage & benefit-cost math
Everything above answers where and how likely. This answers how much it costs — the only currency in which a drainage budget, a levy rate or a retrofit grant is actually argued. A district engineer cannot take “high susceptibility” to a finance committee; they can take “this measure avoids GHS 43,000 of damage a year for GHS 20,000”.
The depth-damage curve
Damage is a function of still-water depth, expressed as a fraction
of what the asset is worth. FloodGuard uses the JRC global depth-damage
functions (Huizinga, de Moel & Szewczyk 2017, EUR 28552 EN,
doi:10.2760/16510) — the same functions behind the World Bank and JRC
global flood risk assessments — taking the Africa continental curves and
interpolating linearly between the published depths:
| Depth | 0.5 m | 1.0 m | 1.5 m | 2.0 m | 3.0 m | 4.0 m |
|---|---|---|---|---|---|---|
| Residential | 0.22 | 0.38 | 0.53 | 0.64 | 0.82 | 0.90 |
| Industry | 0.06 | 0.25 | 0.40 | 0.49 | 0.68 | 0.92 |
| Agriculture | 0.24 | 0.47 | 0.74 | 0.92 | 1.00 | 1.00 |
Industrial floors tolerate a shallow flood better than homes; a crop is a total loss well before a building is. The curves encode both.
What a square metre is worth
FloodGuard reproduces JRC's own published Ghana values, by JRC's own formula: construction cost from the GDP-per-capita power law, then ×0.60 depreciation, ×(1−0.40) for the undamageable part of a concrete or masonry building, then ×(1+contents). That gives residential 207.41, commerce 316.39 and industry 286.85 €/m² (2010) — matching the published figures to five decimal places.
Every building value carries JRC's 90 % confidence interval — for residential, −28 % to +53 %. These are screening figures, and a number quoted without that band claims a precision the source does not have.
How it is built changes what it is worth
Nowhere more than in Accra. JRC publishes material and settlement factors to be applied by the analyst, so FloodGuard asks rather than assuming formal concrete construction:
| How it is built | Residential €/m² (2010) |
|---|---|
| Formal — concrete / masonry | 207.41 |
| Informal settlement / slum | 43.21 |
| Mud walls | 69.14 |
| Corrugated sheet | 124.45 |
| Rural | 69.13 |
Cropland is not valued like a building
A flood does not write off a field the way it writes off a building — it destroys one season's production. So cropland's maximum damage is Ghana's annual agricultural value added, 431.27 €/ha → 0.0431 €/m² (2010), with no depreciation, no undamageable fraction and no contents ratio. It is an annual flow, not a capital stock, so it is never depreciated over a service life. Every response states which basis it used, because the two are not interchangeable.
Expected annual damage (EAD)
A single flood figure is not a risk. EAD integrates damage against annual exceedance probability p = 1/T across the return periods supplied, by the trapezoidal rule:
EAD = Σ ½ · (Di + Di+1) · (pi − pi+1)
damage_threshold_return_period), and the rare tail beyond
the worst scenario supplied is never extrapolated. EAD is therefore biased low,
and every response says so in its bias field.Benefit-cost
A measure is valued as the expected annual damage it removes, discounted over its service life, against what it costs: benefit-cost ratio, net present value and payback. This ranks options against each other; it is not a substitute for a full economic appraisal.
The default rate is 6 %, after the World Bank's own Greater Accra Resilient and Integrated Development appraisal (P164330) — the closest comparator there is, same city and same hazard. Ghana prescribes no discount rate: Act 921 and L.I. 2411 require a positive economic net present value but name no figure, and the Ministry of Finance's 2024 appraisal manual cites 12 % as a general developing-country default, as does the African Development Bank for Ghana. Because the choice is contestable and changes the answer, the result is always shown with a sensitivity across 3 / 6 / 12 %.
The rate must be a real rate. Benefits are held in constant present-day cedis and never escalated, so a nominal cost of capital would count inflation twice. And because the cedi figure is an assumed exchange rate away from a euro damage, the benefit-cost ratio is directly proportional to that rate — the same measure flips from "does not pay" to "worth doing" between 11 and 16.5 GHS/€. The rate used is shown with every result.
What this engine refuses to do
- It will not invent a depth. FloodGuard's hazard layer produces a susceptibility band, not metres of water. Depth is an input — from a scenario, a hydraulic model or an inundation map — never an output. Ask for damage without a depth and the endpoint returns 400.
- It will not substitute a curve. JRC publishes no Africa curve for commerce, transport or infrastructure. Rather than silently borrowing the European one — the easiest possible route to an indefensible number — those classes are refused, and the response names the three classes that are available.
- It flags its own assumptions. Cost inflation since 2010 (×1.55) and the EUR→GHS rate (16.5) are assumptions, not sourced figures, and travel with every result that uses them.
- It states its evidence base honestly. These are transferred, uncalibrated functions; no Ghana-specific damage function exists, and the industrial class may rest on a single South African study. Every output is an order-of-magnitude screening estimate and says so.
Where you actually use it
In the adaptation simulator — the panel that already told you what a measure costs and how much runoff it cuts, but never what it saves. Run a scenario and the “Is it worth building?” card appears beneath the result with the cost already filled in. Give it the floor area, what the building is, and the flood depth at two or more return periods, and it returns damage avoided per year, the value over the measure's life, the benefit-cost ratio and the payback.
Endpoints: /api/damage/provenance (read this first),
/api/damage/parcel, /api/damage/ead,
/api/damage/benefit.
Data sources (open & auditable)
| Layer | Dataset · resolution | Provider / year |
|---|---|---|
| Total imperviousness | ESA WorldCover built-up ×0.85 · 10 m COG / 100–250 m grid | ESA 2021 |
| Vegetation discount | Sentinel-2 green-season NDVI | Copernicus |
| Building roofs | Overture / OpenStreetMap footprints | OSM |
| Flood susceptibility | MERIT Hydro (HAND/TWI) + ESA WorldCover · ~90 m | 0.45·HAND+0.35·TWI+0.20·imperv |
| River-flood hazard | JRC Global River Flood Hazard · ~928 m | Copernicus/GloFAS, Dottori 2016 |
| Flood validation | Global Flood Database (MODIS) · 250 m | Tellman et al. 2021, Nature 596:80 |
| Settlement growth | WSF Evolution 1985–2015 (30 m) + WSF 2019 (10 m); GHSL GHS-BUILT-S 2000–2025 surface (100 m) | DLR/ESA, Marconcini 2020 · JRC GHSL R2023 |
| Elevation & rain forecast | Copernicus DEM (~30 m) via Open-Meteo; NASA GPM IMERG | Copernicus / NASA |
| Depth-damage functions & asset values | JRC global depth-damage functions, Africa curves + Ghana construction costs | Huizinga et al. 2017, EUR 28552 EN, doi:10.2760/16510 |
| Riverine forecast | Google Flood Forecasting API (Flood Hub) · 7-day | |
| Districts (261 MMDAs) | geoBoundaries ADM2 (260) + Guan District from OpenStreetMap | geoBoundaries · OSM |
| Soil texture | WoSIS/SoilGrids via SafeGround | ISRIC |
| Heat | Landsat 8/9 LST (dry-season median), mapped as a heat-island anomaly (LST − ~7 km local mean); + ERA5 felt-heat grid | NASA/USGS · ECMWF |
| Ambient air | Arku et al. & Ghana fixed-site studies | published |
Validation (honest, non-circular)
An independent literature audit (§8z of the methodology) corroborated the Kumasi IDF to the digit, verified the Rational Method and both heat-index formulas numerically, and confirmed all 11 runoff C values sit within ASCE/DIN ranges. The engineer’s audit (§10) checked SSI, C, Q=CiA, V=CPA, Kirpich, the zone flood index and the levy for dimensional consistency.
Legal basis (Ghanaian instruments cited)
| Instrument | Used for |
|---|---|
| Land Use & Spatial Planning Act, 2016 (Act 925) | Permit requirement, Spatial Planning Committee, appeals, planning standards |
| LI 2384 (2019) | Permitting regulations, 30-working-day target (Reg 44(10)), Certificate of Habitation (Reg 45) |
| National Building Regulations, 1996 (LI 1630) | Drainage (Reg 9), plinth/structure, staged inspections, 5-yr validity, deemed approval |
| Ghana Building Code, 2018 (GhBC / GS 1207:2018) | Technical drainage/structural standard alongside LI 1630 |
| Environmental Assessment Regulations, 1999 (LI 1652); EPA Act, 2025 (Act 1124) | EIA screening & EPA clearance |
| Local Governance Act, 2016 (Act 936, s.181) | Assembly bye-law-making & standards |
| Data Protection Act, 2012 (Act 843) | Applicant/owner personal-data handling & officer-only register |
| Water Resources Commission Act 522; WRC Buffer Zone Policy | Watercourse riparian buffers |
| Wetlands Management (Ramsar) LI 1659; Act 1115 | Wetland / protected-area no-build |
| NADMO Act, 2016 (Act 927) | Flood-prone land / disaster context |
Where a specific section or regulation number is uncertain it is cited at Act/Regulation level with a note to confirm — the tool never asserts false precision.
Scope & limitations (please read)
- Decision-support screening, not an engineering drainage/structural design — it supports the Spatial Planning Committee, it does not replace it.
- The flood-susceptibility map is a screening read (where water collects); not a hydrodynamic depth/extent forecast. Hydrodynamic routing, surveyed drain capacities and an official validated DEM remain genuine data gaps.
- Rainfall IDF depths are representative until official GMet / Hydrological Services Department curves are licensed.
- Zoning scheme, fees, levy tariffs and some bye-law figures are illustrative until each Assembly loads its gazetted scheme and Fee-Fixing Resolution.
- Calibration is strongest for Greater Accra; national coverage uses representative figures.
- A “compliant” retention verdict is provisional on a site percolation test on clay soils.
Glossary
| SSI | Sealed Surface Index — % impervious cover. |
| C | Runoff coefficient — fraction of rain that runs off. |
| HAND | Height Above Nearest Drainage — how low the land sits vs where it drains. |
| TWI | Topographic Wetness Index — where water accumulates. |
| Pluvial / Fluvial | Rain-on-ground flooding / river flooding. |
| IDF | Intensity–Duration–Frequency rainfall curve. |
| tc | Time of concentration — how long runoff takes to reach the outlet. |
| WBGT | Wet-Bulb Globe Temperature — outdoor heat-stress metric (here, a screening index). |
| Vd | Deposition velocity — how fast a pollutant is captured by leaf surface. |
| LAI | Leaf Area Index — m² of leaf per m² of ground/surface. |
| MMDA | Metropolitan / Municipal / District Assembly. |
| SPC / TSC | Spatial Planning Committee / its Technical Sub-Committee. |
| AUC | Area Under the ROC Curve — a 0.5–1.0 skill score (0.80 = good). |
FAQ
Does it predict that my house will flood?
No. It tells you whether your area is flood-prone (terrain + sealing) and whether you’re near a recorded flood corridor, and it can give a forecast-window early-warning. For live river-flood forecasts, follow the Google Flood Hub link in the tool.
Where do the numbers come from?
Every formula, constant and data source is in the Methods & the math sections above, with its file location and citation. Nothing is a black box.
Is the levy a new tax?
No — it’s optional, Assembly-controlled, sealing-based cost-recovery on the existing property-rate bill. The Assembly sets the tariff.
Do I need an account?
No. The analysis tools are open. Officer/committee actions and the PII register require an officer sign-in (Data Protection Act 2012).
Contact / request a demo
FloodGuard Accra is developed by Minka Aduse-Poku, PhD (urban climate & green infrastructure).
📞 0547370075 · ✉ a.minka@yahoo.com · 🌐 floodguard.resilicity.com
This Knowledge Centre is generated from the live engine and is updated whenever the tool changes. Screening decision-support, not an engineering drainage design or a hydrodynamic flood forecast.