Coconino County Sheriff's Search & Rescue
Note: This tool generates spatial probability estimates based on terrain, land cover, and modeled travel behavior from the IPP. These outputs are intended as one input among many in the search planning process and do not replace the judgment of search planners, investigators, or incident command staff.
WiSAR Decision Support Tool / SAR TARR Tool
Jacobs Pure heatmap as default: The default heatmap underneath the TARR contours is now driven by Matt Jacobs's (2015) terrain-attractor framework. Each pixel is colored by the strongest applicable empirical attractor signal — stream-trail intersections, trails/roads/power-line ROWs, low-elevation pockets, streams, and high-elevation prominence — independent of cost-distance position from the IPP. The TARR contours still mark the p25/p50/p75 cost-distance envelope on top, so coordinators see both the cost-distance reach and the within-envelope priority. Replaces the prior percentile-band heatmap.
Full-raster heatmap: The heatmap now renders at full opacity across the entire cost-distance raster — no alpha fade past p75 and no attractor clipping past p75. Jacobs found that linear-feature PDEN increases with IPP-find distance, and roughly 1 in 4 finds occur outside the 75th percentile; keeping attractor signal visible to the bbox edge honors both.
Travel Time mode gets a heatmap: The Jacobs Pure heatmap now renders underneath the time-isochrone polygons. Previously Travel Time mode displayed only the contour outlines with no terrain context inside them. Coordinators can now see, for example, that trails and stream-trail intersections within the 4-hour reach are warmer than open hillside at the same distance.
Isochrone intervals: Default time-interval set changed from 1h/2h/4h/8h/12h to 2h/4h/6h/8h/10h/12h, all six checked by default. Even-hour spacing reads more naturally on the map; six contours gives a richer reachability picture for slow-subject planning.
Isochrone bbox sizing: The Travel Time analysis radius now follows the same rule as TARR mode — speed × max_hours + 2 km — replacing the prior 50% buffer multiplier. Consistent sizing across both modes, slightly tighter bbox at high speed/long duration.
UI redesign (post-field-review): Splash modal simplified to two modes: TARR Analysis (renamed from “IPP Only”) and Travel Time. The CalTopo Import mode has been retired — analysis is now anchored to the IPP only. The vestigial “Search Radius” accordion was removed (bbox is auto-computed). Subject-profile percentile fields are now read-only when populated from a Lost Person Behavior profile, since the values come directly from Koester's published statistics. Drop Pin button state now resets correctly on Reset and Switch Mode.
Field tuning: Three post-deploy refinements after first-day testing in Sycamore Canyon. (1) Stream Strahler cutoff lowered from ≥5 to ≥3 to match Colorado Plateau hydrology — the strict ≥5 filter emptied the stream mask for most local analyses since Strahler 5+ flowlines are rare west of the Mogollon Rim. Stream-trail intersections at named creeks like Sycamore Creek now register correctly. (2) Heatmap base opacity reduced from 170/255 to 130/255 so basemap shaded relief reads clearly through the overlay. (3) The white travel-corridor blend (a v1.07 visual aid that brightened friction=1.0 cells) was removed: under the Jacobs framework, trail proximity is already an explicit attractor (weight 0.55), so the blend duplicated the signal and bleached the strongest hotspots (intersections at weight 1.00 were rendering pink instead of red).
Internal cleanup: Removed dead code paths from the CalTopo Import retirement (segment POA computation, segment bbox helper, three stale package re-exports). Refactored switchMode and resetTool to share a single state-clearing helper, eliminating a class of drift bugs (the Drop Pin button highlight was one such case). Layer toggle label updated to “Terrain Attractor Priority” with a tooltip naming Jacobs (2015) as the framework source.
Mobile layout: Below 768 CSS pixels (phones, narrow tablets), the sidebar converts to a bottom-sheet panel with two snap states. Collapsed state shows a drag handle plus a status strip with the current workflow step (e.g., “Subject Profile — in progress”). Peek state reveals the full panel at 50% viewport height with internal scrolling. The map fills the remaining viewport. Drag the handle or tap to switch between states. Desktop layout (≥ 768 CSS pixels) is unchanged.
Status strip: The collapsed-state strip auto-populates from accordion state via a MutationObserver, so it stays in sync with the existing workflow logic without changes to app.js. Priority order: active step, then first incomplete step, then last completed step.
Form-element contrast: Interactive form fields (subject profile dropdown, eco-region/terrain pills, percentile inputs, CalTopo Map ID inputs, IPP coordinate buttons, travel time speed presets, segment list rows) now use a lighter background (#444a55 vs #252830) so they stand out from the panel and read clearly in outdoor lighting on mobile screens. Passive elements (modal info panels, table striping, disabled buttons) keep the original color so the visual hierarchy still works.
Travel Time button state fix: The Run Travel Time Analysis button no longer remains teal when disabled. Previously an inline background style overrode the disabled-state CSS, making the button look enabled before the user had set required inputs. The button is now correctly gray when disabled and teal when ready to run.
OSM local cache fallback: When all public Overpass API endpoints fail, the pipeline now falls through to a locally-maintained OSM cache covering Arizona, California, Utah, Nevada, and New Mexico. Cached data is built weekly from Geofabrik state extracts (~8.3 million trail, road, waterway, and power line features in a spatially-indexed GeoPackage). This guarantees that trail and corridor data are always available for in-state searches, even during widespread Overpass outages.
Data-source warnings: A new status panel in the Analysis Results section surfaces data-source notices to the coordinator — e.g., “OSM live servers unavailable — using cached data from 2026-04-21 (0.0 days old).” Severity is differentiated: “info” for successful fallbacks where output is operationally equivalent, “warning” for degraded results (cache missing, outside coverage, or read error).
Runtime optimization: Typical analysis runtime reduced from ~4 minutes to ~20 seconds. The Overpass per-attempt timeout was lowered from 90s to 20s, a persistent HTTP 406 from overpass-api.de was resolved by adding a proper User-Agent header on all outbound requests, and a non-responsive endpoint (maps.mail.ru) was removed from the rotation. Worst-case OSM phase (all live endpoints failed) reduced from 183s to ~42s with automatic cache fallback.
Cache builder tool: New tools/build_osm_cache.py script performs the weekly cache refresh. Uses memory-bounded Arrow record-batch streaming to process multi-gigabyte state PBFs on modest hardware. Scheduled via cron to run every Sunday at 3 AM MST.
Server logging: Gunicorn now forwards pipeline stdout to journalctl with real-time unbuffered output, enabling production diagnostics without restart.
CalTopo travel-time export: The CalTopo export endpoint now produces correct per-feature titles and descriptions for both TARR contours and travel-time isochrones. TARRs appear in CalTopo as “TARR 25%”, “TARR 50%”, “TARR 75%” with cost-distance thresholds; isochrones appear as “Travel Time: 1.0h”, “Travel Time: 4.0h”, etc. with reachability descriptions. Previously isochrones exported with generic “TARR” titles and no meaningful descriptions.
Full-fidelity CalTopo polygons: The CalTopo API client now transmits JSON payloads in the request body instead of the URL query string, matching CalTopo’s official reference implementations. This removes the practical URL-length cap that previously required aggressive polygon simplification (targeting ~200–500 vertices) and sometimes caused large travel-time contours to fail export entirely. Polygons are now sent at full pipeline fidelity; coordinate precision is capped at 5 decimal places (~1.1 m) for a roughly 40% payload reduction with no visible accuracy loss.
Switch Mode cleanup: The Switch Mode and Reset buttons now correctly clear CalTopo export panel state between analyses — hiding the export section, clearing the Map ID input, dismissing the success/error message, and dropping references to any previous analysis result. Previously, stale export state persisted across mode switches.
Travel Time interval adjustment: Removed the 24-hour interval option from Travel Time mode. At typical walking speeds, a 24-hour analysis radius exceeds 180 km, producing bounding boxes too large for public Overpass servers and computational loads disproportionate to operational SAR utility. Remaining intervals (1h, 2h, 4h, 8h, 12h) cover the practical range of on-foot SAR scenarios.
Travel Time mode: New third analysis mode alongside IPP Only and CalTopo Import. Generates time-based reachability contours showing where a subject could physically be after a specified number of hours at a given flat-ground travel speed. The coordinator supplies a speed (mph or km/h, with presets for impaired/slow/moderate/fit hiker) and selects time intervals (1h, 2h, 4h, 8h, 12h, 24h). No Lost Person Behavior profile is required — this mode models physical capability rather than statistical find-distance likelihood.
Shared pipeline: Travel Time mode reuses the same anisotropic cost-distance pipeline (Tobler slope function, NLCD friction, OSM trail/road/power line networks, NHD hydrology) as TARR modes. The cost-distance output is converted from terrain-equivalent meters to hours using the coordinator’s base speed, then contoured at the requested time intervals.
Auto-scaling radius: The analysis bounding box automatically scales to the estimated maximum reach (speed × max hours × 1.5 + 1 km buffer), ensuring isochrone contours are never clipped by the analysis extent.
Full export support: Travel time contours are exported as KML, GeoJSON, and directly to CalTopo maps using the same polygon export infrastructure as TARRs. Download labels and CalTopo export buttons dynamically update to reflect the active mode.
Mode-specific legend: The map legend dynamically switches between TARR percentile swatches and travel time contour swatches based on the active analysis mode. Legend auto-opens when travel time analysis completes.
UI updates: Wider splash modal for three mode options. Mode-specific sidebar sections (Travel Speed & Time replaces Subject Profile in travel time mode). Accordion workflow adapted for the new mode with correct section focus and status tracking.
Per-band calibration: Calibration multipliers are now applied independently to each percentile threshold (M25, M50, M75) rather than a single multiplier across all three. This corrects the nonlinear contraction where outer contours were systematically more compressed than inner ones. For example, Hiker calibration changes from a uniform ×1.15 to ×1.00 / ×1.10 / ×1.40 at the 25th, 50th, and 75th percentiles respectively. Global default changes from ×1.40 to ×1.05 / ×1.35 / ×1.80.
Validated against historical data: Per-band calibration tested across all 360 subjects from 253 Coconino County missions, achieving containment rates of 27.9% / 52.5% / 76.8% at the 25th / 50th / 75th percentile thresholds (nominal targets: 25% / 50% / 75%).
UI improvements: Subject Profile section now appears before Search Radius in the sidebar. Search Radius renamed to “Search Radius (Optional)” and starts collapsed. CalTopo band stays open until segments are loaded. IPP placement advances to Subject Profile instead of Search Radius.
GeoJSON contour export: TARR percentile contours can now be downloaded as GeoJSON, complementing the existing KML export. GeoJSON is the native format for TAK/CloudTAK and other modern GIS platforms. Available in both IPP Only and CalTopo Import modes after analysis completes.
Overpass API fallback: OSM trail, road, and power line downloads now try multiple Overpass API mirrors in sequence. If the primary endpoint (overpass-api.de) times out, the tool automatically falls through to alternative mirrors before failing, improving reliability during active incidents.
Calibration-aware radius: The automatic radius adjustment in IPP Only mode now accounts for the Coconino calibration multiplier when checking whether the search radius is large enough to contain the 75th percentile TARR. Previously, high-multiplier profiles could clip the p75 contour.
Corridor visibility fix: Travel corridor highlighting (friction=1.0 cells) now renders with increased alpha opacity, ensuring trails, roads, and power line corridors are clearly visible against all basemaps.
Accordion sidebar: Sidebar reorganized into collapsible sections with alternating background bands. Sections auto-collapse as the workflow progresses (e.g., segments collapse after loading, IPP collapses after placement). Each collapsed section shows a one-line summary of its state. POA results and segment lists now scroll internally, preventing any single section from consuming the entire panel height.
1080p viewport fix: Panel vertical space is now managed per-section rather than as a single scrolling div, resolving the issue where POA rankings would compress all other controls to ~2mm on 1080p displays.
CalTopo TARR export: TARR percentile contours can now be pushed directly to a CalTopo map as Shape objects via the CalTopo API. Styled polygons appear on the map with matching colors and descriptions. Available in both IPP Only and CalTopo Import modes after analysis completes.
CalTopo segment ranking update: In CalTopo Import mode, POA rankings can be written back to existing CalTopo Assignment descriptions, giving planners immediate visibility into segment priority without leaving CalTopo.
JavaScript separation: Frontend JavaScript extracted from index.html into a standalone app.js file for maintainability and more reliable deployments.
CalTopo API integration: Server-side HMAC-SHA256 signed requests to CalTopo API using CCSO-SAR service account credentials. Automatic polygon simplification for large contours to stay within URL length limits.
Percentile-band color ramp: The probability surface now uses percentile-band normalization instead of log-normal PDF normalization. Each TARR band (0–p25, p25–p50, p50–p75) receives an equal share of the color ramp, ensuring meaningful visual differentiation across the full search area. Priority decreases monotonically from the IPP outward with no cold spot at the origin. Red/orange = inside 25th percentile, yellow/green = 25th–50th, teal/blue = 50th–75th.
Travel corridor highlighting: Roads, trails, and power line rights-of-way are now visually highlighted on the probability surface as brighter corridors. Cells with friction 1.0 (cleared travel corridors from OSM) are blended toward white, making easy-travel routes immediately visible within each priority band, including corridors which may not be shown on the basemap.
Coconino calibration multipliers: Per-profile calibration multipliers derived from Phase 2 validation (360 subjects, 253 Coconino County missions). Koester (2008) percentile distances are scaled by a profile-specific multiplier before cost-distance analysis, compensating for systematic TARR contraction in rugged terrain. Seven profiles calibrated individually (n≥20); remaining profiles use a global default multiplier of 1.40. Active multiplier displayed in the subject profile panel.
CalTopo buffer removed: The manual buffer distance input for CalTopo import mode has been removed. The analysis extent is now computed automatically as the union of (a) segment bounding box + 1 km and (b) IPP + calibrated 75th percentile + 1 km, ensuring full TARR coverage regardless of segment placement.
Bounding box union logic: In CalTopo mode, the data download extent now covers both the full TARR reach from the IPP and all search segments, preventing cost-distance clipping at raster boundaries.
Power line corridors: High-voltage transmission lines and distribution lines from OpenStreetMap are now downloaded and burned into the cost surface as travel aids. Cleared rights-of-way beneath power lines are buffered at ~40m and assigned friction 1.00 (same as trails/roads), reflecting both the physical passability of maintained corridors and their psychological attractiveness as human-made linear features. Follows IGT4SAR (Ferguson 2012) precedent for modeling power line ROWs.
Pipeline refactor: Backend pipeline reorganized into modular subpackage (downloads, cost_surface, cost_distance, outputs, shared) for maintainability and educational commenting.
Friction recalibration: Land cover friction multipliers recalibrated to off-trail speed literature (Imhof 1950). Evergreen forest friction increased from 1.25 to 1.80, with proportional adjustments across all vegetation classes. Trail corridors now exert significantly stronger influence on cost-distance contours, particularly where trails traverse steep or densely forested terrain.
Contour fill removed: TARR percentile contours now render as outlines only (zero fill). The probability density surface provides sufficient visual information without contour fill overlap.
Probability density color ramp: The map overlay now displays log-normal probability density from the subject profile rather than raw cost-distance. Color is anchored to the statistical distribution (blue = low density, red = peak find probability), making the visualization independent of search radius. Beyond the 75th percentile, opacity fades to visually de-emphasize the containment zone.
Percentiles required: Subject profile percentiles are now required to run an analysis, ensuring all outputs are behaviorally informed. Select a profile from the 28 LPB categories or enter values manually.
Map legend: Collapsible legend control on the map explains the probability density color ramp and TARR contour lines.
POA normalization: Segment POA values now normalized across defined segments to sum to 100%, eliminating sensitivity to buffer/radius size. Rest of World (ROW) probability is excluded as an investigative judgment outside the scope of the travel cost model.
Scope disclaimers: Added tool scope and intended use language to splash modal, POA rankings panel, and metadata modal. The tool is positioned as one data source among many and does not replace human judgment in search planning.
KML export: Percentile contours (TARRs) downloadable as KML with styled polygons. Compatible with CalTopo, Google Earth, QGIS, Avenza, and other GIS/field applications.
Metadata: New "Intended use" section in metadata modal. Updated POA methodology description to reflect normalization. Added favicon.
Subject profiles: Added Lost Person Behavior database with 28 subject categories, cascading eco region and terrain selectors. Percentile fields auto-populate from Koester (2008) via Ferguson (2013) IGT4SAR.
NHD hydrology: Added National Hydrography Dataset integration. Waterbody polygons, river area features, and flowlines with Strahler stream order buffering.
NLCD data source fix: Switched from mrlc_display to mrlc_download endpoint for true NLCD classification codes.
Vector contours: TARRs now rendered as vector GeoJSON polygons. Crisp at any zoom, ready for CalTopo/TAK export.
Friction refinement: Multipliers recalibrated to hundredths precision.
UI improvements: Split IPP buttons, Switch Mode/Reset, improved readability, TARR explainer modal, metadata modal.
Geometry repair: Robust repair for CalTopo segment polygons.
Water buffering: NLCD water pixels dilated by 1 cell to close gaps in narrow water bodies.
Initial release. Anisotropic cost-distance with per-edge Tobler, 3D surface distance, cross-slope penalty. NLCD/IGT4SAR friction. OSM trail/road/waterway integration. CalTopo segment import with log-normal POA ranking. IPP-only and CalTopo workflows. Leaflet frontend with travel cost, percentile contour, and terrain difficulty layers. PNG and GeoTIFF downloads.
Coconino County Sheriff's Search & Rescue
The WiSAR Decision Support Tool is a web-based geospatial application that generates terrain-aware travel cost surfaces and Terrain-Aware Range Rings (TARRs) from an Initial Planning Point (IPP) using anisotropic cost-distance analysis. It supports three analysis modes: IPP-only TARR generation, CalTopo segment import with Probability of Area (POA) ranking, and Travel Time reachability modeling at a user-specified travel speed.
Developed as a proof-of-concept to bridge the gap between spatial probability modeling and operational SAR workflows. TARRs replace traditional Euclidean range rings with contours shaped by actual terrain conditions, improving search area prioritization during active incidents. Travel Time mode extends the same terrain model to show time-based reachability at a coordinator-specified travel speed, following the mobility model approach of Doherty et al. (2014).
Cost surface: Combines NLCD landcover friction (IGT4SAR framework, Doherty et al. 2013, Danser 2018) with OSM trail/road/power line burn-in and waterway impedance. Power line rights-of-way modeled as travel aids (friction 1.00) following Ferguson (2012).
Cost-distance: Anisotropic Dijkstra with per-edge Tobler's Hiking Function (1993). Computes directional slope, 3D surface distance, and cross-slope traversal penalty (up to 30%).
Calibration: Per-band multipliers (M25, M50, M75) derived from 360 subjects across 253 Coconino County missions. Multipliers scale each Koester (2008) Euclidean percentile distance independently to compensate for nonlinear TARR contraction caused by terrain friction accumulation over distance. Seven profiles calibrated individually (n≥20); uncalibrated profiles use global defaults of ×1.05 / ×1.35 / ×1.80. Validated containment: 27.9% / 52.5% / 76.8% (targets: 25% / 50% / 75%).
TARRs: Percentile find distances applied as contour thresholds on the cost-distance surface. Contours extracted as vector polygons for crisp rendering and CalTopo export.
POA ranking: Log-normal distribution fitted to user percentiles. Continuous probability density evaluated per cell, summed within each CalTopo segment. Values normalized across defined segments to sum to 100%.
CalTopo export: TARR contour polygons and POA segment rankings are pushed to CalTopo maps via authenticated API requests (HMAC-SHA256 signed, CCSO-SAR service account). Polygons simplified to ≤100 vertices for URL-parameter delivery.
GeoJSON export: TARR contour polygons downloadable as standard GeoJSON FeatureCollection with percentile, threshold, and color properties. Compatible with TAK/CloudTAK, QGIS, ArcGIS, and web mapping applications.
Travel Time mode: Converts the cost-distance surface from terrain-equivalent meters to hours of travel time using a user-specified flat-ground speed: hours = cost_distance_m / (speed_kmh × 1000). This reuses the identical anisotropic cost-distance pipeline — only the interpretation of the output changes. Contours are extracted at user-selected time intervals (e.g., 1h, 2h, 4h, 8h) and represent the maximum extent a subject could physically reach from the IPP. Conceptually equivalent to the mobility model of Doherty et al. (2014), with the addition of user-configurable base speed and on-demand analysis for any CONUS location.
| Elevation | USGS 3DEP 1/3 arc-second, resampled to 30m |
| Land cover | NLCD 2021 (MRLC/USGS), 30m native |
| Trails & roads | OpenStreetMap via Overpass API |
| Power line corridors | OpenStreetMap via Overpass API (power=line, power=minor_line) |
| Waterways | OpenStreetMap via Overpass API |
| Search segments | CalTopo API (user-provided Map ID) |
| NLCD class | Description | IGT4SAR | Friction |
|---|---|---|---|
| 11 | Open Water | 99 | 50.00 |
| 12 | Perennial Ice/Snow | 85 | 50.00 |
| 21 | Developed, Open Space | 5 | 1.00 |
| 22 | Developed, Low Intensity | 10 | 1.05 |
| 23 | Developed, Medium Intensity | 15 | 1.10 |
| 24 | Developed, High Intensity | 20 | 1.15 |
| 31 | Barren Land | 30 | 1.30 |
| 41 | Deciduous Forest | 45 | 1.60 |
| 42 | Evergreen Forest | 50 | 1.80 |
| 43 | Mixed Forest | 35 | 1.50 |
| 52 | Shrub/Scrub | 45 | 1.60 |
| 71 | Grassland/Herbaceous | 20 | 1.15 |
| 81 | Pasture/Hay | 25 | 1.15 |
| 82 | Cultivated Crops | 30 | 1.25 |
| 90 | Woody Wetlands | 80 | 3.00 |
| 95 | Emergent Herbaceous Wetlands | 80 | 3.00 |
Trails, roads, and power line corridors from OSM assigned friction 1.00 regardless of underlying NLCD class. Power line ROWs buffered ~40m to represent cleared corridor. Friction calibrated to Imhof (1950) off-trail velocity reduction (0.6x on-trail speed).
| Profile | n | M25 | M50 | M75 | p25 obs. | p50 obs. | p75 obs. |
|---|---|---|---|---|---|---|---|
| Hiker | 184 | 1.00× | 1.10× | 1.40× | 29.3% | 51.6% | 78.8% |
| Skier (Alpine) | 36 | 1.20× | 1.90× | 2.15× | 25.0% | 52.8% | 75.0% |
| Dementia | 29 | 2.50× | 2.55× | 2.50× | 24.1% | 44.8% | 72.4% |
| Mental Illness | 25 | 0.95× | 4.05× | 3.20× | 32.0% | 52.0% | 76.0% |
| Despondent | 21 | 0.55× | 1.00× | 1.65× | 23.8% | 52.4% | 81.0% |
| Hunter | 21 | 0.50× | 0.50× | 0.80× | 23.8% | 47.6% | 76.2% |
| Child (10-12) | 20 | 0.65× | 1.55× | 1.50× | 25.0% | 50.0% | 75.0% |
| All other profiles | — | 1.05× | 1.35× | 1.80× | Global default (minimizes total error across all 360 subjects) | ||
Observed containment rates validated through full pipeline (362 subjects, 253 Coconino County missions). Nominal targets: 25%/50%/75%. Profiles with n<20 use global defaults. Multipliers applied independently to each Koester (2008) percentile distance before cost-distance thresholding. Aggregate calibrated containment: 26.2% / 50.0% / 77.1%.
| Terrain Attractor Priority | Per-pixel priority surface colored by the strongest applicable Jacobs (2015) terrain-attractor signal. Hot (red) = stream-trail intersection. Warm (orange-yellow) = trail / road / power-line ROW proximity. Cool-warm (yellow-green) = low-elevation pocket or stream proximity. Cool (blue) = no attractor signal. Renders at full opacity across the entire cost-distance raster — no fade past p75 — honoring Jacobs's finding that linear-feature PDEN increases with distance from the IPP. Default: on. |
| Percentile Contours (TARRs) | Vector contour polygons at 25th, 50th, 75th percentile thresholds. Default: on (when percentiles provided). |
| Travel Time Contours | Vector contour polygons at user-selected time intervals (Travel Time mode only). Color-coded outline-only rendering with labels at each contour boundary. Default: on. |
| Terrain Difficulty | Local slope + landcover difficulty per cell, independent of distance from IPP. Default: off. |
| Resolution | 30m (matched to NLCD) |
| CRS | EPSG:4326 (WGS 84) |
| Algorithm | Dijkstra's shortest path, 8-connected, anisotropic |
| Slope function | Tobler's Hiking Function (1993), directional per-edge |
| Distance | 3D surface distance with cross-slope penalty |
| POA distribution | Log-normal fit from user percentiles |
| Server | Ubuntu 24.04, Python 3.12, Flask, Gunicorn, Nginx |
Friction normalization differs from raw IGT4SAR implementation. Cross-slope traversal is approximated rather than using aspect-relative horizontal factors. Stream impedance uses a simplified binary approach rather than Strahler stream order. Trail data from OpenStreetMap may have incomplete coverage compared to authoritative datasets. NLCD acquired via WMS may have resampling artifacts. Resolution capped at 30m.
This tool models the spatial probability of a lost subject's location based on the physics of human movement over a landscape. It integrates elevation, slope, land cover friction, trail networks, and hydrological features to generate an anisotropic cost-distance surface from the Initial Planning Point (IPP), then fits a statistical distribution to known travel behavior data to estimate relative probability across the search area.
These outputs are intended to supplement, not replace, the expertise of search planners and incident commanders. The model does not account for investigative factors such as subject intent, clue interpretation, witness information, or scenarios where the subject may have left the search area by non-pedestrian means. Probability of Area (POA) values are normalized across the defined search segments and do not include a Rest of World (ROW) estimate, which remains a planning judgment outside the scope of this tool.
Search planning decisions should integrate these spatial estimates as one component of a comprehensive planning process.
Danser, R.A. (2018). Applying Least Cost Path Analysis to SAR Data. USC Thesis.
Doherty, P.J., Guo, Q., Doke, J., & Ferguson, D. (2014). Applied Geography, 47, 99-110.
Ferguson, D. (2013). IGT4SAR. GitHub.
Koester, R.J. (2008). Lost Person Behavior. dbS Productions.
Sava, E. et al. (2016). Transactions in GIS, 20(1), 38-53.
Sherrill, K.R., Frakes, B., & Schupbach, S. (2010). Travel Time Cost Surface Model: Standard Operating Procedure. NPS NRR-2010/238.
Tobler, W. (1993). Technical Report 93-1, NCGIA.
Jamie Weleber, Coconino County Sheriff's Search & Rescue
https://sar.weleber.net
Metadata Date: May 04, 2026 | Version 1.14
TARR containment analysis — Coconino County historical data
362 subjects across 253 missions from the Coconino County Sheriff’s Office, spanning 12 Koester (2008) lost person behavior profiles. Multi-subject missions where individuals were found at different locations are treated as independent observations. Two subjects with invalid cost-distance probe results were excluded, leaving 360 validated subjects for containment analysis.
Koester’s find-distance percentiles were derived from straight-line (Euclidean) measurements between IPP and find locations. When these distances are used as thresholds on a terrain-aware cost-distance surface, the resulting contours systematically underestimate geographic coverage because terrain friction inflates effective travel distance. The contraction worsens at higher percentiles as friction accumulates over longer paths.
Percentage of find locations falling within each TARR percentile contour, compared to nominal expected rates.
| Percentile | Nominal | Uncalibrated | Global per-band | Per-profile per-band |
|---|---|---|---|---|
| 25th | 25.0% | 23.9% | 27.9% | 26.2% |
| 50th | 50.0% | 41.1% | 52.5% | 50.0% |
| 75th | 75.0% | 58.9% | 76.8% | 77.1% |
Uncalibrated: raw Koester distances applied as cost-distance thresholds. Global per-band: M25=1.05, M50=1.35, M75=1.80 applied uniformly to all profiles. Per-profile per-band: profile-specific M25/M50/M75 where n≥20, global defaults otherwise. The per-profile per-band approach is what the tool uses.
Containment rates observed after running each subject through the full analysis pipeline with per-profile per-band calibration applied.
| Profile | n | Cal. type | M25 | M50 | M75 | p25 | p50 | p75 |
|---|---|---|---|---|---|---|---|---|
| Hiker | 184 | Profile | 1.00 | 1.10 | 1.40 | 29.3% | 51.6% | 78.8% |
| Skier (Alpine) | 36 | Profile | 1.20 | 1.90 | 2.15 | 25.0% | 52.8% | 75.0% |
| Dementia | 29 | Profile | 2.50 | 2.55 | 2.50 | 24.1% | 44.8% | 72.4% |
| Mental Illness | 25 | Profile | 0.95 | 4.05 | 3.20 | 32.0% | 52.0% | 76.0% |
| Despondent | 21 | Profile | 0.55 | 1.00 | 1.65 | 23.8% | 52.4% | 81.0% |
| Hunter | 21 | Profile | 0.50 | 0.50 | 0.80 | 23.8% | 47.6% | 76.2% |
| Child (10-12) | 20 | Profile | 0.65 | 1.55 | 1.50 | 25.0% | 50.0% | 75.0% |
| Camper | 14 | Default | 1.05 | 1.35 | 1.80 | 7.1% | 21.4% | 50.0% |
| Runner | 5 | Default | 1.05 | 1.35 | 1.80 | 20.0% | 40.0% | 100.0% |
| Child (1-3) | 3 | Default | 1.05 | 1.35 | 1.80 | 0.0% | 66.7% | 100.0% |
| Child (4-6) | 2 | Default | 1.05 | 1.35 | 1.80 | 0.0% | 50.0% | 100.0% |
| Child (13-15) | 2 | Default | 1.05 | 1.35 | 1.80 | 0.0% | 100.0% | 100.0% |
Profiles with n<20 use global default multipliers. Small-sample profiles (Runner, Child 1-3, Child 4-6, Child 13-15) show volatile rates due to sample size. Camper (n=14) consistently under-contains despite calibration, suggesting the Koester distance profile may not match Coconino County terrain patterns for this category.
For each profile with n≥20 subjects, optimal multipliers were derived independently for each percentile band by finding the scaling factor that brings the observed TARR containment rate closest to the nominal target (25%, 50%, or 75%). This per-band approach corrects the nonlinear contraction where outer contours are more compressed than inner ones.
Multipliers are applied on the frontend before percentile distances are sent to the analysis pipeline. The cost surface and cost-distance computation are unaffected — calibration adjusts only the statistical thresholds, not the terrain model.
All containment rates shown above are validated through the full analysis pipeline (IPP → cost surface → cost-distance → TARR contour generation → point-in-polygon containment test), not spreadsheet approximations.
In-sample calibration: Multipliers were derived from the same dataset used for validation. Containment rates reflect calibration fit, not out-of-sample predictive accuracy. Cross-validation or data from other jurisdictions would provide a stronger test.
Region-specific: Calibration is derived from Coconino County terrain (high desert to alpine, 600–3,850m elevation). Other jurisdictions with different terrain profiles may require their own calibration.
Small-sample profiles: Five profiles have fewer than 20 subjects and use global default multipliers. Rates for these profiles should be interpreted with caution.
Data source: Coconino County Sheriff’s Office historical SAR records | Validation date: April 14, 2026 | Version 1.13
How the WiSAR tool transforms traditional range rings using terrain data
In traditional SAR, a range ring draws a perfect circle around the IPP at the statistical find distance. If the 25th percentile is 2.5 km, every point on that circle is exactly 2.5 km from the IPP in a straight line.
This assumes the lost person can travel equally easily in every direction, which is rarely true in the real world.
Imagine a string connecting the IPP to a point on the 25th percentile ring. On flat, open ground, the string runs perfectly straight and the ring sits 2.5 km away.
Now imagine the string has to go over a hill. The string bends to follow the terrain. It's still 2.5 km of string, but the point where it ends is now closer to the IPP because the hill "used up" some of the string.
Dense forest, steep slopes, and rough terrain all create "bends" in the string, pulling the ring closer. Trails and flat valleys let the string run straighter, so the ring contracts less in those directions.
This tool does that string calculation for every direction simultaneously. Using elevation data, land cover, and trail networks, it computes the actual travel cost from the IPP to every point in the search area.
The percentile rings then follow the contours of equal travel cost instead of equal straight-line distance. They stretch along trails and valleys where a person can travel easily, and compress against steep terrain, dense forest, and water barriers.
The result is a more realistic picture of where a lost person could actually reach, accounting for the terrain they'd have to navigate.
| Slope cost | Tobler's Hiking Function — walking uphill is slower, slight downhill is fastest |
| Direction | Anisotropic — cost differs going uphill vs downhill on the same slope |
| Land cover | NLCD friction values — forest is harder than grassland, water is a barrier |
| Trails & roads | OpenStreetMap data — trails reduce travel cost significantly |
| Surface distance | 3D ground distance, not just horizontal — steep terrain means more actual walking |
How the WiSAR tool models reachability over time, beyond simple speed times distance
"If someone walks at 2 mph for 4 hours, they could be up to 8 miles away." That's the intuitive Travel Time estimate, and it traces a perfect circle of 8 miles around the IPP.
It assumes constant flat-ground speed in every direction. On a hike across open prairie, that's roughly right. On real terrain, it's almost never right.
Each 30-meter step a person takes consumes some amount of time. On flat trail, it's a few seconds. Up a steep slope, the same 30 meters might take a minute. Through dense brush, even longer. Across a river, much longer or impossible.
The tool walks outward from the IPP step by step, accumulating time per cell based on local terrain. Some directions burn time fast (climbing a cliff). Other directions barely cost any time (cruising down a trail).
Each isochrone contour traces the boundary of "where could the subject physically be after N hours." On real terrain those boundaries bulge outward along trails and valleys (more reachable in the same time) and pull inward against cliffs, dense forest, and water (less reachable).
Travel Time uses the same anisotropic cost-distance engine as TARRs. The difference is what it measures: TARRs use statistical Lost Person Behavior find distances calibrated against historical missions; Travel Time uses pure physical reachability at a coordinator-supplied flat-ground speed. No subject profile required.
Each isochrone indents over the hill, but each one stays clearly outside the next-inner one. The contours bunch close together over the hill (slow terrain = tighter spacing) and spread apart along the trail (fast terrain = wider spacing).
| Base speed | Coordinator-supplied flat-ground walking speed (mph or km/h). Reflects subject fitness and likely pace. |
| Slope | Tobler's hiking function — uphill and steep downhill both slow you down |
| Land cover | NLCD friction — forest, brush, and wetland are slower than open ground |
| Trails & roads | OpenStreetMap data — trails dramatically speed up reachability |
| Water barriers | NHD hydrology — rivers and lakes act as high-impedance barriers, not impossible but slow |