Bottleneck Analysis

Corridor Designer Tools · Evaluate Corridors · interactive window + geoprocessing tool · by Jeff Jenness
Works at every ArcGIS Pro license level

Summary

Finds the route through a corridor polygon between two wildland blocks that maximizes the minimum corridor width encountered — the route with the widest bottleneck, chosen over every strand and branch of the corridor at once — and measures the corridor width at regular stations along it. A narrow spot is a bottleneck, and for species sensitive to edges or development a severe bottleneck can make a corridor useless; this analysis shows exactly where the corridor narrows, by how much, and for how long. Compare the narrowest point against what your species tolerates — and where a pinch is not constrained by hard edges, that is where widening the corridor buys the most. A modernized port of the CorridorDesigner Evaluation Tools' Bottleneck Analysis; no Spatial Analyst needed.

Learn more About Corridor Design covers corridor width and why the narrowest point governs. Metric 2 of the Corridor Evaluation Tutorial runs this tool on the black bear corridor and its alternative, with the tutorial data (41 MB) available to download so you can follow along.

Provably the widest available route

The corridor's medial axis — its skeleton, where every point is the center of a circle touching the boundary on two or more sides — is computed exactly in vector from a Voronoi construction, with the local corridor half-width known at every point. The route through that skeleton maximizing the minimum width is found over all strands and branches simultaneously, so the answer is exact — no raster approximation, widths and lengths in meters. An optional width threshold classifies the route into above- and below-threshold stretches.

Window and geoprocessing tool

The interactive window is where the exploration happens: run the analysis, then drag the width threshold and watch the statistics, the width-profile graph, and the highlighted sub-threshold stretches update live; place the graph on a layout when it tells the story. The geoprocessing tool runs the same underlying analysis as a scripting and batch surface — ModelBuilder chains, many corridors in a loop — and produces the same three outputs: the route polyline, optional station points with widths, and optional above/below-threshold segments, each carrying the analysis record. What the geoprocessing, ModelBuilder and Python scripting options do not include is the window's interactivity: no live graph to drag a threshold on, and no way to place a graphic or a statistics text element on a layout — those belong to the window alone. Run it once per threshold you care about, and use the window when you want to explore.

A tour of the window

The example below continues the black bear corridor from the Corridor Design Tutorial and the Corridor Evaluation Tutorial.

The Corridor Designer Tools gallery open on the ribbon, with the Bottleneck Analysis button, in the Evaluate Corridors row, outlined in blue
Where to find it: Bottleneck Analysis is in the Evaluate Corridors row of the Corridor Designer Tools gallery, in the Corridor Designer Tools group of the Wildlife and Forestry tab.

Corridor and blocks

The corridor polygon must be a single polygon: the tool finds one best route, and a corridor made of several disconnected strands (common straight out of Least-Cost Corridor, whose slices can sprout branches) has no single answer. Here that means picking one strand out of the black bear 2% corridor — the wider one running south through Tumacacori — rather than handing the tool every strand at once.

The black bear 2 percent corridor between the Tumacacori and Santa Rita wildland blocks drawn as two separate strands: a narrow gray northern strand running northeast past Tubac, and a broad orange southern strand running east through the Grosvenor Hills, with the wildland blocks outlined in blue
The 2% black bear corridor is two disconnected strands: a narrow northern one in gray and the broad southern one in orange. The southern strand is the one handed to the tool.

The status text beside each Browse button confirms what the tool sees: Single polygon in blue when a field is ready to run, or a count in red when it is not.

The two wildland blocks are usually two features in the same feature class, which is exactly the case here: both Wildland Block A and Wildland Block B point at the same Wildland Blocks layer. The tool notices there is more than one feature and asks you to narrow each field down to one, with a live count: 2 Polygons in Wildland Blocks: Select 1. The SQL... button beside each field opens the same query builder used throughout the add-in, so you can pick the block by an attribute rather than by selecting it on the map first.

The Bottleneck Analysis window before running: Corridor polygon set to Black Bear 2 percent Corridor with a blue Single polygon status, Wildland Block A set to Wildland Blocks with a red 2 Polygons in Wildland Blocks: Select 1 status, and Wildland Block B empty
Corridor polygon is ready (a single polygon); Wildland Block A points at a two-feature layer and needs its own SQL expression before the tool can run.
The Selection Expression query builder for Wildland Blocks: a single clause reading Where OWNERSHIP is equal to Tumacacori
The SQL query builder, narrowing Wildland Block A to the Tumacacori feature. Block B gets the same treatment with OWNERSHIP = 'Santa Rita'.

With both blocks resolved to one feature each and a width threshold typed in, click Run Analysis.

Reading the result

The graph plots corridor width against distance along the route; the statistics panel on the right reports the route length, the narrowest point and where it falls, and the mean, median and standard deviation of width along the whole route. With a threshold set, both the graph and the statistics split at that value: the graph colors the profile blue above the threshold and red below it, and the map does the same to the route line, so a glance at either one shows where the corridor is comfortable and where it pinches.

The Bottleneck Analysis window with a 2000 meter threshold: a width profile graph colored blue above and red below the threshold, and statistics reading route length 22,336.4 m, narrowest point 859.8 m at 18,200 m, maximum width 3,288.6 m, mean 1,758.3 m, median 1,718.4 m, standard deviation 529.39 m, and below threshold 67 percent of the route in four stretches
The window at a 2,000 m threshold: 67% of the route falls below it, across four stretches, the longest running 10,063.7 m.
The corridor on the map with its centerline colored red where narrower than 2000 meters and blue where wider, matching the graph
The same result on the map, colored to match.

Adjusting the threshold

Change the threshold by typing a new value, clicking a point on the graph, or dragging the dashed threshold line itself up or down — no need to rerun the analysis, since the width profile was already computed once and every number and color below the line simply reflects wherever it now sits. Suppose, after seeing the 2,000 m picture, you decide that 2,000 was too cautious and the corridor really only becomes a problem below 1,000 m. Move the threshold down and the story changes completely: only 6.9% of the route now falls below it, in two short stretches instead of four long ones.

The same Bottleneck Analysis window with the threshold changed to 1000 meters: the graph is now mostly blue with two short red dips, and the statistics read below threshold 6.9 percent of the route in two stretches, 918.8 meters and 627.2 meters
The threshold moved to 1,000 m: the same route, but now only 6.9% of it counts as a bottleneck.
The corridor on the map with the centerline now almost entirely blue, with two short red segments where the width drops below 1000 meters
The map follows instantly: almost the entire route is comfortable at this looser threshold.

Advanced options

Three controls, tucked under the Advanced expander, tune the analysis without changing what it measures:

The Show route on map checkbox controls only whether the route and its colored stretches draw as a temporary overlay while you work; it has no effect on the analysis or on what you can save afterward.

Getting results out

Six buttons along the bottom of the window cover every way to keep what the analysis produced:

A layout page with the width-profile graph in the upper left, the Bottleneck Width Statistics text block beside it, and a map showing the corridor with its centerline colored by the 2000 meter threshold
Add Graph and Stats to Layout: the graph and its statistics as native layout elements, beside the corridor with the saved threshold segments symbolized on the map.
A small Add to which layout dialog listing eight layouts in the project, with one highlighted and Add to Layout and Cancel buttons
If the active view is a map rather than a layout when you click Add Graph and Stats to Layout, the tool asks which layout to use.

The geoprocessing tool, and ModelBuilder

The geoprocessing tool takes the same inputs as the window — a corridor polygon, the two wildland blocks (with the same per-field SQL expressions when a layer holds more than one feature, as in the black bear example above), and an optional width threshold — and writes the route, the station points, and the above/below-threshold segments directly to named output feature classes, no window required. The advantage of this version of the tool is that it can be run from a Python script or chained into a string of tools in ModelBuilder, so one model can evaluate every corridor in a project the same way. The downside is that you cannot easily explore the consequences of different thresholds, since each threshold is a separate run rather than a drag on a live graph, and you cannot create graphics for your layouts or reports; both of those belong to the window.

The Bottleneck Analysis geoprocessing pane: corridor polygon Black Bear 2 percent Corridor, Wildland Block A and B both set to Wildland Blocks with OWNERSHIP equal to Tumacacori and Santa Rita selection expressions, width threshold 2000, and three named output feature classes for the corridor, width points and width segments
The same black bear inputs as the window, including the same two SQL expressions, with three named outputs.
A ModelBuilder diagram: Black Bear 2 percent Corridor, Wildland Blocks and Wildland Blocks (2) feeding into Bottleneck Analysis, producing three outputs, the corridor route, the width points and the width segments
In ModelBuilder: the corridor and the two block selections in, the route, width points and threshold segments out.

Parameters (geoprocessing tool)

LabelExplanationData type
Corridor polygonRequired · corridor The corridor to profile. An active selection is honored. Feature Layer
Corridor selection expressionOptional · corridor_expression An SQL expression that picks one corridor when the feature class holds several, for example one percentile slice of a Least-Cost Corridor output. SQL Expression
Wildland Block ARequired · block_a The polygon or polygons the route starts from. Feature Layer
Block A selection expressionOptional · block_a_expression An SQL expression that picks Block A when the feature class holds several blocks. SQL Expression
Wildland Block BRequired · block_b The polygon or polygons the route ends at. It can be the same feature class as Block A, with a different expression. Feature Layer
Block B selection expressionOptional · block_b_expression An SQL expression that picks Block B when the feature class holds several blocks. SQL Expression
Width thresholdOptional · threshold Meters; classifies the route into above/below stretches. Double
Output route feature classRequired · out_route The maximin route polyline. Feature Class
Output station pointsOptional · out_points Points along the route, each with the corridor width there. Feature Class
Output above/below-threshold segmentsOptional · out_segments The route cut into stretches above and below the width threshold. Feature Class
Number of width stations along the routeOptional · n_stations How many places along the route the width is measured. Long
Boundary sampling spacingOptional · boundary_step Meters between the sample points placed along the corridor boundary. Blank = automatic. Double
Boundary simplification toleranceOptional · simplify_tolerance Meters. Blank = automatic; 0 = no simplification. Double

The dialog lists one more parameter, Profile JSON path. It is used by the Bottleneck Analysis window to receive the width profile and should be left blank.

Python

import arcpy
arcpy.ImportToolbox(r"C:\path\to\JennessEnterprisesTools.pyt")  # your install path
arcpy.jenness.BottleneckAnalysis(
    corridor=r"D:\corr.gdb\bear_2pct_corridor",
    block_a="Tumacacori_Block", block_b="SantaRita_Block",
    threshold=1000,
    out_route=r"D:\corr.gdb\bear_bottleneck_route",
    out_points=r"D:\corr.gdb\bear_width_stations")

Recommended citation

Jenness, J., D. Majka and P. Beier. 2026. Bottleneck Analysis. Wildlife and Forestry Tools add-in for ArcGIS Pro, v. 1.99 (September 2026). Jenness Enterprises. Available at: https://github.com/JeffJenness/Wildlife_Tools.

Credits and references

By Jeff Jenness, Jenness Enterprises (www.jennessent.com), ported from the CorridorDesigner Evaluation Tools by Jenness, Majka and Beier.

Licensing information

Works at every ArcGIS Pro license level (Basic, Standard, Advanced). No extension licenses are required.