Closes the last clutter source. NLOS heatmaps now see trees as obstacles in addition to buildings: - New Towerops.Coverages.TreeCanopy module fetches an AAIGrid of canopy heights for the coverage bbox via the same /vsicurl/ + Lidar.Reader pipeline used for terrain. Source defaults to the public LANDFIRE 2022 EVH COG (~30 m, all CONUS) and is override-able via :tree_canopy_url. - EVH cells are integer codes; decode_evh maps the canopy range (101..199 → height-100 m), the herbaceous range (11..29 → (code-10) * 0.1 m), and zeroes everything else. - Profile.sample/5 takes a :canopy grid alongside :clutter and uses max(building_height, canopy_height) so a tree poking above a one-storey roof still shadows. - CoverageWorker fetches the canopy grid once per job (best effort — failures log + continue with nil) and threads it through the env map. LOS keeps clutter empty + canopy nil (height-above-clutter view); NLOS gets both. - Tests: tree_canopy_test for the disabled / override paths; test_helper disables the LANDFIRE fetch by default so the rest of the suite doesn't stream remote bytes. |
||
|---|---|---|
| .. | ||
| mix/tasks | ||
| snmpkit | ||
| towerops | ||
| towerops_web | ||
| snmp_lib.ex | ||
| snmp_mgr.ex | ||
| snmpkit.ex | ||
| towerops.ex | ||
| towerops_native.ex | ||
| towerops_web.ex | ||