About the Origin-destination cost matrix solver Sample
[C#]
frmODCostMatrixSolver.cs
//************************************************************************************* // Network Analyst - OD Cost Matrix Demonstration // // This simple code shows how to : // 1) Open a workspace and open a Network DataSet // 2) Create a NAContext and its NASolver // 3) Load Origins/Destinations from Feature Classes and create Network Locations // 4) Set the Solver parameters // 5) Solve an OD Cost Matrix problem // 6) Read the ODLines output to display the total number of routes found // and the route details //************************************************************************************ using System; using System.Windows.Forms; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.NetworkAnalyst; namespace OD_Cost_Matrix_CSharp { public partial class frmODCostMatrixSolver : Form { private INAContext m_NAContext; public frmODCostMatrixSolver() { InitializeComponent(); Initialize(); } /// <summary> /// Initialize the solver by calling the network analyst functions. /// </summary> private void Initialize() { IFeatureWorkspace featureWorkspace = null; INetworkDataset networkDataset = null; try { // Open the Network Dataset IWorkspace workspace = OpenWorkspace(Application.StartupPath + @"\..\..\..\..\..\Data\SanFrancisco\SanFrancisco.gdb"); networkDataset = OpenNetworkDataset(workspace, "Transportation", "Streets_ND"); featureWorkspace = workspace as IFeatureWorkspace; } catch (Exception ex) { System.Windows.Forms.MessageBox.Show("Unable to open dataset. Error Message: " + ex.Message); this.Close(); return; } // Create NAContext and NASolver m_NAContext = CreateSolverContext(networkDataset); // Get available cost attributes from the network dataset INetworkAttribute networkAttribute; for (int i = 0; i < networkDataset.AttributeCount - 1; i++) { networkAttribute = networkDataset.get_Attribute(i); if (networkAttribute.UsageType == esriNetworkAttributeUsageType.esriNAUTCost) { comboCostAttribute.Items.Add(networkAttribute.Name); } } comboCostAttribute.SelectedIndex = 0; textTargetFacility.Text = ""; textCutoff.Text = ""; // Load locations from feature class IFeatureClass inputFClass = featureWorkspace.OpenFeatureClass("Stores"); LoadNANetworkLocations("Origins", inputFClass, 100); inputFClass = featureWorkspace.OpenFeatureClass("Hospitals"); LoadNANetworkLocations("Destinations", inputFClass, 100); // Create layer for network dataset and add to ArcMap INetworkLayer networkLayer = new NetworkLayerClass(); networkLayer.NetworkDataset = networkDataset; ILayer layer = networkLayer as ILayer; layer.Name = "Network Dataset"; axMapControl.AddLayer(layer, 0); // Create a network analysis layer and add to ArcMap INALayer naLayer = m_NAContext.Solver.CreateLayer(m_NAContext); layer = naLayer as ILayer; layer.Name = m_NAContext.Solver.DisplayName; axMapControl.AddLayer(layer, 0); } /// <summary> /// Call the OD cost matrix solver and display the results /// </summary> /// <param name="sender">Sender of the event</param> /// <param name="e">Event</param> private void cmdSolve_Click(object sender, EventArgs e) { try { listOutput.Items.Clear(); cmdSolve.Text = "Solving..."; SetSolverSettings(); // Solve IGPMessages gpMessages = new GPMessagesClass(); if (!m_NAContext.Solver.Solve(m_NAContext, gpMessages, null)) { // Get the ODLines output GetODOutput(); } else listOutput.Items.Add("Partial Result"); // Display Error/Warning/Informative messages if (gpMessages != null) { for (int i = 0; i < gpMessages.Count; i++) { switch (gpMessages.GetMessage(i).Type) { case esriGPMessageType.esriGPMessageTypeError: listOutput.Items.Add("Error " + gpMessages.GetMessage(i).ErrorCode.ToString() + " " + gpMessages.GetMessage(i).Description); break; case esriGPMessageType.esriGPMessageTypeWarning: listOutput.Items.Add("Warning " + gpMessages.GetMessage(i).Description); break; default: listOutput.Items.Add("Information " + gpMessages.GetMessage(i).Description); break; } } } // Zoom to the extent of the route IGeoDataset gDataset = m_NAContext.NAClasses.get_ItemByName("ODLines") as IGeoDataset; IEnvelope envelope = gDataset.Extent; if (!envelope.IsEmpty) { envelope.Expand(1.1, 1.1, true); axMapControl.Extent = envelope; } axMapControl.Refresh(); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { cmdSolve.Text = "Find OD Cost Matrix"; } } /// <summary> /// Get the impedance cost from the ODLines class output /// </summary> public void GetODOutput() { ITable naTable = m_NAContext.NAClasses.get_ItemByName("ODLines") as ITable; if (naTable == null) listOutput.Items.Add("Impossible to get the ODLines table"); listOutput.Items.Add("Number of destinations found: " + naTable.RowCount(null).ToString()); listOutput.Items.Add(""); if (naTable.RowCount(null) > 0) { listOutput.Items.Add("OriginID, DestinationID, DestinationRank, Total_" + comboCostAttribute.Text); double total_impedance; long OriginID; long DestinationID; long DestinationRank; ICursor naCursor = naTable.Search(null, false); IRow naRow = naCursor.NextRow(); while (naRow != null) { OriginID = long.Parse(naRow.get_Value(naTable.FindField("OriginID")).ToString()); DestinationID = long.Parse(naRow.get_Value(naTable.FindField("DestinationID")).ToString()); DestinationRank = long.Parse(naRow.get_Value(naTable.FindField("DestinationRank")).ToString()); total_impedance = double.Parse(naRow.get_Value(naTable.FindField("Total_" + comboCostAttribute.Text)).ToString()); listOutput.Items.Add(OriginID.ToString() + ", " + DestinationID.ToString() + ", " + DestinationRank.ToString() + ", " + total_impedance.ToString("#0.00")); naRow = naCursor.NextRow(); } } listOutput.Refresh(); } #region Network analyst functions /// <summary> /// Create NASolver and NAContext /// </summary> /// <param name="networkDataset">Input network dataset</param> /// <returns>NAContext</returns> public INAContext CreateSolverContext(INetworkDataset networkDataset) { //Get the data element IDENetworkDataset deNDS = GetDENetworkDataset(networkDataset); INASolver naSolver = new NAODCostMatrixSolver(); INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit; //Bind a context using the network dataset contextEdit.Bind(networkDataset, new GPMessagesClass()); return contextEdit as INAContext; } /// <summary> /// Set solver settings /// </summary> /// <param name="strNAClassName">NAClass name</param> /// <param name="inputFC">Input feature class</param> /// <param name="snapTolerance">Snap tolerance</param> public void LoadNANetworkLocations(string strNAClassName, IFeatureClass inputFC, double snapTolerance) { INamedSet classes = m_NAContext.NAClasses; INAClass naClass = classes.get_ItemByName(strNAClassName) as INAClass; // Delete existing locations from the specified NAClass naClass.DeleteAllRows(); // Create a NAClassLoader and set the snap tolerance (meters unit) INAClassLoader loader = new NAClassLoader(); loader.Locator = m_NAContext.Locator; if (snapTolerance > 0) loader.Locator.SnapTolerance = snapTolerance; loader.NAClass = naClass; // Create field map to automatically map fields from input class to NAClass INAClassFieldMap fieldMap = new NAClassFieldMapClass(); fieldMap.CreateMapping(naClass.ClassDefinition, inputFC.Fields); loader.FieldMap = fieldMap; // Avoid loading network locations onto non-traversable portions of elements INALocator3 locator = m_NAContext.Locator as INALocator3; locator.ExcludeRestrictedElements = true; locator.CacheRestrictedElements(m_NAContext); // Load network locations int rowsIn = 0; int rowsLocated = 0; loader.Load((ICursor)inputFC.Search(null, true), null, ref rowsIn, ref rowsLocated); // Message all of the network analysis agents that the analysis context has changed. INAContextEdit naContextEdit = m_NAContext as INAContextEdit; naContextEdit.ContextChanged(); } /// <summary> /// Set solver settings /// </summary> public void SetSolverSettings() { // Set OD solver specific settings INASolver solver = m_NAContext.Solver; INAODCostMatrixSolver odSolver = solver as INAODCostMatrixSolver; if (textCutoff.Text.Length > 0 && IsNumeric(textCutoff.Text.Trim())) odSolver.DefaultCutoff = textCutoff.Text; else odSolver.DefaultCutoff = null; if (textTargetFacility.Text.Length > 0 && IsNumeric(textTargetFacility.Text.Trim())) odSolver.DefaultTargetDestinationCount = textTargetFacility.Text; else odSolver.DefaultTargetDestinationCount = null; odSolver.OutputLines = esriNAOutputLineType.esriNAOutputLineStraight; // Set generic solver settings // Set the impedance attribute INASolverSettings solverSettings = solver as INASolverSettings; solverSettings.ImpedanceAttributeName = comboCostAttribute.Text; // Set the OneWay restriction if necessary IStringArray restrictions = solverSettings.RestrictionAttributeNames; restrictions.RemoveAll(); if (checkUseRestriction.Checked) restrictions.Add("oneway"); solverSettings.RestrictionAttributeNames = restrictions; // Restrict UTurns solverSettings.RestrictUTurns = esriNetworkForwardStarBacktrack.esriNFSBNoBacktrack; solverSettings.IgnoreInvalidLocations = true; // Set the hierarchy attribute solverSettings.UseHierarchy = checkUseHierarchy.Checked; if (solverSettings.UseHierarchy) solverSettings.HierarchyAttributeName = "hierarchy"; // Do not forget to update the context after you set your impedance solver.UpdateContext(m_NAContext, GetDENetworkDataset(m_NAContext.NetworkDataset), new GPMessagesClass()); } /// <summary> /// Geodatabase function: open work space /// </summary> /// <param name="strGDBName">Input file name</param> /// <returns>Workspace</returns> public IWorkspace OpenWorkspace(string strGDBName) { // As Workspace Factories are Singleton objects, they must be instantiated with the Activator var workspaceFactory = System.Activator.CreateInstance(System.Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory")) as ESRI.ArcGIS.Geodatabase.IWorkspaceFactory; return workspaceFactory.OpenFromFile(strGDBName, 0); } /// <summary> /// Geodatabase function: open network dataset /// </summary> /// <param name="workspace">Input workspace</param> /// <param name="strNDSName">Input network dataset name</param> /// <returns></returns> public INetworkDataset OpenNetworkDataset(IWorkspace workspace, string featureDatasetName, string strNDSName) { // Obtain the dataset container from the workspace var featureWorkspace = workspace as IFeatureWorkspace; ESRI.ArcGIS.Geodatabase.IFeatureDataset featureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName); var featureDatasetExtensionContainer = featureDataset as ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtensionContainer; ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtension featureDatasetExtension = featureDatasetExtensionContainer.FindExtension(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTNetworkDataset); var datasetContainer3 = featureDatasetExtension as ESRI.ArcGIS.Geodatabase.IDatasetContainer3; // Use the container to open the network dataset. ESRI.ArcGIS.Geodatabase.IDataset dataset = datasetContainer3.get_DatasetByName(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTNetworkDataset, strNDSName); return dataset as ESRI.ArcGIS.Geodatabase.INetworkDataset; } /// <summary> /// Geodatabase function: get network dataset /// </summary> /// <param name="networkDataset">Input network dataset</param> /// <returns>DE network dataset</returns> public IDENetworkDataset GetDENetworkDataset(INetworkDataset networkDataset) { // Cast from the network dataset to the DatasetComponent IDatasetComponent dsComponent = networkDataset as IDatasetComponent; // Get the data element return dsComponent.DataElement as IDENetworkDataset; } #endregion /// <summary> /// Check whether a string represents a double value. /// </summary> /// <param name="str"></param> /// <returns></returns> private bool IsNumeric(string str) { try { double.Parse(str.Trim()); } catch (Exception) { return false; } return true; } } }
[Visual Basic .NET]
frmODCostMatrixSolver.vb
'************************************************************************************* ' Network Analyst - OD Cost Matrix Demonstration ' This simple code shows how to : ' 1) Open a workspace and open a Network DataSet ' 2) Create a NAContext and its NASolver ' 3) Load Origins/Destinations from Feature Classes and create Network Locations ' 4) Set the Solver parameters ' 5) Solve an OD Cost Matrix problem ' 6) Read the ODLines output to display the total number of routes found ' and the route details '************************************************************************************ Imports System Imports System.Windows.Forms Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.Geometry Imports ESRI.ArcGIS.NetworkAnalyst Partial Public Class frmODCostMatrixSolver Inherits Form Private m_NAContext As INAContext Public Sub New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call Initialize() End Sub ''' <summary> ''' Initialize the solver by calling the network analyst functions. ''' </summary> Private Sub Initialize() Dim featureWorkspace As IFeatureWorkspace = Nothing Dim networkDataset As INetworkDataset = Nothing ' Open Network Dataset Try Dim workspace As IWorkspace = OpenWorkspace(Application.StartupPath & "\..\..\..\..\..\Data\SanFrancisco\SanFrancisco.gdb") networkDataset = OpenNetworkDataset(workspace, "Transportation", "Streets_ND") featureWorkspace = TryCast(workspace, IFeatureWorkspace) Catch ex As Exception System.Windows.Forms.MessageBox.Show("Unable to open dataset. Error Message: " & ex.Message) Me.Close() Return End Try ' Create NAContext and NASolver m_NAContext = CreateSolverContext(networkDataset) ' Get available cost attributes from the network dataset Dim networkAttribute As INetworkAttribute For i As Integer = 0 To networkDataset.AttributeCount - 2 networkAttribute = networkDataset.Attribute(i) If networkAttribute.UsageType = esriNetworkAttributeUsageType.esriNAUTCost Then comboCostAttribute.Items.Add(networkAttribute.Name) End If Next i comboCostAttribute.SelectedIndex = 0 textTargetFacility.Text = "" textCutoff.Text = "" ' Load locations from feature class Dim inputFClass As IFeatureClass = featureWorkspace.OpenFeatureClass("Stores") LoadNANetworkLocations("Origins", inputFClass, 100) inputFClass = featureWorkspace.OpenFeatureClass("Hospitals") LoadNANetworkLocations("Destinations", inputFClass, 100) ' Create layer for network dataset and add to ArcMap Dim networkLayer As INetworkLayer = New NetworkLayerClass() networkLayer.NetworkDataset = networkDataset Dim layer As ILayer = TryCast(networkLayer, ILayer) layer.Name = "Network Dataset" axMapControl.AddLayer(layer, 0) ' Create a network analysis layer and add to ArcMap Dim naLayer As INALayer = m_NAContext.Solver.CreateLayer(m_NAContext) layer = TryCast(naLayer, ILayer) layer.Name = m_NAContext.Solver.DisplayName axMapControl.AddLayer(layer, 0) End Sub ''' <summary> ''' Call the OD cost matrix solver and display the results ''' </summary> ''' <param name="sender">Sender of the event</param> ''' <param name="e">Event</param> Private Sub cmdSolve_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdSolve.Click Try listOutput.Items.Clear() cmdSolve.Text = "Solving..." SetSolverSettings() ' Solve Dim gpMessages As IGPMessages = New GPMessagesClass() If (Not m_NAContext.Solver.Solve(m_NAContext, gpMessages, Nothing)) Then ' Get the ODLines output GetODOutput() Else listOutput.Items.Add("Partial Result") End If ' Display Error/Warning/Informative Messages If gpMessages IsNot Nothing Then For i As Integer = 0 To gpMessages.Count - 1 Select Case gpMessages.GetMessage(i).Type Case esriGPMessageType.esriGPMessageTypeError listOutput.Items.Add("Error " & gpMessages.GetMessage(i).ErrorCode.ToString() & " " & gpMessages.GetMessage(i).Description) Case esriGPMessageType.esriGPMessageTypeWarning listOutput.Items.Add("Warning " & gpMessages.GetMessage(i).Description) Case Else listOutput.Items.Add("Information " & gpMessages.GetMessage(i).Description) End Select Next i End If ' Zoom to the extent of the route Dim gDataset As IGeoDataset = TryCast(m_NAContext.NAClasses.ItemByName("ODLines"), IGeoDataset) Dim envelope As IEnvelope = gDataset.Extent If (Not envelope.IsEmpty) Then envelope.Expand(1.1, 1.1, True) axMapControl.Extent = envelope End If axMapControl.Refresh() Catch ex As Exception MessageBox.Show(ex.Message) Finally cmdSolve.Text = "Find OD Cost Matrix" End Try End Sub ''' <summary> ''' Get the Impedance Cost from the ODLines Class Output ''' </summary> Public Sub GetODOutput() Dim naTable As ITable = TryCast(m_NAContext.NAClasses.ItemByName("ODLines"), ITable) If naTable Is Nothing Then listOutput.Items.Add("Impossible to get the ODLines table") End If listOutput.Items.Add("Number of destinations found: " & naTable.RowCount(Nothing).ToString()) listOutput.Items.Add("") If naTable.RowCount(Nothing) > 0 Then listOutput.Items.Add("OriginID, DestinationID, DestinationRank, Total_" & comboCostAttribute.Text) Dim total_impedance As Double Dim OriginID As Long Dim DestinationID As Long Dim DestinationRank As Long Dim naCursor As ICursor = naTable.Search(Nothing, False) Dim naRow As IRow = naCursor.NextRow() Do While naRow IsNot Nothing OriginID = Long.Parse(naRow.Value(naTable.FindField("OriginID")).ToString()) DestinationID = Long.Parse(naRow.Value(naTable.FindField("DestinationID")).ToString()) DestinationRank = Long.Parse(naRow.Value(naTable.FindField("DestinationRank")).ToString()) total_impedance = Double.Parse(naRow.Value(naTable.FindField("Total_" & comboCostAttribute.Text)).ToString()) listOutput.Items.Add(OriginID.ToString() & ", " & DestinationID.ToString() & ", " & DestinationRank.ToString() & ", " & total_impedance.ToString("#0.00")) naRow = naCursor.NextRow() Loop End If listOutput.Refresh() End Sub #Region "Network Analyst functions" ''' <summary> ''' Create NASolver and NAContext ''' </summary> ''' <param name="networkDataset">Input network dataset</param> ''' <returns>NAContext</returns> Public Function CreateSolverContext(ByVal networkDataset As INetworkDataset) As INAContext 'Get the Data Element Dim deNDS As IDENetworkDataset = GetDENetworkDataset(networkDataset) Dim naSolver As INASolver = New NAODCostMatrixSolver() Dim contextEdit As INAContextEdit = TryCast(naSolver.CreateContext(deNDS, naSolver.Name), INAContextEdit) 'Bind a context using the network Dataset contextEdit.Bind(networkDataset, New GPMessagesClass()) Return TryCast(contextEdit, INAContext) End Function ''' <summary> ''' Set Solver Settings ''' </summary> ''' <param name="strNAClassName">NAClass name</param> ''' <param name="inputFC">Input feature class</param> ''' <param name="snapTolerance">Snap tolerance</param> Public Sub LoadNANetworkLocations(ByVal strNAClassName As String, ByVal inputFC As IFeatureClass, ByVal snapTolerance As Double) Dim classes As INamedSet = m_NAContext.NAClasses Dim naClass As INAClass = TryCast(classes.ItemByName(strNAClassName), INAClass) ' Delete existing locations from the specified NAClass naClass.DeleteAllRows() ' Create a NAClassLoader and set the snap tolerance (meters unit) Dim loader As INAClassLoader = New NAClassLoader() loader.Locator = m_NAContext.Locator If snapTolerance > 0 Then loader.Locator.SnapTolerance = snapTolerance End If loader.NAClass = naClass ' Create field map to automatically map fields from input class to NAclass Dim fieldMap As INAClassFieldMap = New NAClassFieldMapClass() fieldMap.CreateMapping(naClass.ClassDefinition, inputFC.Fields) loader.FieldMap = fieldMap ' Avoid loading network locations onto non-traversable portions of elements Dim locator As INALocator3 = TryCast(m_NAContext.Locator, INALocator3) locator.ExcludeRestrictedElements = True locator.CacheRestrictedElements(m_NAContext) ' Load network locations Dim rowsIn As Integer = 0 Dim rowsLocated As Integer = 0 loader.Load(CType(inputFC.Search(Nothing, True), ICursor), Nothing, rowsIn, rowsLocated) ' Message all of the network analysis agents that the analysis context has changed. Dim naContextEdit As INAContextEdit = TryCast(m_NAContext, INAContextEdit) naContextEdit.ContextChanged() End Sub ''' <summary> ''' Set Solver Settings ''' </summary> Public Sub SetSolverSettings() ' Set OD Solver specific settings Dim solver As INASolver = m_NAContext.Solver Dim odSolver As INAODCostMatrixSolver = TryCast(solver, INAODCostMatrixSolver) If textCutoff.Text.Length > 0 AndAlso IsNumeric(textCutoff.Text.Trim()) Then odSolver.DefaultCutoff = textCutoff.Text Else odSolver.DefaultCutoff = Nothing End If If textTargetFacility.Text.Length > 0 AndAlso IsNumeric(textTargetFacility.Text.Trim()) Then odSolver.DefaultTargetDestinationCount = textTargetFacility.Text Else odSolver.DefaultTargetDestinationCount = Nothing End If odSolver.OutputLines = esriNAOutputLineType.esriNAOutputLineStraight ' Set generic solver settings ' Set the impedance attribute Dim solverSettings As INASolverSettings = TryCast(solver, INASolverSettings) solverSettings.ImpedanceAttributeName = comboCostAttribute.Text ' Set the OneWay restriction if necessary Dim restrictions As IStringArray = solverSettings.RestrictionAttributeNames restrictions.RemoveAll() If checkUseRestriction.Checked Then restrictions.Add("oneway") End If solverSettings.RestrictionAttributeNames = restrictions ' Restrict UTurns solverSettings.RestrictUTurns = esriNetworkForwardStarBacktrack.esriNFSBNoBacktrack solverSettings.IgnoreInvalidLocations = True ' Set the hierarchy attribute solverSettings.UseHierarchy = checkUseHierarchy.Checked If solverSettings.UseHierarchy Then solverSettings.HierarchyAttributeName = "hierarchy" End If ' Do not forget to update the context after you set your impedance solver.UpdateContext(m_NAContext, GetDENetworkDataset(m_NAContext.NetworkDataset), New GPMessagesClass()) End Sub ''' <summary> ''' Geodatabase function: open work space ''' </summary> ''' <param name="strGDBName">Input file name</param> ''' <returns>Workspace</returns> Public Function OpenWorkspace(ByVal strGDBName As String) As IWorkspace ' As Workspace Factories are Singleton objects, they must be instantiated with the Activator Dim workspaceFactory As IWorkspaceFactory = TryCast(Activator.CreateInstance(Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory")), IWorkspaceFactory) Return workspaceFactory.OpenFromFile(strGDBName, 0) End Function ''' <summary> ''' Geodatabase function: open network Dataset ''' </summary> ''' <param name="workspace">Input workspace</param> ''' <param name="strNDSName">Input network dataset name</param> ''' <returns></returns> Public Function OpenNetworkDataset(ByVal workspace As IWorkspace, ByVal featureDatasetName As String, ByVal strNDSName As String) As INetworkDataset ' Obtain the dataset container from the workspace Dim featureWorkspace As IFeatureWorkspace = TryCast(workspace, IFeatureWorkspace) Dim featureDataset As IFeatureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName) Dim featureDatasetExtensionContainer As IFeatureDatasetExtensionContainer = TryCast(featureDataset, IFeatureDatasetExtensionContainer) Dim featureDatasetExtension As IFeatureDatasetExtension = featureDatasetExtensionContainer.FindExtension(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTNetworkDataset) Dim datasetContainer3 As IDatasetContainer3 = TryCast(featureDatasetExtension, IDatasetContainer3) ' Use the container to open the network dataset Dim dataset As Object = datasetContainer3.DatasetByName(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTNetworkDataset, strNDSName) Return TryCast(dataset, INetworkDataset) End Function ''' <summary> ''' Geodatabase function: get network Dataset ''' </summary> ''' <param name="networkDataset">Input network dataset</param> ''' <returns>DE network dataset</returns> Public Function GetDENetworkDataset(ByVal networkDataset As INetworkDataset) As IDENetworkDataset ' Cast from the Network Dataset to the DatasetComponent Dim dsComponent As IDatasetComponent = TryCast(networkDataset, IDatasetComponent) ' Get the data element Return TryCast(dsComponent.DataElement, IDENetworkDataset) End Function #End Region ''' <summary> ''' Check whether a string represents a double value. ''' </summary> ''' <param name="str"></param> ''' <returns></returns> Private Function IsNumeric(ByVal str As String) As Boolean Try Double.Parse(str.Trim()) Catch e1 As Exception Return False End Try Return True End Function End Class