Network analysis

You can perform network analysis in Python using the Network Analyst module, arcpy.nax. This module provides access to six analysis types. For each analysis (also known as a solver), you work with two objects specific to that analysis: an object that allows you to initialize the analysis, set analysis settings, load the inputs, and run the analysis and another object that allows you to work with the analysis results after you run the analysis.

You can modify the analysis settings, such as the travel mode, using the properties of analysis object. The analysis object also has several methods used for loading inputs and running the analysis. The result object has methods that allow you to access and save the analysis outputs.

See a complete list of properties and methods for the ServiceArea analysis object and the ServiceAreaResult result object.

Note:

This topic uses Service Area analysis as an example; however, the information provided here can be applied to any type of network analysis.

To perform network analysis, follow this five-step workflow:

  1. Initialize the analysis.
  2. Set properties for the analysis.
  3. Load the inputs.
  4. Solve the analysis.
  5. Work with the results.

Initialize the analysis

To initialize the analysis, you must specify a road network. The options for the road network are as follows:

Tip:

For best performance when using a network dataset, use the name of a network dataset layer when initializing your analysis. If you use a catalog path, the network dataset is opened each time the analysis is initialized. Opening a network dataset is time-consuming, as datasets contain advanced data structures and tables that are read and cached. A network dataset layer opens the dataset one time and performs better when the same layer is used.

The following code snippet shows how to initialize a service area analysis using a network dataset:

import arcpy
nd_path = "C:/data/NorthAmerica.gdb/Routing/Routing_ND"
nd_layer_name = "NorthAmerica"

# Create a network dataset layer. The layer will be referenced using its name.
arcpy.nax.MakeNetworkDatasetLayer(nd_path, nd_layer_name)

# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea(nd_layer_name)

The following code snippet shows how to initialize a service area analysis using ArcGIS Online:

import arcpy

# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea("https://www.arcgis.com/")

The following code snippet shows how to initialize a service area analysis using a portal with ArcGIS Enterprise routing services configured:

import arcpy

# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea("https://myportal.mysite.com/portal/")

The following code snippet shows an example of how to initialize a service area analysis using a stand-alone ArcGIS Server site:

Learn more about how to specify a routing service info dictionary

import arcpy

# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea(
    {
        "url": "https://webadaptorhost.domain.com/webadaptorname/rest/services/Routing/NetworkAnalysis/GPServer",
        "utilityUrl": "https://webadaptorhost.domain.com/webadaptorname/rest/services/Routing/NetworkAnalysisUtilities/GPServer",
        "authenticationInfo": {
            "username": "my_username",
            "password": "my_password"
        }
    }
)

Set properties for the analysis

After you initialize the analysis, you must set the properties for the analysis. To determine the properties that are supported by an analysis object and understand how a given property can influence the analysis, see the help topic for the particular object (available under the Classes category in the help). Many of the properties are set using Python enumeration objects, a set of symbolic names representing some constant values. For example, the time units for the analysis can be set to minutes using the Minutes member from the arcpy.nax.TimeUnits enumeration. The help topic for an object describes whether a property needs to be set as an enumeration. It also specifies the name of the enumeration to use.

The most important property to set for any analysis is the travel mode used for the analysis. To set the travel mode, you first must get the list of travel modes supported by the network dataset. Use the GetTravelModes function to do this. From the supported list, select the travel mode for the analysis using its name. The GetTravelModes function returns a dictionary in which key is the travel mode name and value is the travel mode object.

The following code snippet shows how to set the properties for the service area analysis. The snippet assumes that you have already initialized the service area analysis object.

# Get the desired travel mode for the analysis.
nd_travel_modes = arcpy.nax.GetTravelModes(nd_layer_name)
travel_mode = nd_travel_modes["Driving Time"]

# Set properties.
service_area.timeUnits = arcpy.nax.TimeUnits.Minutes
service_area.defaultImpedanceCutoffs = [5, 10, 15]
service_area.travelMode = travel_mode
service_area.outputType = arcpy.nax.ServiceAreaOutputType.Polygons
service_area.geometryAtOverlap = arcpy.nax.ServiceAreaOverlapGeometry.Split

Load the inputs

Before you run the analysis, you must load the input locations to be used for the analysis. Depending on your analysis type, you must load one or more locations into one or more input data types supported by that analysis. For example, to perform service area analysis, you must load one or more facilities—locations around which you generate service area polygons and service area lines—into the ServiceAreaInputDataType.Facilities data type.

You can load the inputs in two ways. If your input locations are already available as feature classes or tables, you can load them using the load method on the analysis object. If you are reading input locations from other data sources, such as a .csv file containing latitude and longitude values, or if you have input locations as geometry objects, you can load the inputs using the insertCursor method on the analysis object.

Learn more about loading inputs for an analysis

Solve the analysis

To run the analysis, call the solve method. This method returns a result object that can be used to work with results from the analysis, such as exporting the results to a feature class.

If the analysis did not find any results—for example, if a route cannot be found between your input stops—the solve method does not raise a Python exception. To determine whether the analysis produced a valid result, use the solveSucceeded property of the result object.

License:

If your network data source is a local network dataset and not a URL to a service, an ArcGIS Network Analyst extension license is required for solve to be successful. Check out the license before you call the solve method.

The following code snippet shows how to run an analysis:

# Check out the Network Analyst extension license.
arcpy.CheckOutExtension("network")

# Solve the analysis.
result = service_area.solve()

Work with the results

After running the analysis, use the result object obtained from the solve method to work with the results. The result object allows you to determine whether the analysis succeeded or failed (using the solveSucceeded property) and whether the analysis produced a partial solution (using the isPartialSolution property). If the analysis failed, you can determine why using the solverMessages method.

The following code snippet shows how to run the analysis and export the results to a feature class:

# Solve the analysis.
result = service_area.solve()

# Export the results to a feature class. If the analysis failed print all the 
# messages.
if result.solveSucceeded:
    result.export(arcpy.nax.ServiceAreaOutputDataType.Polygons, output_polygons)
else:
    arcpy.AddError("Analysis failed")
    # Print all the warning messages.
    for message in result.solverMessages(arcpy.nax.MessageSeverity.Warning):
        arcpy.AddWarning(message[-1])
    # Print all the error messages.
    for message in result.solverMessages(arcpy.nax.MessageSeverity.Error):
        arcpy.AddError(message[-1])

There are several ways to access and work with the results of an analysis. For example, you can export your results to a feature class or read through the rows one by one using a cursor.

Learn more about accessing analysis results