Skip to content

Commit ac67269

Browse files
docs(cems): complete hazard vocabulary, status enum, multi-hazard rules
Driven by review questions on completeness: - Hazard crosswalk now covers the full CEMS category vocabulary (11 values incl. Volcanic Activity, Humanitarian Crisis, Environmental Degradation, Transport/ Industrial accident), with subCategory refinement, case-normalisation, and a mandatory manual-review fallthrough for unmapped categories. - statusCode mapping completed from observed enum F/I/W/N -> published/in-production/planned/withdrawn (planned & in-production do exist); note N->no-impact when version.reason says so. GRM (grading-monitoring) type -> eo-gra + monitoring_number. - Multi-hazard identification: DEL products carry no hazard type, so multiple DELs are monitoring iterations, NOT multiple hazards. Multi-hazard is derived from category/subCategory and from GRA/GRM stats hazard-footprint classes (Flooded area, Flood trace, Landslide, Burnt area). - GRA stats split into exposure classes (-> Impact) vs hazard-footprint classes (-> Hazard) vs aggregates (skip); refine open decisions accordingly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent ccb44b8 commit ac67269

1 file changed

Lines changed: 75 additions & 29 deletions

File tree

docs/model/sources/CEMS/README.md

Lines changed: 75 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,35 @@ mirrors the Charter Area→Hazard mapping.
149149
> activation, emit one item per `monty:hazard_codes` set, same geometry. Single-category
150150
> activations (the common case) yield one Hazard per AOI.
151151
152+
### Identifying multi-hazard
153+
154+
A CEMS activation carries a **single** `category` + `subCategory`, and **DEL products carry
155+
no hazard-type field** — so *multiple delineation products do **not** signal multiple hazards*
156+
(several DELs in an AOI are **monitoring iterations** of the same mapping). Multi-hazard is
157+
identified from two other signals:
158+
159+
1. **`category` + `subCategory`** — the primary hazard (e.g. `Storm` / `Tropical cyclone`).
160+
2. **GRA/GRM `stats` hazard-footprint classes** — thematic classes that name a *phenomenon*
161+
rather than an exposed asset reveal secondary hazards. Observed footprint classes:
162+
`Flooded area`, `Flood trace`, `Landslide`, `Burnt area` (e.g. a `Landslide` class inside a
163+
`Storm` activation ⇒ a secondary landslide hazard). `Maximum of all extents` and `NA` are
164+
aggregates, not hazards.
165+
166+
Emit one Hazard item per distinct hazard code so identified. The primary hazard takes its
167+
geometry from the DEL delineation (§ above); a secondary hazard surfaced only via a GRA
168+
footprint class takes its geometry from that class's extent where available, else the AOI
169+
extent, and its severity from the class figure. Do **not** infer hazard multiplicity from the
170+
DEL count.
171+
152172
## Product → Response
153173

154174
Each product maps to a Monty Response item via `monty:response_detail`.
155175

156176
| CEMS field (product) | Monty field | Notes |
157177
|----------------------|-------------|-------|
158-
| `type` | `monty:response_detail.type` | `REF``eo-ref`, `FEP``eo-fep`, `DEL``eo-del`, `GRA``eo-gra` |
178+
| `type` | `monty:response_detail.type` | `REF``eo-ref`, `FEP``eo-fep`, `DEL``eo-del`, `GRA``eo-gra`. Monitoring/variant type codes (e.g. **`GRM`** grading-monitoring) map to their base product code (`eo-gra`) with `monitoring_number` set |
159179
| `code` (activation) | `monty:response_detail.source_id` | e.g. `EMSR847` (source-system anchor) |
160-
| `version.statusCode` | `monty:response_detail.status` | `F``finished`/`published`; `N` (not produced)→`withdrawn`. Confirm full enum (see [Open decisions](#open-decisions)) |
180+
| `version.statusCode` | `monty:response_detail.status` | `F` (delivered)→`published`; `I` (in production)→`in-production`; `W` (scheduled, future `expectedDelivery`)→`planned`; `N` (not produced)→`withdrawn`, or `no-impact` when `version.reason` indicates no damage/impact. `feasible=false``withdrawn` |
161181
| `monitoring` / `monitoringNumber` | `monty:response_detail.monitoring_number` | Set **only** when `monitoring=true`; iteration links to the prior via `rel: prev` |
162182
| `extent` (WKT) | `geometry` / `bbox` | Product footprint (AOI extent) |
163183
|| `monty:response_detail.producer` | `Copernicus EMS` (mapping provider) |
@@ -187,12 +207,20 @@ Only **GRA** products carry `stats`, shaped as
187207
"Built-up [No.]": { "None": { "affected": 48253 } } }
188208
```
189209

190-
Per the [Response ↔ Impact boundary rules](../../response-impact-boundary.md), emit **one
191-
Impact item per thematic class**:
210+
Not every thematic class is an Impact. **Split the classes by kind first:**
211+
212+
- **Exposure / effect classes → Impact items** (one each): `Estimated population`, `Built-up`,
213+
`Transportation`, `Land use`, `Facilities`, `Blocked road / interruption`, `Temporary camp`, …
214+
- **Hazard-footprint classes → Hazard** (not Impact): `Flooded area`, `Flood trace`,
215+
`Landslide`, `Burnt area` — these describe the phenomenon extent; they feed the Hazard
216+
geometry/severity (see [Identifying multi-hazard](#identifying-multi-hazard)).
217+
- **Aggregates → skip**: `Maximum of all extents`, `NA`.
192218

193-
- `monty:impact_detail`: `category`/`type` from the thematic class (population, buildings,
194-
roads, land use, burnt area, …), `value` = `affected` (fallback `total`), `unit` from the
195-
key/`unit` (`[No.]`, `[ha]`, `[km]`), `estimate_type: "primary"`.
219+
Per the [Response ↔ Impact boundary rules](../../response-impact-boundary.md), for each
220+
**exposure** class emit **one Impact item**:
221+
222+
- `monty:impact_detail`: `category`/`type` from the thematic class, `value` = `affected`
223+
(fallback `total`), `unit` from the key/`unit` (`[No.]`, `[ha]`, `[km]`), `estimate_type: "primary"`.
196224
- Canonical edge: **`Impact → derived_from → Response`** (the GRA Response), `roles: ["response"]`.
197225
- Both items share the Event's `monty:corr_id`.
198226
- Guard the `"NA"` / missing `total` case (skip or emit without a numeric value per boundary rules).
@@ -219,19 +247,31 @@ Open: GDACS episode resolution, and whether to emit links before the target is i
219247

220248
## Hazard codes
221249

222-
CEMS `category` (refine with `subCategory`) maps to Monty hazard codes. UNDRR-ISC 2025 is
223-
required (exactly one per item); GLIDE and EM-DAT are recommended.
224-
225-
| CEMS `category` | UNDRR-ISC 2025 | GLIDE | EM-DAT | Notes |
226-
|-----------------|----------------|-------|--------|-------|
227-
| Flood | MH0600 | FL | nat-hyd-flo-flo | Refine to MH0603/MH0604 (flash/riverine) |
228-
| Wildfire | MH1301 | WF | nat-cli-wil-for | |
229-
| Storm | MH0400 | ST | nat-met-sto | Refine to MH0403/`TC`/`nat-met-sto-tro` when `subCategory` = tropical cyclone/hurricane/typhoon |
230-
| Earthquake | GH0101 | EQ | nat-geo-ear-gro | |
231-
| Mass movement | MH0901 | LS | nat-geo-mmd-lan | Landslide/mass movement |
232-
| Industrial accident | TH03xx / TH06xx || tec-ind | Technological — pick chemical vs explosion from `subCategory` (manual review) |
250+
CEMS `category` (refined by `subCategory`) maps to Monty hazard codes. UNDRR-ISC 2025 is
251+
required (exactly one per Hazard item); GLIDE and EM-DAT are recommended. The complete CEMS
252+
category vocabulary (from the full activation catalogue, all DRM phases; **case-normalise**
253+
`Mass Movement`/`Mass movement`, `Industrial Accident`/`Industrial accident` occur in both
254+
casings):
255+
256+
| CEMS `category` | UNDRR-ISC 2025 | GLIDE | EM-DAT | Notes / `subCategory` refinement |
257+
|-----------------|----------------|-------|--------|----------------------------------|
258+
| Flood | MH0600 | FL | nat-hyd-flo-flo | `Riverine flood`→MH0604, flash→MH0603, coastal/surge→MH0605 |
259+
| Wildfire | MH1301 | WF | nat-cli-wil-for | `Forest fire`; land/other fire variants |
260+
| Storm | MH0400 | ST | nat-met-sto | `Tropical cyclone, hurricane, typhoon`→MH0403 / `TC` / `nat-met-sto-tro` |
261+
| Earthquake | GH0101 | EQ | nat-geo-ear-gro | `Ground shaking`; tsunami subCat→GH0301/`TS` |
262+
| Mass Movement | MH0901 | LS | nat-geo-mmd-lan | Landslide; avalanche→MH1201, rockfall/subsidence per `subCategory` |
263+
| Volcanic Activity | GH0201 | VO | nat-geo-vol | Eruption; ashfall/lahar per `subCategory` |
264+
| Industrial Accident | TH0300 / TH0600 || tec-ind | Technological — chemical (TH0300) vs explosion (TH0600) vs oil spill from `subCategory`; manual review |
233265
| Transport accident ||| tec-tra | Technological — no clean UNDRR-ISC; manual review |
234-
| Other || OT || No code — manual review |
266+
| Humanitarian Crisis || CE || Complex/societal emergency — no UNDRR-ISC natural code; manual review (mostly Risk & Recovery, out of core RM scope) |
267+
| Environmental Degradation |||| Environmental hazard — no clean UNDRR-ISC; manual review |
268+
| Other || OT || Unclassified — manual review |
269+
270+
> **Completeness**: this table covers the full observed vocabulary (RM currently exercises
271+
> Flood, Wildfire, Storm, Earthquake, Mass Movement, Industrial/Transport accident, Other;
272+
> Volcanic Activity, Humanitarian Crisis, Environmental Degradation appear in the broader
273+
> catalogue). Any **unmapped or new** `category` MUST fall through to manual review rather
274+
> than be dropped. `subCategory` (detail endpoint only) is the refinement key.
235275
236276
Apply `hazard_profiles.get_canonical_hazard_codes()` after mapping.
237277

@@ -249,20 +289,26 @@ See [`FINDINGS.md`](./FINDINGS.md) for the raw familiarisation notes (esa-montan
249289

250290
## Open decisions
251291

252-
1. **`statusCode` enum** — only `F` (final) and `N` (not produced) observed; confirm the
253-
full set historically and finalise the `monty:response_detail.status` mapping.
254-
2. **Hazard geometry source***resolved:* AOI → Hazard, geometry = DEL delineation when
255-
present, else AOI `extent`. Remaining detail: which DEL (base vs latest monitoring) supplies
256-
the polygon, and whether to update the Hazard geometry as monitoring DELs arrive.
257-
3. **Response geometry** — per-AOI vs per-product `extent` for Response items (both present;
292+
1. **`statusCode` enum** — observed `F` (delivered), `I` (in production), `W` (scheduled),
293+
`N` (not produced), mapped to `published`/`in-production`/`planned`/`withdrawn`
294+
respectively. Confirm no further codes exist historically and pin the `N``withdrawn`
295+
vs `no-impact` rule (from `version.reason`).
296+
2. **Hazard geometry & monitoring** — AOI → Hazard, geometry = DEL delineation when present,
297+
else AOI `extent`. Remaining: which DEL supplies the polygon (base vs **latest monitoring**
298+
— lean latest), and whether the Hazard geometry is **updated in place** as monitoring DELs
299+
arrive or versioned.
300+
3. **Multi-hazard extent** — a secondary hazard identified from a GRA footprint class
301+
(`Landslide` in a `Storm` activation) has no dedicated polygon in the API; decide whether to
302+
reuse the AOI/DEL extent or leave geometry coarse.
303+
4. **Response geometry** — per-AOI vs per-product `extent` for Response items (both present;
258304
products carry their own `extent`, generally the AOI extent).
259-
4. **Monitoring lineage**`rel: prev` between iteration *n* and *n-1* keyed by
305+
5. **Monitoring lineage**`rel: prev` between iteration *n* and *n-1* keyed by
260306
`monitoringNumber` (and/or `version.number`).
261-
5. **Source imagery** — emit linked acquisition items (from `images[]`, carrying
307+
6. **Source imagery** — emit linked acquisition items (from `images[]`, carrying
262308
`sat:`/`eo:`/`sar:`) via `derived_from`, or keep `images[]` as product metadata only.
263-
6. **Cross-source links** — resolve GDACS episode; emit `related` links unconditionally
309+
7. **Cross-source links** — resolve GDACS episode; emit `related` links unconditionally
264310
(deterministic id) or only when the target is present in Montandon.
265-
7. **Impact granularity** — per-product GRA `stats` vs aggregated activation `stats`
311+
8. **Impact granularity** — per-product GRA `stats` vs aggregated activation `stats`
266312
(avoid double counting).
267313

268314
## Resources

0 commit comments

Comments
 (0)