prop/lib/microwaveprop/rover
Graham McIntire 7105ac61df
feat(rover): add canopy clutter penalty + Canopy.BulkFetch downloader
Rover ranking now applies a per-cell tree-canopy clutter penalty
(1 dB / 8 m, capped at 4 dB) so cells in dense forests get down-ranked
even when their per-station path clearance survives. PathTerrain
already accounts for trees ON the link path; this surfaces "I'm in a
forest, every direction is foliage."

Canopy.BulkFetch downloads Lang et al. 2020 10 m global canopy-height
3-degree COGs and slices each into 1° × 1° uint8 .canopy tiles via
gdal_translate, the runtime image now ships gdal-bin. Run on prod via:

  bin/microwaveprop rpc 'Microwaveprop.Canopy.BulkFetch.run(32.8, -97.0, 200)'

Tile cache lives under /data/canopy/. Already-sliced tiles are skipped.
2026-04-26 12:57:50 -05:00
..
aggregator.ex feat(rover): pure scoring math (link margin, aggregator, drive time) 2026-04-25 16:26:33 -05:00
candidate_detail.ex feat(canopy): add tree-canopy height layer for path obstruction analysis 2026-04-26 12:51:48 -05:00
compute.ex feat(rover): add canopy clutter penalty + Canopy.BulkFetch downloader 2026-04-26 12:57:50 -05:00
drive_time.ex feat(rover): show aim heading + path lines for each fixed station 2026-04-25 18:10:15 -05:00
elevation.ex feat(rover): score per-station terrain clearance from SRTM path samples 2026-04-25 17:29:29 -05:00
fixed_station.ex feat(rover): FixedStation schema with grid-derived lat/lon 2026-04-25 16:26:33 -05:00
hilltop.ex feat(rover): snap top candidates to SRTM hilltops + add hillshade overlay 2026-04-26 09:12:24 -05:00
link_margin.ex feat(rover): pure scoring math (link margin, aggregator, drive time) 2026-04-25 16:26:33 -05:00
path_terrain.ex feat(canopy): add tree-canopy height layer for path obstruction analysis 2026-04-26 12:51:48 -05:00
prominence.ex feat(rover): prefer broad hilltops near roads as ideal candidates 2026-04-25 17:45:48 -05:00
road_proximity.ex fix(rover): bound Overpass with hard 8s deadline + 6h ETS cache by bbox 2026-04-26 09:25:08 -05:00