The recommended way to load data into a network analysis problem is using the Add Locations geoprocessing tool.
NAClassLoader
If your input data is stored in a feature class, use NAClassLoader (LoadFromAFeatureClass method). If your input is a single geometry, then add that geometry to an in-memory feature class (or an feature class stored in a geodatabase). Then, use the following code to load your locations.
The reason the class loader is used instead of manually creating features and setting values is that the loader takes care of details that could otherwise be missed. For example, polygon and polyline barrier features are not defined by the feature geometry, but by the values stored in the Locations field. The class loader will populate this field correctly for you.
Pass the feature class containing the input data, the name of the destination network analysis class (NAClass), and the destination network analysis context (NAContext) as shown in the following code:
[C#]
public void LoadAnalysisObjectsByGeometry(ESRI.ArcGIS.Geodatabase.IFeatureClass
inputFeatureClass, string naClassName, ESRI.ArcGIS.NetworkAnalyst.INAContext
naContext)
{
// Both Initialize and Load take a cursor from the input feature class
ESRI.ArcGIS.Geodatabase.ICursor cursor = inputFeatureClass.Search(null, false)as
ESRI.ArcGIS.Geodatabase.ICursor;
// Initialize the default field mappings.
// If you want to specify field mappings beyond the default ones, use naClassLoader.FieldMap to retrieve
// and edit the mappings between the input class and the naclass.
ESRI.ArcGIS.NetworkAnalyst.INAClassLoader2 naClassLoader = new
ESRI.ArcGIS.NetworkAnalyst.NAClassLoaderClass();
naClassLoader.Initialize(naContext, naClassName, cursor);
// Use ExcludeRestrictedElements and CacheRestrictedElements to prevent locations from being placed on restricted elements.
// Some ways to restrict elements include restriction barriers and restriction attributes.
// If you are loading barriers into barrier classes, or not loading locations (for example, seedpoints)
// then you should not exclude the restricted elements. Also, if you do have barriers in your analysis problem,
// then you should load those first, to make sure the restricted elements are established before loading
// non-barrier classes.
ESRI.ArcGIS.NetworkAnalyst.INALocator3 naLocator3 = naClassLoader.Locator as
ESRI.ArcGIS.NetworkAnalyst.INALocator3;
naLocator3.ExcludeRestrictedElements = true;
naLocator3.CacheRestrictedElements(naContext);
// After Loading is complete, the rowsIn and rowsLocated variable can be used to verify
// that every row from the input feature class has been loaded into the network analysis class
int rowsIn = 0;
int rowsLocated = 0;
naClassLoader.Load(cursor, null, ref rowsIn, ref rowsLocated);
}
[VB.NET]
Public Sub LoadAnalysisObjectsByGeometry(ByVal inputFeatureClass As ESRI.ArcGIS.Geodatabase.IFeatureClass, ByVal naClassName As String, ByVal naContext As ESRI.ArcGIS.NetworkAnalyst.INAContext)
' Both Initialize and Load take a cursor from the input feature class
Dim cursor As ESRI.ArcGIS.Geodatabase.ICursor = TryCast(inputFeatureClass.Search(Nothing, False), ESRI.ArcGIS.Geodatabase.ICursor)
' Initialize the default field mappings.
' If you want to specify field mappings beyond the default ones, use naClassLoader.FieldMap to retrieve
' and edit the mappings between the input class and the naclass.
Dim naClassLoader As ESRI.ArcGIS.NetworkAnalyst.INAClassLoader2 = New ESRI.ArcGIS.NetworkAnalyst.NAClassLoaderClass()
naClassLoader.Initialize(naContext, naClassName, cursor)
' Use ExcludeRestrictedElements and CacheRestrictedElements to prevent locations from being placed on restricted elements.
' Some ways to restrict elements include restriction barriers and restriction attributes.
' If you are loading barriers into barrier classes, or not loading locations (for example, seedpoints)
' then you should not exclude the restricted elements. Also, if you do have barriers in your analysis problem,
' then you should load those first, to make sure the restricted elements are established before loading
' non-barrier classes.
Dim naLocator3 As ESRI.ArcGIS.NetworkAnalyst.INALocator3 = TryCast(naClassLoader.Locator, ESRI.ArcGIS.NetworkAnalyst.INALocator3)
naLocator3.ExcludeRestrictedElements = True
naLocator3.CacheRestrictedElements(naContext)
' After Loading is complete, the rowsIn and rowsLocated variable can be used to verify
' that every row from the input feature class has been loaded into the network analysis class
Dim rowsIn As Integer = 0
Dim rowsLocated As Integer = 0
naClassLoader.Load(cursor, Nothing, rowsIn, rowsLocated)
End Sub
[C#]
public void LoadAnalysisObjectsByField(ESRI.ArcGIS.Geodatabase.ITable inputClass,
string naClassName, ESRI.ArcGIS.NetworkAnalyst.INAContext naContext)
{
// Both Initialize and Load take a cursor from the input class
ESRI.ArcGIS.Geodatabase.ICursor cursor = inputClass.Search(null, false)as
ESRI.ArcGIS.Geodatabase.ICursor;
ESRI.ArcGIS.NetworkAnalyst.INAClassLoader2 naClassLoader = new
ESRI.ArcGIS.NetworkAnalyst.NAClassLoaderClass();
naClassLoader.Initialize(naContext, naClassName, cursor);
// Store the current set of locator agents, so they can be added back later
int agentCount = naContext.Locator.LocatorAgentCount;
var listOfAgents = new System.Collections.Generic.List <
ESRI.ArcGIS.NetworkAnalyst.INALocatorAgent > ();
for (int locIndex = 0; locIndex < agentCount; locIndex++)
listOfAgents.Add(naContext.Locator.get_LocatorAgent(locIndex));
// Remove the existing locator agents from the locator
// This for loop is done in reverse order, because agents are being removed as the loop executes
for (int locIndex = agentCount - 1; locIndex >= 0; locIndex--)
naContext.Locator.RemoveLocatorAgent(locIndex);
// Create and add a fields agent
var fieldsAgent = new
ESRI.ArcGIS.NetworkAnalyst.NALocatorLocationFieldsAgentClass()as
ESRI.ArcGIS.NetworkAnalyst.INALocatorLocationFieldsAgent2;
// Set the field names appropriately based on input data and NAClass
var naClass = naContext.NAClasses.get_ItemByName(naClassName)as
ESRI.ArcGIS.NetworkAnalyst.INAClass;
var naFeatureClass = naClass as ESRI.ArcGIS.Geodatabase.IFeatureClass;
// Check to see if the NAClass is of type NALocation or NALocationRanges
ESRI.ArcGIS.esriSystem.UID naLocationFeatureUID = new
ESRI.ArcGIS.esriSystem.UIDClass();
naLocationFeatureUID.Value = "esriNetworkAnalyst.NALocationFeature";
ESRI.ArcGIS.esriSystem.UID naLocationFeatureRangesUID = new
ESRI.ArcGIS.esriSystem.UIDClass();
naLocationFeatureRangesUID.Value = "esriNetworkAnalyst.NALocationRangesFeature";
if (naFeatureClass.CLSID.Compare(naLocationFeatureUID))
{
// The field names listed below are the names used in ArcGIS Network Analyst extension classes to represent NALocations.
// These are also the names of fields added by the CalculateLocations geoprocessing tool
fieldsAgent.OIDFieldName = "SourceOID";
fieldsAgent.SourceIDFieldName = "SourceID";
fieldsAgent.PositionFieldName = "PosAlong";
fieldsAgent.SideFieldName = "SideOfEdge";
}
else if (naFeatureClass.CLSID.Compare(naLocationFeatureRangesUID))
{
// The location ranges input field must be of type BLOB
fieldsAgent.LocationRangesFieldName = "Locations";
var blobField = inputClass.Fields.get_Field(inputClass.FindField
(fieldsAgent.LocationRangesFieldName));
if (blobField.Type !=
ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeBlob)
{
System.Windows.Forms.MessageBox.Show(
"Loading location ranges by field requires a blob field");
return ;
}
}
naContext.Locator.AddLocatorAgent(fieldsAgent as
ESRI.ArcGIS.NetworkAnalyst.INALocatorAgent);
// After Loading is complete, the rowsIn and rowsLocated variable can be used to verify
// that every row from the input feature class has been loaded into the network analysis class
int rowsIn = 0;
int rowsLocated = 0;
naClassLoader.Load(cursor, null, ref rowsIn, ref rowsLocated);
// Now remove the custom fields agent and add back the stored agents
naContext.Locator.RemoveLocatorAgent(0);
foreach (var agent in listOfAgents)
naContext.Locator.AddLocatorAgent(agent);
}
[VB.NET]
Public Sub LoadAnalysisObjectsByField(ByVal inputClass As ESRI.ArcGIS.Geodatabase.ITable, ByVal naClassName As String, ByVal naContext As ESRI.ArcGIS.NetworkAnalyst.INAContext)
' Both Initialize and Load take a cursor from the input class
Dim cursor As ESRI.ArcGIS.Geodatabase.ICursor = TryCast(inputClass.Search(Nothing, False), ESRI.ArcGIS.Geodatabase.ICursor)
Dim naClassLoader As ESRI.ArcGIS.NetworkAnalyst.INAClassLoader2 = New ESRI.ArcGIS.NetworkAnalyst.NAClassLoaderClass()
naClassLoader.Initialize(naContext, naClassName, cursor)
' Store the current set of locator agents, so they can be added back later
Dim agentCount As Integer = naContext.Locator.LocatorAgentCount
Dim listOfAgents = New System.Collections.Generic.List(Of ESRI.ArcGIS.NetworkAnalyst.INALocatorAgent)()
For locIndex As Integer = 0 To agentCount - 1
listOfAgents.Add(naContext.Locator.get_LocatorAgent(locIndex))
Next
' Remove the existing locator agents from the locator
' This for loop is done in reverse order, because agents are being removed as the loop executes
For locIndex As Integer = agentCount - 1 To 0 Step -1
naContext.Locator.RemoveLocatorAgent(locIndex)
Next
' Create and add a fields agent
Dim fieldsAgent = TryCast(New ESRI.ArcGIS.NetworkAnalyst.NALocatorLocationFieldsAgentClass(), ESRI.ArcGIS.NetworkAnalyst.INALocatorLocationFieldsAgent2)
' Set the field names appropriately based on input data and NAClass
Dim naClass = TryCast(naContext.NAClasses.get_ItemByName(naClassName), ESRI.ArcGIS.NetworkAnalyst.INAClass)
Dim naFeatureClass = TryCast(naClass, ESRI.ArcGIS.Geodatabase.IFeatureClass)
' Check to see if the NAClass is of type NALocation or NALocationRanges
Dim naLocationFeatureUID As ESRI.ArcGIS.esriSystem.UID = New ESRI.ArcGIS.esriSystem.UIDClass()
naLocationFeatureUID.Value = "esriNetworkAnalyst.NALocationFeature"
Dim naLocationFeatureRangesUID As ESRI.ArcGIS.esriSystem.UID = New ESRI.ArcGIS.esriSystem.UIDClass()
naLocationFeatureRangesUID.Value = "esriNetworkAnalyst.NALocationRangesFeature"
If naFeatureClass.CLSID.Compare(naLocationFeatureUID) Then
' The field names listed below are the names used in ArcGIS Network Analyst extension classes to represent NALocations.
' These are also the names of fields added by the CalculateLocations geoprocessing tool
fieldsAgent.OIDFieldName = "SourceOID"
fieldsAgent.SourceIDFieldName = "SourceID"
fieldsAgent.PositionFieldName = "PosAlong"
fieldsAgent.SideFieldName = "SideOfEdge"
ElseIf naFeatureClass.CLSID.Compare(naLocationFeatureRangesUID) Then
' The location ranges input field must be of type BLOB
fieldsAgent.LocationRangesFieldName = "Locations"
Dim blobField = inputClass.Fields.get_Field(inputClass.FindField(fieldsAgent.LocationRangesFieldName))
If blobField.Type <> ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeBlob Then
System.Windows.Forms.MessageBox.Show("Loading location ranges by field requires a blob field")
Exit Sub
End If
End If
naContext.Locator.AddLocatorAgent(TryCast(fieldsAgent, ESRI.ArcGIS.NetworkAnalyst.INALocatorAgent))
' After Loading is complete, the rowsIn and rowsLocated variable can be used to verify
' that every row from the input feature class has been loaded into the network analysis class
Dim rowsIn As Integer = 0
Dim rowsLocated As Integer = 0
naClassLoader.Load(cursor, Nothing, rowsIn, rowsLocated)
' Now remove the custom fields agent and add back the stored agents
naContext.Locator.RemoveLocatorAgent(0)
For Each agent In listOfAgents
naContext.Locator.AddLocatorAgent(agent)
Next
End Sub
Note: When loading into the Stops class of a Route analysis, you must set a valid Sequence value in order for the analysis to solve correctly.
In ArcMap
If you do your loading inside of ArcMap, you need to concern yourself with undo/redo, as well as refreshing the NAWindow. This is all covered in the code below:
[C#]
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
// This assumes a desktop application.
ESRI.ArcGIS.Framework.IApplication app = m_pHookHelper.Hook as
ESRI.ArcGIS.Framework.IApplication;
ESRI.ArcGIS.NetworkAnalystUI.INetworkAnalystExtension naExt =
(ESRI.ArcGIS.NetworkAnalystUI.INetworkAnalystExtension)
app.FindExtensionByName("Network Analyst");
ESRI.ArcGIS.NetworkAnalystUI.INAWindow naWindow = naExt.NAWindow;
if (naWindow.ActiveAnalysis == null || naWindow.ActiveCategory == null)
{
System.Windows.Forms.MessageBox.Show(
"There must be an active analysis layer and an active category");
return ;
}
ESRI.ArcGIS.NetworkAnalyst.INALayer naLayer = naWindow.ActiveAnalysis;
ESRI.ArcGIS.NetworkAnalyst.INAContext naContext = naLayer.Context;
ESRI.ArcGIS.NetworkAnalyst.INALocator naLocator = naContext.Locator;
ESRI.ArcGIS.Geodatabase.IFeatureClass naFeatureClass =
(ESRI.ArcGIS.Geodatabase.IFeatureClass)naWindow.ActiveCategory.NAClass;
var naClassDef = naFeatureClass as ESRI.ArcGIS.NetworkAnalyst.INAClassDefinition;
if (!naClassDef.IsInput || naFeatureClass.ShapeType !=
ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
{
System.Windows.Forms.MessageBox.Show(
"The NAClass must be an input class of geometry type Point");
return ;
}
// Gets the closeset point on the network features to where the user clicked
ESRI.ArcGIS.ArcMapUI.IMxDocument mxDoc = (ESRI.ArcGIS.ArcMapUI.IMxDocument)
app.Document;
ESRI.ArcGIS.Geometry.IPoint inputPoint = mxDoc.CurrentLocation;
// Start an edit operation (for undo/redo)
naWindow.StartOperation(naContext);
// Create a feature and QI to INALocationObject
ESRI.ArcGIS.Geodatabase.IFeature feature = naFeatureClass.CreateFeature();
((ESRI.ArcGIS.Geodatabase.IRowSubtypes)feature).InitDefaultValues();
// The NALocation information only needs to be set for NALocation classes
ESRI.ArcGIS.esriSystem.UID naLocationFeatureUID = new
ESRI.ArcGIS.esriSystem.UIDClass();
naLocationFeatureUID.Value = "esriNetworkAnalyst.NALocationFeature";
ESRI.ArcGIS.NetworkAnalyst.INALocation naLocation = new
ESRI.ArcGIS.NetworkAnalyst.NALocationClass();
if (naFeatureClass.CLSID.Compare(naLocationFeatureUID))
{
// Returns the locator object, the point and the distance
ESRI.ArcGIS.Geometry.IPoint queriedPoint = new
ESRI.ArcGIS.Geometry.PointClass();
double distanceToLocation = - 1;
naLocator.QueryLocationByPoint(inputPoint, ref naLocation, ref queriedPoint,
ref distanceToLocation);
// If not located, use input point
if (naLocation == null || !naLocation.IsLocated)
queriedPoint = inputPoint;
ESRI.ArcGIS.NetworkAnalyst.INALocationObject naLocationObject =
(ESRI.ArcGIS.NetworkAnalyst.INALocationObject)feature;
// Set the NALocation
naLocationObject.NALocation = naLocation;
inputPoint = queriedPoint;
}
// Set the Shape
feature.Shape = inputPoint;
// Set the name of the new analysis object.
// If a display expression is set, then determine what the expression is and set
// the appropriate fields to get the name you want.
var featureLayer = naWindow.ActiveCategory.Layer as
ESRI.ArcGIS.Carto.IFeatureLayer;
// If the display expression is not set, then use the display field as the name.
// You can check the display expression via the ExpressionProperties of the
// IDisplayString interface of the FeatureLayer
int displayFieldIndex = naFeatureClass.FindField(featureLayer.DisplayField);
// Only set this display value if the display field is of type string
if (naFeatureClass.Fields.get_Field(displayFieldIndex).Type ==
ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString)
feature.set_Value(displayFieldIndex, inputPoint.X.ToString() + "," +
inputPoint.Y.ToString());
// Set the Status Field
int statusFieldIndex = naFeatureClass.FindField("Status");
if (statusFieldIndex > 0)
{
if (naLocation.IsLocated)
feature.set_Value(statusFieldIndex,
ESRI.ArcGIS.NetworkAnalyst.esriNAObjectStatus.esriNAObjectStatusOK);
else
feature.set_Value(statusFieldIndex,
ESRI.ArcGIS.NetworkAnalyst.esriNAObjectStatus.esriNAObjectStatusNotLocated);
}
// Set the sequence field (Only on stops)
// If you wish to insert a stop somewhere in the middle of other stops, you will need to
// redo the sequence values for all of the stops after the one you insert.
int sequenceFieldIndex = naFeatureClass.FindField("Sequence");
if (sequenceFieldIndex > 0)
feature.set_Value(sequenceFieldIndex, ((ESRI.ArcGIS.Geodatabase.ITable)
naFeatureClass).RowCount(null));
// Store the geometry
feature.Store();
// Stop the edit operation
naWindow.StopOperation(naContext, "Add " + naWindow.ActiveCategory.Layer.Name);
// Refresh map
mxDoc.ActiveView.Refresh();
}
[VB.NET]
Public Overloads Overrides Sub OnMouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer)
' This assumes a desktop application.
Dim app As ESRI.ArcGIS.Framework.IApplication = TryCast(m_pHookHelper.Hook, ESRI.ArcGIS.Framework.IApplication)
Dim naExt As ESRI.ArcGIS.NetworkAnalystUI.INetworkAnalystExtension = DirectCast(app.FindExtensionByName("Network Analyst"), ESRI.ArcGIS.NetworkAnalystUI.INetworkAnalystExtension)
Dim naWindow As ESRI.ArcGIS.NetworkAnalystUI.INAWindow = naExt.NAWindow
If naWindow.ActiveAnalysis Is Nothing OrElse naWindow.ActiveCategory Is Nothing Then
System.Windows.Forms.MessageBox.Show("There must be an active analysis layer and an active category")
Exit Sub
End If
Dim naLayer As ESRI.ArcGIS.NetworkAnalyst.INALayer = naWindow.ActiveAnalysis
Dim naContext As ESRI.ArcGIS.NetworkAnalyst.INAContext = naLayer.Context
Dim naLocator As ESRI.ArcGIS.NetworkAnalyst.INALocator = naContext.Locator
Dim naFeatureClass As ESRI.ArcGIS.Geodatabase.IFeatureClass = DirectCast(naWindow.ActiveCategory.NAClass, ESRI.ArcGIS.Geodatabase.IFeatureClass)
Dim naClassDef = TryCast(naFeatureClass, ESRI.ArcGIS.NetworkAnalyst.INAClassDefinition)
If Not naClassDef.IsInput OrElse naFeatureClass.ShapeType <> ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint Then
System.Windows.Forms.MessageBox.Show("The NAClass must be an input class of geometry type Point")
Exit Sub
End If
' Gets the closeset point on the network features to where the user clicked
Dim mxDoc As ESRI.ArcGIS.ArcMapUI.IMxDocument = DirectCast(app.Document, ESRI.ArcGIS.ArcMapUI.IMxDocument)
Dim inputPoint As ESRI.ArcGIS.Geometry.IPoint = mxDoc.CurrentLocation
' Start an edit operation (for undo/redo)
naWindow.StartOperation(naContext)
' Create a feature and QI to INALocationObject
Dim feature As ESRI.ArcGIS.Geodatabase.IFeature = naFeatureClass.CreateFeature()
DirectCast(feature, ESRI.ArcGIS.Geodatabase.IRowSubtypes).InitDefaultValues()
' The NALocation information only needs to be set for NALocation classes
Dim naLocationFeatureUID As ESRI.ArcGIS.esriSystem.UID = New ESRI.ArcGIS.esriSystem.UIDClass()
naLocationFeatureUID.Value = "esriNetworkAnalyst.NALocationFeature"
Dim naLocation As ESRI.ArcGIS.NetworkAnalyst.INALocation = New ESRI.ArcGIS.NetworkAnalyst.NALocationClass()
If naFeatureClass.CLSID.Compare(naLocationFeatureUID) Then
' Returns the locator object, the point and the distance
Dim queriedPoint As ESRI.ArcGIS.Geometry.IPoint = New ESRI.ArcGIS.Geometry.PointClass()
Dim distanceToLocation As Double = -1
naLocator.QueryLocationByPoint(inputPoint, naLocation, queriedPoint, distanceToLocation)
' If not located, use input point
If naLocation Is Nothing OrElse Not naLocation.IsLocated Then
queriedPoint = inputPoint
End If
Dim naLocationObject As ESRI.ArcGIS.NetworkAnalyst.INALocationObject = DirectCast(feature, ESRI.ArcGIS.NetworkAnalyst.INALocationObject)
' Set the NALocation
naLocationObject.NALocation = naLocation
inputPoint = queriedPoint
End If
' Set the Shape
feature.Shape = inputPoint
' Set the name of the new analysis object.
' If a display expression is set, then determine what the expression is and set
' the appropriate fields to get the name you want.
Dim featureLayer = TryCast(naWindow.ActiveCategory.Layer, ESRI.ArcGIS.Carto.IFeatureLayer)
' If the display expression is not set, then use the display field as the name.
' You can check the display expression via the ExpressionProperties of the
' IDisplayString interface of the FeatureLayer
Dim displayFieldIndex As Integer = naFeatureClass.FindField(featureLayer.DisplayField)
' Only set this display value if the display field is of type string
If naFeatureClass.Fields.get_Field(displayFieldIndex).Type = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString Then
feature.set_Value(displayFieldIndex, (inputPoint.X.ToString() & ",") + inputPoint.Y.ToString())
End If
' Set the Status Field
Dim statusFieldIndex As Integer = naFeatureClass.FindField("Status")
If statusFieldIndex > 0 Then
If naLocation.IsLocated Then
feature.set_Value(statusFieldIndex, ESRI.ArcGIS.NetworkAnalyst.esriNAObjectStatus.esriNAObjectStatusOK)
Else
feature.set_Value(statusFieldIndex, ESRI.ArcGIS.NetworkAnalyst.esriNAObjectStatus.esriNAObjectStatusNotLocated)
End If
End If
' Set the sequence field (Only on stops)
' If you wish to insert a stop somewhere in the middle of other stops, you will need to
' redo the sequence values for all of the stops after the one you insert.
Dim sequenceFieldIndex As Integer = naFeatureClass.FindField("Sequence")
If sequenceFieldIndex > 0 Then
feature.set_Value(sequenceFieldIndex, DirectCast(naFeatureClass, ESRI.ArcGIS.Geodatabase.ITable).RowCount(Nothing))
End If
' Store the geometry
feature.Store()
' Stop the edit operation
naWindow.StopOperation(naContext, "Add " & naWindow.ActiveCategory.Layer.Name)
' Refresh map
mxDoc.ActiveView.Refresh()
End Sub
See Also:
What is ArcGIS Network Analyst extension?About the ArcGIS Network Analyst extension Tutorial
Essential ArcGIS Network Analyst extension vocabulary
NetworkAnalyst
ArcGIS Network Analyst extension Object Model Diagram
To use the code in this topic, reference the following assemblies in your Visual Studio project. In the code files, you will need using (C#) or Imports (VB .NET) directives for the corresponding namespaces (given in parenthesis below if different from the assembly name):
ESRI.ArcGIS.NetworkAnalyst ESRI.ArcGIS.System (ESRI.ArcGIS.esriSystem)ESRI.ArcGIS.Geodatabase
Development licensing | Deployment licensing |
---|---|
Engine Developer Kit | Engine: Network Analyst |
ArcGIS for Desktop Advanced: Network Analyst | ArcGIS for Desktop Advanced: Network Analyst |
ArcGIS for Desktop Standard: Network Analyst | ArcGIS for Desktop Standard: Network Analyst |
ArcGIS for Desktop Basic: Network Analyst | ArcGIS for Desktop Basic: Network Analyst |