Geo-Targeting Wireless Alerts Without Overshoot
An incident commander approves a tight 4-square-kilometre evacuation polygon precisely to avoid alerting people who are not at risk. The Wireless Emergency Alert derived from it reaches roughly 31 square kilometres, because one corner of the polygon clips a rural cell sector whose tower serves a town 11 kilometres away. Nine thousand people receive an evacuation order, and the roads the actual evacuation needs fill with cars from a town that was never threatened.
Root Cause and Operational Impact
Wireless Emergency Alerts are delivered by cell broadcast, which means the unit of delivery is a cell sector, not a polygon. Every sector that intersects the alert area receives the message in full, and the delivered area is the union of those sectors. Nothing about that is a defect — it is how broadcast works — but it makes the delivered area a property of the cell network’s geometry rather than of the authored polygon.
The consequence that surprises people is that overshoot is not proportional to polygon size. It is dominated by the single largest sector the polygon happens to touch, so a polygon can be made smaller and deliver almost the same area, or moved 300 metres and deliver a fifth as much. Authoring intuition, which assumes a smaller shape means a smaller alert, is simply not applicable.
The operational cost is concrete. People outside the hazard who act on an evacuation order consume the road capacity the real evacuation needs — the evacuation routing layer models capacity that over-alerting silently consumes. The longer-term cost is compliance: a population repeatedly alerted for hazards that did not reach them responds more slowly the next time.
Tiered Resolution Strategy
- Estimate the delivered area before release (definitive). Compute the union of intersecting sectors and show the approver the ratio. Everything else in this guide depends on the overshoot being visible at the moment of decision rather than discovered afterwards.
- Identify the dominant sector and test moving away from it. Because one sector usually accounts for most of the excess, the highest-leverage edit is a small adjustment to the polygon boundary near it — and it is only acceptable if the ground being excluded genuinely is not at risk.
- Split the alert where the geography justifies it. Two smaller polygons that avoid the large sector can deliver far less than one that clips it, at the cost of more messages.
- Use device-based geofencing as a narrowing layer, never as the plan. Handsets that filter on the polygon get precision; the rest still receive the broadcast. It reduces the population that acts, not the population that receives.
- Word the message for the delivered area (safe default). Whatever the overshoot, the text must let a recipient outside the polygon determine that quickly. That is not a substitute for reducing overshoot; it is what limits the damage from the overshoot that remains.
Tier five deserves emphasis because it is cheap and frequently skipped. An alert whose first line names the specific area — a road, a subdivision, a recognisable boundary — lets someone eleven kilometres away resolve their situation in seconds. An alert that says only “evacuate immediately” gives them no way to, so they act.
Production Python Implementation
from __future__ import annotations
import logging
from dataclasses import dataclass
import geopandas as gpd
from shapely.geometry.base import BaseGeometry
from shapely.ops import unary_union
logger = logging.getLogger("incidentgis.wea_overshoot")
# Ratio above which the approver must acknowledge the overshoot explicitly.
OVERSHOOT_WARN = 1.5
@dataclass(frozen=True)
class OvershootEstimate:
authored_km2: float
delivered_km2: float
ratio: float
excess_population: int
dominant_sector: str
dominant_excess_km2: float
def estimate_overshoot(
alert_area: BaseGeometry,
sectors: gpd.GeoDataFrame,
population: gpd.GeoDataFrame,
*,
metric_crs: str,
) -> OvershootEstimate:
"""Estimate what a cell-broadcast alert will actually reach.
Areas are computed in a projected CRS: measuring in EPSG:4326 would
misreport the ratio by the square of the secant of the latitude, which is
the one error that would make this whole estimate pointless.
"""
if sectors.crs is None or population.crs is None:
raise ValueError("sector and population layers must declare a CRS")
sectors_m = sectors.to_crs(metric_crs)
population_m = population.to_crs(metric_crs)
area_m = gpd.GeoSeries([alert_area], crs=population.crs).to_crs(metric_crs).iloc[0]
touched = sectors_m[sectors_m.intersects(area_m)]
if touched.empty:
raise ValueError("alert area intersects no cell sectors — check the CRS")
delivered = unary_union(touched.geometry.tolist())
excess = delivered.difference(area_m)
# Population outside the polygon but inside the broadcast footprint: the
# people who will act without being at risk.
hit = population_m[population_m.intersects(excess)]
excess_pop = int(hit["population"].sum()) if not hit.empty else 0
# Which single sector contributes most of the excess? That is the lever.
contributions = {
row.sector_id: row.geometry.difference(area_m).area / 1e6
for row in touched.itertuples()
}
dominant_id = max(contributions, key=contributions.get)
estimate = OvershootEstimate(
authored_km2=area_m.area / 1e6,
delivered_km2=delivered.area / 1e6,
ratio=delivered.area / area_m.area,
excess_population=excess_pop,
dominant_sector=str(dominant_id),
dominant_excess_km2=contributions[dominant_id],
)
if estimate.ratio > OVERSHOOT_WARN:
logger.warning("wea_overshoot_high", extra={
"ratio": round(estimate.ratio, 2),
"excess_population": estimate.excess_population,
"dominant_sector": estimate.dominant_sector,
})
logger.info("wea_overshoot_estimated", extra={"ratio": round(estimate.ratio, 2)})
return estimate
Validation Checklist
- The delivered-area estimate runs before every release and its ratio is shown to the approver.
- Areas are computed in a projected CRS, never in EPSG:4326.
- The dominant contributing sector is named on the release screen, not just the total.
- Excess population — inside the broadcast footprint, outside the polygon — is estimated and shown.
- A ratio above the configured threshold requires an explicit acknowledgement rather than a default approval.
- The message text names a recognisable area boundary in its first line.
- The sector geometry used for the estimate is dated, and its age is displayed alongside the estimate.
- A smoke test asserts the estimate is greater than or equal to the authored area for every fixture.
Edge Cases and Gotchas
- Sector geometry that is out of date. Carriers re-sector regularly, and an estimate computed against last year’s footprints is confidently wrong. Display the geometry’s age next to the ratio so the approver can weigh it.
- Sectors with no published geometry. Some coverage is only available as a coarse polygon or not at all. Treat unknown sectors as maximally large rather than excluding them, so the estimate errs toward warning.
- Terrain that makes a sector’s real coverage smaller than its polygon. A ridge can shadow half a sector’s nominal footprint, so the estimate is an upper bound. That is the right direction to be wrong in, and it should be stated rather than tuned away.
- A polygon that clips a sector by a few metres. The delivered area jumps discontinuously as a vertex crosses a sector boundary, so small authoring adjustments can have large effects in both directions. Show the ratio live as the polygon is edited if the authoring tool allows it.
- Estimating in EPSG:4326. The ratio is a ratio of areas, and Web Mercator or geographic areas distort by latitude, which the coordinate reference system standard covers in detail. The ratio survives better than absolute areas do, but the excess-population figure does not.
Frequently Asked Questions
Why does a small alert polygon still reach a large area? Because a Wireless Emergency Alert is delivered by cell broadcast, so the unit of delivery is a cell sector rather than a polygon. Every sector intersecting the alert area receives the message in full and the delivered area is the union of those sectors, which makes it a property of the cell network’s geometry rather than of the polygon. The practical consequence is that overshoot is not proportional to polygon size: it is dominated by the largest single sector the polygon happens to touch, so a 4 square-kilometre polygon clipping one rural sector can deliver over 30 square kilometres.
What is the highest-leverage way to reduce overshoot? Identify the dominant contributing sector and, where it is safe, move the polygon boundary away from it. Because one sector typically accounts for most of the excess, a few hundred metres of adjustment can cut the delivered area several-fold, while shrinking the polygon elsewhere changes almost nothing. This is only acceptable when the excluded strip genuinely is not at risk — the alternative levers are splitting into smaller alerts, which multiplies message count and handset fatigue, and device-based geofencing, which narrows who acts rather than who receives.
What should the approver actually be shown before release? Four numbers rather than a map: the authored area, the estimated delivered area and their ratio, the estimated population inside the broadcast footprint but outside the polygon, and the identifier of the sector contributing most of the excess. The ratio is what turns overshoot from a surprise into a decision, the excess-population figure is what makes the cost concrete in terms of road capacity and future compliance, and the dominant sector names the one lever most likely to change the answer. A map alone shows a shape, not a consequence.
Related
- Public Alerting & CAP Message Pipelines — the message this delivered area is estimated for.
- Evacuation Routing & Road Network Analysis — the road capacity that over-alerting silently consumes.
- Coordinate Reference Systems for Disaster Zones — why the area ratio must be computed in a projected system.
- Optimizing Spatial Joins for Incident Data — making the sector and population intersections fast enough to run while a polygon is being edited.
Up: Public Alerting & CAP Message Pipelines