Skip To Content

ClosestFacility

Summary

An ArcPy class for performing a closest facility analysis.

Discussion

A closest facility analysis allows you to find the closest facility to each input incident and returns the shortest path along a network between them. Learn more about closest facility analysis.

Syntax

ClosestFacility (in_network)
ParameterExplanationData Type
in_network

The network dataset to use for the network analysis. The argument can be specified using the catalog path to the network dataset, a network dataset layer object, or the string name of the network dataset layer. The network dataset must have at least one travel mode.

String

Properties

PropertyExplanationData Type
accumulateAttributeNames
(Read and Write)

A list of cost attributes to be accumulated during analysis. These accumulated attributes are for reference only; the solver only uses the cost attribute used by your designated travel mode when solving the analysis.

The default is an empty list.

String
defaultImpedanceCutoff
(Read and Write)

The impedance value at which to stop searching for facilities from a given incident.

If the travel mode used in the analysis uses a time-based impedance attribute, the defaultImpedanceCutoff is interpreted in the units specified in the timeUnits property. If the travel mode used in the analysis uses a distance-based impedance attribute, the defaultImpedanceCutoff is interpreted in the units specified in the distanceUnits property. If the travel mode's impedance attribute is neither time-based nor distance-based, the defaultImpedanceCutoff value is interpreted in the units of the impedance attribute. The default is None, which means that no cutoff is applied.

When the travelDirection property is set to TravelDirection.FromFacility, the defaultImpedanceCutoff can be overridden on a per-facility basis using the Cutoff field in the input facilities. When the travelDirection property is set to TravelDirection.ToFacility, the defaultImpedanceCutoff can be overridden on a per-incident basis using the Cutoff field in the input incidents.

Double
defaultTargetFacilityCount
(Read and Write)

The number of closest facilities to find per incident. The default is 1.

The value set in this property can be overridden on a per-incident basis using the TargetFacilityCount field in the input incidents.

Integer
directionsDistanceUnits
(Read and Write)

The units to use when reporting travel distance in the output turn-by-turn directions. The property is returned and set as a member of the DistanceUnits enumeration and is applicable only when the returnDirections property is True. The default is the units of the distance attribute in the travel mode used for the analysis.

Object
directionsLanguage
(Read and Write)

The language in which the output turn-by-turn directions text will appear. The property is returned and set as a string using one of the two- or five-character language codes representing supported directions languages. The list of available directions languages can be obtained from the arcpy.nax.ListDirectionsLanguages function. The default value is either en (English) or the language of the currently activated language pack. The property is applicable only when the returnDirections property is True.

String
directionsStyle
(Read and Write)

The style to be used for the output turn-by-turn directions text. The property is returned and set as a member of the DirectionsStyle enumeration and is applicable only when the returnDirections property is True.

The default value is Desktop.

Object
distanceUnits
(Read and Write)

The units to use when reporting the travel distance in the analysis output. Regardless of the units of the cost attributes in the network dataset, the output will be transformed to and reported in the units set in this property. The property is returned and set as a member of the DistanceUnits enumeration. The default is DistanceUnits.Kilometers.

Object
ignoreInvalidLocations
(Read and Write)

Specifies whether invalid input locations will be ignored. A value of True indicates that invalid input locations will be ignored so that the analysis will succeed using only valid locations. A value of False indicates that invalid locations will not be ignored and will cause the analysis to fail.

Boolean
networkDataSource
(Read Only)

The full catalog path to the network dataset used for the analysis.

String
overrides
(Read and Write)

Specify additional settings that can influence the behavior of the solver when finding solutions for the network analysis problems.

The value for this parameter needs to be specified in JavaScript Object Notation (JSON). For example, a valid value is of the following form: {"overrideSetting1" : "value1", "overrideSetting2" : "value2"}. The override setting name is always enclosed in double quotation marks. The values can be either a number, Boolean, or string.

The default value for this parameter is no value, which indicates not to override any solver settings.

Overrides are advanced settings that should be used only after careful analysis of the results obtained before and after applying the settings. A list of supported override settings for each solver and their acceptable values can be obtained by contacting Esri Technical Support.

String
returnDirections
(Read and Write)

Specifies whether turn-by-turn directions will be generated. A value of True means that turn-by-turn directions will be generated when solving the analysis. A value of False means that directions will not be generated. Generating directions may slow down the analysis. The default is False.

Boolean
routeShapeType
(Read and Write)

The type of shape to be generated to represent output routes. The routes are always calculated along the network; however, you can choose to represent them by shapes that do not reflect the network paths. The property is returned and set as a member of the RouteShapeType enumeration. The default is RouteShapeType.TrueShapeWithMeasures.

Object
searchQuery
(Read and Write)

Specifies a query to restrict the search to a subset of the features within a source feature class. This is useful if you don't want to find features that may be unsuited for a network location. For example, if you are loading centroids of polygons and don't want to locate on local roads, you can define a query that searches for major roads only.

The parameter value is specified as a list with nested lists. The nested list is composed of two values indicating the name and the SQL expression for all of the network sources. The syntax for the SQL expression differs slightly depending on the type of the network source feature class. For example, if you're querying source feature classes stored in file or enterprise geodatabases, shapefiles, or SDC, enclose field names in double quotation marks: "CFCC". If you're querying source feature classes stored in personal geodatabases, enclose fields in square brackets: [CFCC].

If you don't want to specify a query for a particular source, use "#" as the value for the SQL expression or exclude the source name and the SQL expression from the parameter value. If you don't want to specify a query for all of the network sources, use "#" as the parameter value.

For example, the parameter value [["Streets","\"CFCC\" = 'A15'"], ["Streets_ND_Junctions",""]] specifies an SQL expression for the Streets source feature class and no expression for the Streets_ND_Junctions source feature class. Note that the double quotation marks used to enclose the field name CFCC are escaped using backslash characters to avoid a parsing error from the Python interpreter.

By default, no query is used.

List
searchTolerance
(Read and Write)

The maximum search distance to use when locating the input features on the network. The property is returned and set as a double, and the units of this value are accessed through the searchToleranceUnits property. The default is 5000.

Double
searchToleranceUnits
(Read and Write)

The units of the searchTolerance property. The property is returned and set as a member of the DistanceUnits enumeration. The default is DistanceUnits.Meters.

Object
timeOfDay
(Read and Write)

The time of day to use for the analysis. The default is None, which means that the analysis will be time neutral.

DateTime
timeOfDayUsage
(Read and Write)

Indicates whether the timeOfDay value represents the arrival or departure time for the routes. The property is returned and set as a member of the TimeOfDayUsage enumeration. The default is TimeOfDayUsage.DepartureTime.

Object
timeUnits
(Read and Write)

The units to use when reporting the travel time in the analysis output. Regardless of the units of the cost attributes in the network dataset, the outputs will be transformed to and reported in the units set in this property. The property is returned and set as a member of the TimeUnits enumeration. The default is TimeUnits.Minutes.

Object
timeZone
(Read and Write)

Indicates whether the time specified in the timeOfDay property will be interpreted as the local time at the input locations or as coordinated universal time (UTC). The property is returned and set as a member of the TimeZoneUsage enumeration and is applicable only when the timeOfDay property is not None. The default is TimeZoneUsage.LocalTimeAtLocations.

Object
travelDirection
(Read and Write)

The direction of travel between facilities and incidents. The property is returned and set as a member of the TravelDirection enumeration. The default is TravelDirection.ToFacility.

Object
travelMode
(Read and Write)

The travel mode to use for the analysis.

The value is returned and set as an arcpy.nax.TravelMode object, but it can also be set using the string name of the travel mode or a string containing the valid JSON representation of a travel mode. The default is the default travel mode defined on the network dataset used for the analysis.

Learn more about travel modes

Object

Method Overview

MethodExplanation
fieldMappings (input_type, {use_location_fields}, {list_candidate_fields})

Generates a dictionary that maps the field names of the input type to arcpy.nax.NAClassFieldMap objects that allow you to map fields from your input data to the properties of the solver. The dictionary can be used as input to the load method's field_mappings argument.

fieldNames (input_type, {use_location_fields})

Get a list of field names supported by the specified input type.

insertCursor (input_type, field_names)

Establishes a write cursor on the specified input type. This cursor can be used to add rows directly to the input.

load (input_type, features, {field_mappings}, {append}, {max_features})

Set input features to use for the analysis.

solve ()

Perform the closest facility analysis using the properties set on the ClosestFacility object and the loaded inputs.

Methods

fieldMappings (input_type, {use_location_fields}, {list_candidate_fields})
ParameterExplanationData Type
input_type

The type of input for which the field mappings are returned.

The parameter should be set using the ClosestFacilityInputDataType enumeration.

Object
use_location_fields

Indicates whether network location fields should be included in the returned field mappings dictionary. Network location fields describe the point on the network where an object is located. You can use network location fields to more precisely control how your analysis inputs locate on the network and to save time when calling the solve method because the solver will not have to calculate the location fields from the geometry of the inputs. You can calculate location fields for a feature class using the Calculate Locations tool.

When this argument is set to True, the returned field mappings dictionary will contain network location fields. The default is False; the field mapping dictionary will not include network location fields.

(The default value is False)

Boolean
list_candidate_fields
[list_candidate_fields,...]

A list of arcpy.Field objects used to generate the mapped field names, which can be obtained from a given feature class or table using the arcpy.ListFields function. Field names not already matching a field for the input type will also be returned in the map. Calling the load method with these extra fields will add them to the solver's input features so the fields can be passed through and included in the output. If this argument is not specified, the field mappings will be created with only the default values for the appropriate properties.

(The default value is None)

Field
Return Value
Data TypeExplanation
Dictionary

A dictionary in which the keys are the field name and values are arcpy.nax.NAClassFieldMap objects.

fieldNames (input_type, {use_location_fields})
ParameterExplanationData Type
input_type

The type of input for which the supported field names are returned.

The parameter should be set using the ClosestFacilityInputDataType enumeration.

Object
use_location_fields

Indicates whether network location fields will be included in the returned list of field names. Network location fields describe the point on the network where an object is located. You can use network location fields to more precisely control how your analysis inputs locate on the network and to save time when calling the solve method because the solver will not have to calculate the location fields from the geometry of the inputs. You can calculate location fields for a feature class using the Calculate Locations tool.

When this argument is set to True, the returned list of field names will contain network location fields. The default is False; the list of field names will not include network location fields.

(The default value is False)

Boolean
Return Value
Data TypeExplanation
String

A list of field names supported by the specified input type.

insertCursor (input_type, field_names)
ParameterExplanationData Type
input_type

The type of input into which the cursor can be used to insert rows.

The parameter should be set using the ClosestFacilityInputDataType enumeration.

Object
field_names
[field_names,...]

A list of field names of the input type whose values you want to set when inserting rows using the cursor. You can get the names of the fields supported by an input type by using the fieldNames method. In addition to regular fields, you can also set the geometry of the input using one of the following geometry tokens:

  • SHAPE@XYA tuple of the feature's centroid x,y coordinates.
  • SHAPE@XYZA tuple of the feature's centroid x,y,z coordinates. This token is only supported when the geometry is z-enabled.
  • SHAPE@JSON The Esri JSON string representing the geometry.
  • SHAPE@WKBThe well-known binary (WKB) representation for OGC geometry. It provides a portable representation of a geometry value as a contiguous stream of bytes.
  • SHAPE@WKTThe well-known text (WKT) representation for OGC geometry. It provides a portable representation of a geometry value as a text string.
  • SHAPE@A geometry object for the feature.

The SHAPE@XY and SHAPE@XYZ tokens are only supported for point-based input types.

String
Return Value
Data TypeExplanation
Object

A SolverInsertCursor object that can be used to write features.

load (input_type, features, {field_mappings}, {append}, {max_features})
ParameterExplanationData Type
input_type

The type of input feature to load.

The parameter should be set using the ClosestFacilityInputDataType enumeration.

Object
features

The input features to load. This parameter accepts the following input types:

For layer inputs, only selected features will be loaded. If a layer has a definition query, only the subset of features visible with the definition query will be loaded. The method also honors the Extent geoprocessing environment; only features in the specified extent will be loaded.

String
field_mappings

A dictionary that maps the field names of the input type to arcpy.nax.NAClassFieldMap objects representing the mapping of fields from the input features. Valid input for this parameter can be constructed using the fieldMappings method.

If field mappings are not specified, all fields from the input features that have the same name as the supported fields for the input type will be mapped.

(The default value is None)

Dictionary
append

Indicates whether the features being loaded should be appended to the existing set of features for the input type. A value of True indicates that the new features should be appended; the existing features will be preserved. This is useful if you want to load inputs from multiple feature classes or tables to use in a single analysis. This is the default. A value of False indicates that any existing features for the input type should be deleted and replaced with the features currently being loaded.

(The default value is True)

Boolean
max_features

The maximum number of features that can be loaded into the input type. This is useful if you are creating a tool or service and want an error returned if the size of the input exceeds the available resources. The load method will return an arcpy.nax.LimitError if the number of input features exceeds the max_features limit.

If a value is not specified, no limit is enforced for the count of the input features.

(The default value is None)

Integer
solve ()
Return Value
Data TypeExplanation
Object

An arcpy.nax.ClosestFacilityResult object that can be used to access outputs and solver messages.

Code sample

ClosestFacility example

Perform closest facility analysis using a feature class for input stops.

# An example showing how to perform closest facility analysis using inputs from feature classes.
import arcpy
arcpy.CheckOutExtension("network")

nds = "C:/data/NorthAmerica.gdb/Routing/Routing_ND"
nd_layer_name = "Routing_ND"
input_facilities = "C:/data/io.gdb/Incidents"
input_incidents = "C:/data/io.gdb/Facilities"
output_routes = "C:/data/io.gdb/ClosestRoutes"

# Create a network dataset layer and get the desired travel mode for analysis
arcpy.nax.MakeNetworkDatasetLayer(nds, nd_layer_name)
nd_travel_modes = arcpy.nax.GetTravelModes(nd_layer_name)
travel_mode = nd_travel_modes["Driving Time"]

# Instantiate a ClosestFacility solver object
closest_facility = arcpy.nax.ClosestFacility(nds)
# Set properties
closest_facility.travelMode = travel_mode
closest_facility.timeUnits = arcpy.nax.TimeUnits.Minutes
closest_facility.defaultImpedanceCutoff = 15
closest_facility.defaultTargetFacilityCount = 2
closest_facility.routeShapeType = arcpy.nax.RouteShapeType.TrueShapeWithMeasures
# Load inputs
closest_facility.load(arcpy.nax.ClosestFacilityInputDataType.Facilities, input_facilities)
closest_facility.load(arcpy.nax.ClosestFacilityInputDataType.Incidents, input_incidents)
# Solve the analysis
result = closest_facility.solve()

# Export the results to a feature class
if result.solveSucceeded:
    result.export(arcpy.nax.ClosestFacilityOutputDataType.Routes, output_routes)
else:
    print("Solved failed")
    print(result.solverMessages(arcpy.nax.MessageSeverity.All))