Global Mapper 25.1 Viewshed - ArcGIS Pro toolbox

Install
1. Extract the complete archive to a folder ArcGIS Pro can read. Keep
   toolboxes, backend, docs, requirements-arcgis.txt, and sample_data together.
2. In ArcGIS Pro, open Project > Package Manager > Environment Manager.
   Clone the installed version's arcgispro-py3 environment as
   modernviewshed-py3. Preserve the default environment.
3. Open ArcGIS Pro's Python Command Prompt. Install the versions declared in
   requirements-arcgis.txt into the clone, retaining its ArcGIS package pins:

   conda install --name modernviewshed-py3 -c esri "rasterio>=1.3" "numpy>=1.26" "numba>=0.60,<0.66" "pyproj>=3.6"

4. Return to Project > Package Manager. Select modernviewshed-py3 under
   Activate Environment, then restart ArcGIS Pro.
5. Add toolboxes/GlobalMapper251Viewshed.pyt to the ArcGIS Pro Catalog.
   Open Global Mapper Viewshed and run the supplied sample before project data.

Sample run
Add sample_data/dtm.tif and sample_data/dsm.tif. Add
sample_data/transmitter.shp as a point layer and select its one point. The
sample rasters use EPSG:32618, metre horizontal and elevation units, and 1 m
cells. Set DTM Elevation Units and DSM Elevation Units to Meters (m). Choose
Above Ground for Transmitter Elevation Relative To, 10 Meters for Transmitter
Elevation, 1 Meters for Receiver Elevation (height above ground), and 8 Meters
for View Radius. Leave Environments > Cell Size unset to use DTM sample
spacing. Choose an output format, then set a writable Output Folder and
Viewshed Name.

Global Mapper terminology
Base Elevation Layer (DTM) supplies ground elevations for the transmitter
and receivers. Obstruction Surface (DSM) supplies terrain, buildings, and
vegetation that block the view. In visual-impact work, Transmitter Location
(project point) is the tower or other project point, and Receiver Elevation
(height above ground) is the viewer's eye height. Sample Spacing is set in
Environments > Cell Size. Elevation Layer Sampling (interpolation) is a
separate choice of nearest neighbor or bilinear sampling.

Keep GlobalMapper251Viewshed.DTMDSMViewshed.pyt.xml beside the .pyt file
for field help. See docs/global-mapper-25-1-gui.md for the control comparison
and the supported options.

Runtime and dependencies
The form uses ArcPy and the Python standard library. It launches the included
backend through ArcGIS Pro's installed propy.bat, which selects the active
environment. Each run reports the backend Python executable. The form uses
AUTO execution to select serial Numba for small jobs and parallel Numba for
sufficiently large jobs. The run JSON records the selected mode, configured
threads, and estimated ray work. Automatic raster elevation units control
unit detection separately. First use may include compilation.

For large constant-elevation obstruction surfaces, an exact clear-ray shortcut
can avoid unnecessary sampling. Mixed surfaces and uncertain rays use the
ordinary calculation. This does not establish a general speed advantage over
Global Mapper or resolve the known four-cell radius exception.

The retained package sample passed on ArcGIS Pro 3.7.2 with Python 3.13.13 and
Numba 0.65.1 in a clone named gmviewshed-py3. An environment name is only a
local label; the installation steps above create modernviewshed-py3.
Small-grid controls establish compiled
execution and sample correctness; they do not establish large-DEM or
end-to-end performance. The included workflow guides cover licensing, units,
and run paths. The public download contains the operational toolbox and synthetic examples.
The current packaged sample also passed on ArcGIS Pro 3.7.3 with zero status
differences from the packaged API.
It does not contain the landscape study inputs. No project software license
has been declared; the website illustration has separate license terms.

Supported comparison profile
Captured classifications match Global Mapper Pro 25.1.1 build b030624 for the
recorded inputs and settings. Agreement means equal visible/hidden cells on
the same eligible grid, including a separate check for native visible cells
outside that domain. It does not mean identical files, complete feature parity,
or verified agreement for other builds. See the included GUI guide for the
tested profile, evidence links, runtime limits, and troubleshooting.
A larger 1,024 m flat-surface control has four differing radius-edge cells.
General native parity and a speed advantage over Global Mapper remain
unestablished. The GUI guide links the retained counterexample.

Package contents
PACKAGE-MANIFEST.json records each payload path, role, origin, byte count, and
SHA-256. The manifest excludes its own hash. The sample files are synthetic
qualification inputs.

Current instructions and research
https://testing-lidar-viewsheds.netlify.app/toolbox/
https://testing-lidar-viewsheds.netlify.app/article/
