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
Arizona subject profiles: Subject profiles now come from the Arizona Department of Emergency and Military Affairs (DEMA) find-distance table: 39 categories and 2,524 cases, grouped as Aircraft, ELT, PLB, Search, Vehicle and Water. The previous profile table is removed. Each category has one statewide set of distances, so the eco-region and terrain selectors are gone.
Small-sample warning: The profile list shows the number of cases behind each profile. Profiles built from fewer than 20 cases are marked and show a warning when selected. Single-case profiles draw all three rings at one distance. A category with no cases is listed but cannot be selected.
Coconino-Calibrated: The earlier calibration multipliers were fitted to the previous profile distances and do not apply to these, so new per-band multipliers were fitted against 362 Coconino County subjects, the only cases with coordinates available so far. Seven profiles have their own multipliers and the rest share a default of ×1.20 / ×1.40 / ×1.35. Coconino finds inside the 25% / 50% / 75% rings: 25.1% / 49.7% / 76.5%, up from 22.4% / 39.5% / 66.3% unscaled. The profile panel shows the multipliers in use, and the Validation panel has the full tables and the limits of a one-county fit.
CalTopo push removed: The “Push to CalTopo” section is gone from Analysis Results, and the tool no longer holds or asks for CalTopo credentials. Every download is unchanged: contours as KML and GeoJSON, the image overlays, and the GeoTIFFs. A KML or GeoJSON file can still be imported into CalTopo by hand. A TAK integration is planned.
Arizona home view: The map opens centred on the geographic centre of Arizona with the whole state in view, and returns there on Reset, instead of the previous view of the whole country.
Saved analyses: Every analysis is now stored on the server under its own unique id, with its settings (IPP, profile, Koester distances and calibration multipliers, or speed and intervals), the versions of the elevation, land cover, hydrography and OpenStreetMap data it used, step timings, and the contour polygons. The Analysis Results panel shows a link that reopens the analysis on any device, with the IPP, profile and contours restored; a refresh no longer loses the result. A new Saved Analyses section lists the analyses run or opened in this browser. An optional Incident Label can be entered with the IPP; it is stored with the analysis and used in download file names.
Results could previously be lost or mixed up: Until this release results lived in temporary storage that a server reboot cleared, keyed only by the rounded IPP coordinates, so two analyses from the same point replaced each other. Worse, the rasters of consecutive analyses handled by the same server process shared file names, so an earlier analysis's download links could return a later analysis's raster under the earlier name, and the Percentile Contours image could draw one analysis's thresholds over another's cost-distance grid. Each analysis now has its own directory and nothing is overwritten. Downloaded GeoTIFFs, KML and GeoJSON files carry the incident label or analysis id in their names. CalTopo exports are unchanged.
Retention: Contours and settings are kept indefinitely and backed up nightly. Rasters (elevation, land cover, cost surface, cost-distance, probability, attractor masks) are removed 180 days after the analysis; a reopened analysis older than that shows its contours and settings and says that the rasters are gone.
Land cover and hydrography from local snapshots: The MRLC land cover WMS and the USGS hydro MapServer had become the pipeline's bottleneck — up to 120 s and 180 s of timeouts per analysis since August — and a timed-out layer was silently dropped from the friction surface. Both are now read from snapshots on the server: Annual NLCD 2024 for CONUS (refreshed yearly) and USGS NHDPlus High Resolution for every basin in the country (refreshed quarterly). USGS 3DEP elevation is the only live request left. Typical analysis time drops from minutes to well under a minute.
Higher-resolution streams: Flowlines were previously drawn from the 1:100k NHDPlus V2 network; the snapshot is 1:24k NHDPlus HR throughout, so headwater washes now appear and named creeks carry a higher Strahler order than before (Sycamore Creek 6, Oak Creek 5, West Fork Oak Creek 4). Stream-order buffers and impedances are unchanged. The Jacobs stream-mask cutoff moves from Strahler ≥3 to ≥4 to compensate: measured on the Oak Creek bbox that reproduces the field-reviewed v1.15 stream and intersection masks within 3–10%, whereas keeping 3 grew them 77% and 51% from unnamed side drainages.
Validation re-measured: After the calibration correction, all 362 Phase 2 subjects were re-run through the current pipeline against the new snapshot data sources. Per-profile per-band containment is 27.9% / 50.8% / 78.7% at the 25th / 50th / 75th percentile (April 2026: 26.2% / 50.0% / 77.1%), so the multipliers are unchanged. The Validation and Metadata panels now show the re-measured figures.
Calibration correction: Since v1.11 the server had been applying a second, older single multiplier on top of the per-band Coconino calibration whenever a subject profile was selected, so TARRs were drawn larger than the calibration shown in the profile panel — for Hiker, ×1.15 / ×1.27 / ×1.61 instead of the displayed ×1.00 / ×1.10 / ×1.40 (Hunter, whose older multiplier was below 1, was drawn smaller). The extra multiplier is removed. TARRs now match the displayed multipliers, which are the ones the Phase 2 validation measured. Analyses run before this date with a profile selected used the larger thresholds; the threshold recorded in each exported TARR description is the one that was actually applied.
Backup elevation source: If the USGS 3DEP elevation service does not respond within 60 s, elevation is now read from the staged USGS 1 arc-second tiles instead of failing the analysis. A run that used the backup says so in the Analysis Results panel; its boundaries may differ slightly (a few percent in area) from a normal run.
Data-source warnings: A missing or unreadable land cover or hydrography snapshot, or an area outside coverage, now appears in the Analysis Results warnings panel instead of being logged silently.
Live Overpass retired: Trails, roads, waterways, and power lines now come exclusively from the weekly OpenStreetMap snapshot (Geofabrik extracts for all 50 states and DC, rebuilt every Sunday). The public Overpass mirrors had become the single largest time cost in an analysis — three 20-second timeouts before the cache was even consulted — and data up to a week old is operationally equivalent for trail and road networks. The “live servers unavailable” notice no longer appears; a warning is shown instead if the snapshot is more than 14 days old, which means the weekly rebuild has stopped running.
Terrain Attractor Priority off by default: The Jacobs (2015) heatmap is no longer drawn automatically in either mode. TARR contours and travel-time isochrones render directly over the basemap; enable the heatmap from the Map Layers toggles when wanted. Raster overlays now sit in their own map pane beneath the contour lines, so toggling a raster on never dims the contours or their labels.
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 two analysis modes: TARR generation from an IPP 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%).
Subject profiles: 25th, 50th and 75th percentile find distances for 39 subject categories (2,524 cases) from the Arizona Department of Emergency and Military Affairs (DEMA). Each category has one statewide set of distances. Categories built from fewer than 20 cases are marked in the profile list and carry a warning when selected; one category has no cases and cannot be selected.
Calibration (Coconino-Calibrated): Per-band multipliers (M25, M50, M75) scale each percentile distance independently to compensate for the contraction of TARRs caused by terrain friction accumulating over distance. They were fitted on October 5, 2026 against 362 subjects across 253 Coconino County missions, the only cases with IPP and find coordinates available so far. Seven profiles with at least 20 Coconino subjects have their own multipliers; all others use a default of ×1.20 / ×1.40 / ×1.35; single-case profiles are left at ×1.00. Measured containment of the Coconino finds: 25.1% / 49.7% / 76.5% (targets: 25% / 50% / 75%; uncalibrated 22.4% / 39.5% / 66.3%). This is a one-county calibration of statewide distances, not a statewide validation; see Validation.
TARRs: Percentile find distances applied as contour thresholds on the cost-distance surface. Contours extracted as vector polygons for crisp rendering and export.
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 | Annual NLCD 2024 (MRLC/USGS), 30m native, local CONUS snapshot |
| Hydrology | USGS NHDPlus High Resolution (1:24k), local snapshot: waterbodies, area hydro polygons, flowlines with Strahler order |
| Trails & roads | OpenStreetMap, weekly Geofabrik snapshot (all 50 states + DC) |
| Power line corridors | OpenStreetMap, weekly Geofabrik snapshot (power=line, power=minor_line) |
| Waterways | OpenStreetMap, weekly Geofabrik snapshot |
| Subject profiles | Arizona Department of Emergency and Military Affairs (DEMA), find-distance percentiles by subject category |
| 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).
| 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: off (v1.16); enable from the Map Layers toggles. |
| 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 |
| Saved analyses | Each analysis is stored on the server under a unique id with its settings, the data-source versions it used, and its contour polygons, and reopens from the link shown in Analysis Results. Rasters are kept 180 days; contours and settings indefinitely, with a nightly off-site backup. |
| 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.
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://dst.coconinosar.org
Metadata Date: September 30, 2026 | Version 1.18
Coconino-Calibrated — Arizona subject profiles tested against Coconino County cases
The subject-profile distances are statewide figures from the Arizona Department of Emergency and Military Affairs (DEMA). The multipliers applied to them were fitted against 362 subjects across 253 missions from the Coconino County Sheriff’s Office, the only cases for which IPP and find coordinates are available so far.
This is a one-county calibration of a statewide table. It is the best fit available now, not a statewide validation. It will be re-run when coordinates for the statewide cases are available.
The source distances are taken to be straight-line measurements from the IPP to the find location. This tool applies them as thresholds on a terrain cost-distance surface, where steep or rough ground counts as extra distance. A ring drawn that way covers less ground than a straight-line circle of the same radius, and the shortfall grows with distance as friction accumulates. Unscaled, the rings held fewer Coconino finds than their labels say, although plain circles of the same radii held more.
Percentage of the 362 Coconino find locations falling within each ring, compared to the nominal rate.
| Percentile | Nominal | Straight-line circles | Uncalibrated TARRs | Coconino-Calibrated TARRs |
|---|---|---|---|---|
| 25th | 25.0% | 34.3% | 22.4% | 25.1% |
| 50th | 50.0% | 60.5% | 39.5% | 49.7% |
| 75th | 75.0% | 82.6% | 66.3% | 76.5% |
Straight-line circles: plain circles at the DEMA distances, no terrain. Uncalibrated TARRs: the DEMA distances applied as cost-distance thresholds at ×1.00. Coconino-Calibrated TARRs: what the tool draws, with the multipliers below. All three were measured on October 5, 2026 against the same NLCD, NHDPlus HR and OSM snapshots the tool uses, with elevation from USGS 3DEP.
n is the number of Coconino subjects assigned to the profile, not the number of cases behind the DEMA distances. Containment is measured with the multipliers shown.
| Profile | n | Cal. type | M25 | M50 | M75 | p25 | p50 | p75 |
|---|---|---|---|---|---|---|---|---|
| Hiker | 184 | Profile | 1.10 | 1.20 | 1.35 | 25.5% | 49.5% | 75.0% |
| Snow ski / board | 36 | Profile | 1.45 | 2.05 | 2.75 | 25.0% | 50.0% | 75.0% |
| Alzheimer | 29 | Profile | 1.90 | 1.80 | 2.50 | 24.1% | 48.3% | 75.9% |
| Mental | 25 | Profile | 1.15 | 1.60 | 1.35 | 24.0% | 52.0% | 76.0% |
| Despondent | 21 | Profile | 1.15 | 1.20 | 0.65 | 23.8% | 47.6% | 76.2% |
| Hunter | 21 | Profile | 0.80 | 0.95 | 0.80 | 23.8% | 52.4% | 76.2% |
| Child (7-12) | 20 | Profile | 1.90 | 1.65 | 1.10 | 25.0% | 50.0% | 75.0% |
| Camper | 14 | Default | 1.20 | 1.40 | 1.35 | 28.6% | 50.0% | 85.7% |
| Runner | 5 | Default | 1.20 | 1.40 | 1.35 | 20.0% | 40.0% | 100.0% |
| Child (1-3) | 3 | Default | 1.20 | 1.40 | 1.35 | 33.3% | 66.7% | 100.0% |
| Child (4-6) | 2 | Default | 1.20 | 1.40 | 1.35 | 50.0% | 50.0% | 100.0% |
| Youth (13-15) | 2 | Default | 1.20 | 1.40 | 1.35 | 0.0% | 50.0% | 100.0% |
| All other profiles | 0 | Default | 1.20 | 1.40 | 1.35 | No Coconino subjects to test against | ||
Profiles with at least 20 Coconino subjects have their own multipliers. Every other profile uses the default, which is fitted over all 362 subjects. That includes the 27 categories with no Coconino subjects at all, among them every Aircraft, ELT, PLB, Vehicle and Water profile, where the default is carried over from foot-travel searches. Single-case profiles are left at ×1.00.
Each Coconino subject was assigned the closest Arizona category. Every subject was then run through the full analysis pipeline (IPP → cost surface → cost-distance → TARR contours) and the find location tested against the contour polygons, sizing each analysis exactly as the tool does (calibrated p75 + 2 km).
For each profile and each percentile band, the multiplier is the one, in steps of 0.05, that brings the share of finds inside the ring closest to its nominal rate. Where several multipliers fit equally well, the middle of that range is used. Because the multipliers change the size of the analysis, the fit was repeated, each pass sized with the previous pass’s multipliers, until a pass returned the same multipliers it started with. The containment figures above are from that final pass.
Multipliers are applied in the browser before the distances are sent to the analysis pipeline. The cost surface and cost-distance computation are unaffected — calibration adjusts only the thresholds, not the terrain model.
One county: The multipliers reflect Coconino County terrain (high desert to alpine, 600–3,850m elevation) and Coconino cases. Elsewhere in Arizona they may be too large or too small.
In-sample: The multipliers were fitted on the same subjects the containment rates are measured on, so the rates show how well the fit matches, not how well it predicts. Some of these cases may also be among those behind the DEMA distances.
Few subjects per profile: Six of the seven profile-specific fits rest on 20 to 36 subjects. At that size a wide range of multipliers fits equally well (for Child (7-12) at the 25th percentile, anything from ×0.70 to ×3.10), so individual values are loosely pinned and can look uneven across bands.
Category assignment: The Coconino cases were not recorded under the Arizona categories; each was matched to the closest one by judgement.
Small-sample profiles: 23 of the 39 DEMA categories have fewer than 20 cases behind their distances, and five have exactly one. These are marked in the profile list and carry a warning when selected, whatever multiplier applies.
Profile data: Arizona Department of Emergency and Military Affairs (DEMA) | Case data: Coconino County Sheriff’s Office historical SAR records | Calibrated October 5, 2026
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 find distances from historical Arizona 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 |