Add /api/reverse/<lat>/<lon> localhost-sourced enrichment bundle

New geocode_bp sibling to the existing /api/reverse?lat=&lon= route (which
is unchanged). Returns a flat 9-field bundle for the Central enrichment
framework: name, city, county, state, country, postal_code (Photon),
timezone (timezones.sqlite via R-tree + shapely), landclass (in-process
lookup_landclass), elevation_m (Valhalla /height).

- Each component lookup is independent and wrapped in try/except: a failure
  logs a warning and yields null, never a 5xx. 400 only on unparseable /
  out-of-range coordinates.
- lat/lon parsed manually rather than via Flask <float:>, which rejects
  negative and integer coordinates and would 404 instead of 400.
- 10k-entry / 24h TTLCache keyed on coords rounded to 4 decimals.
- Tests mock Photon/Valhalla/landclass; one test exercises the real
  timezones.sqlite. cachetools pinned in requirements.txt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matt 2026-05-20 05:33:45 +00:00
commit f276b95753
3 changed files with 298 additions and 0 deletions

View file

@ -3,6 +3,7 @@ anyio==4.12.1
babel==2.18.0
beautifulsoup4==4.14.3
blinker==1.9.0
cachetools==7.1.3
certifi==2026.1.4
cffi==2.0.0
charset-normalizer==3.4.4