fix(wfigs): add IncidentSize to acres keys and curated town_anchors lookup

Acres: prepend IncidentSize to _WFIGS_ACRES_RAW_KEYS so the normalizer
picks up the primary size field before falling back to DiscoveryAcres
and FinalAcres.

Location anchor: query the curated town_anchors table before falling
back to the Photon geocoder nearest_town call, giving consistent
anchor names for Idaho fires.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Matt Johnson (via Claude) 2026-06-07 07:52:36 +00:00
commit b09a5843ce
2 changed files with 25 additions and 1 deletions

View file

@ -401,6 +401,30 @@ def _location_anchor(n: dict) -> str:
lat = n.get("lat") lat = n.get("lat")
lon = n.get("lon") lon = n.get("lon")
if isinstance(lat, (int, float)) and isinstance(lon, (int, float)): if isinstance(lat, (int, float)) and isinstance(lon, (int, float)):
# Try curated town_anchors first
try:
from meshai.persistence import get_db
from meshai.central_normalizer import _haversine_miles as _haversine_mi
from meshai.central_normalizer import _bearing_compass
rows = get_db().execute(
"SELECT name, lat, lon FROM town_anchors WHERE lat IS NOT NULL AND lon IS NOT NULL"
).fetchall()
best = None
best_d = float("inf")
for row in rows:
d = _haversine_mi(lat, lon, row["lat"], row["lon"])
if d < best_d:
best_d = d
best = row
if best and best_d <= float(adapter_config.wfigs.anchor_max_mi):
bearing = _bearing_compass(lat, lon, best["lat"], best["lon"])
d_int = int(round(best_d))
if d_int < 1:
return f"near {best['name']}"
return f"{d_int} mi {bearing} of {best['name']}"
except Exception:
logger.exception("town_anchors lookup failed; falling back to Photon")
try: try:
from meshai.central_normalizer import nearest_town from meshai.central_normalizer import nearest_town
nt = nearest_town(lat, lon, max_distance_mi=float(adapter_config.wfigs.anchor_max_mi)) nt = nearest_town(lat, lon, max_distance_mi=float(adapter_config.wfigs.anchor_max_mi))

View file

@ -618,7 +618,7 @@ def _parse_wzdx_federal(inner_data: dict, geo: dict) -> dict:
# them through verbatim per Matt's call -- they at least signal "new fire # them through verbatim per Matt's call -- they at least signal "new fire
# in <county>" even without an interesting name. # in <county>" even without an interesting name.
_WFIGS_ACRES_KEYS = ("DailyAcres", "IncidentSize") _WFIGS_ACRES_KEYS = ("DailyAcres", "IncidentSize")
_WFIGS_ACRES_RAW_KEYS = ("DiscoveryAcres", "FinalAcres") _WFIGS_ACRES_RAW_KEYS = ("IncidentSize", "DiscoveryAcres", "FinalAcres")
_WFIGS_CONTAINED_KEYS = ("PercentContained",) _WFIGS_CONTAINED_KEYS = ("PercentContained",)
_WFIGS_CONTAINED_RAW_KEYS = ("PercentContained",) _WFIGS_CONTAINED_RAW_KEYS = ("PercentContained",)