AnsweredAssumed Answered

Creating a network dataset programmatically

Question asked by smitas on Dec 8, 2014

I am running into a problem with creating and building a network dataset programmatically. My feature dataset is hosted in an SDE database and I need to build a network dataset for it. I have version 10.2.1 installed. I have the following code to do it. I get an error at the very end of the function when CreateDataset is called:

Exception from HRESULT: 0x80040220

I got most of this code from the ESRI site and adapted it to my situation. I have not been able to figure out what the problem is. If someone could help me, I would be most obliged.

Thanks in advance....

Smita

 

        public static void CreateAndBuildNetworkDataset(IDatasetName datasetName)

        {

            IFeatureClass featureClass;

            try

            {

                // Create an empty data element for a buildable network dataset.

                IDENetworkDataset2 deNetworkDataset = new DENetworkDatasetClass();

                deNetworkDataset.Buildable = true;

                IDataset dataset = null;

                IFields iFields;

 

 

                OpenTableOrFeatureClass(datasetName, out iFields, out dataset);

                featureClass = dataset as IFeatureClass;

                IGeoDataset geoDataset = (IGeoDataset)dataset;

 

 

                // Copy the feature dataset's extent and spatial reference to the network dataset data element.

                IDEGeoDataset deGeoDataset = (IDEGeoDataset)deNetworkDataset;

                deGeoDataset.Extent = geoDataset.Extent;

                deGeoDataset.SpatialReference = geoDataset.SpatialReference;

 

 

                // Specify the name of the network dataset.

                IDataElement dataElement = (IDataElement)deNetworkDataset;

                dataElement.Name = string.Format("{0}_ND", datasetName.Name);

 

 

                //Specify network sources

                //*****************************************************************

                // Specify the network dataset's elevation model.

                deNetworkDataset.ElevationModel = esriNetworkElevationModel.esriNEMElevationFields;

                deNetworkDataset.NetworkType = esriNetworkDatasetType.esriNDTGeodatabase;

 

 

                // Create an EdgeFeatureSource object and point it to the Streets feature class.

                IEdgeFeatureSource streetsEdgeFeatureSource = new EdgeFeatureSourceClass();

                INetworkSource streetsNetworkSource = (INetworkSource)streetsEdgeFeatureSource;

                streetsNetworkSource.Name = dataset.Name;

                streetsNetworkSource.ElementType = esriNetworkElementType.esriNETEdge;

 

 

                // Set the edge feature source's connectivity settings.

                streetsEdgeFeatureSource.UsesSubtypes = false;

                streetsEdgeFeatureSource.ClassConnectivityGroup = 1;

                streetsEdgeFeatureSource.ClassConnectivityPolicy =

                    esriNetworkEdgeConnectivityPolicy.esriNECPEndVertex;

 

 

                streetsEdgeFeatureSource.FromElevationFieldName = "FromElevation";

                streetsEdgeFeatureSource.ToElevationFieldName = "ToElevation";

 

 

                //Specifying directions settings

                // Create a StreetNameFields object and populate its settings for the Streets source.

                IStreetNameFields streetNameFields = new StreetNameFieldsClass();

                streetNameFields.Priority = 1; // Priority 1 indicates the primary street name.

                streetNameFields.StreetNameFieldName = "StreetName";

                streetNameFields.PrefixTypeFieldName = "PrefixType";

 

 

                // Add the StreetNameFields object to a new NetworkSourceDirections object,

                // then add it to the EdgeFeatureSource object created earlier.

                INetworkSourceDirections streetNetworkSourceDirections = new

                    NetworkSourceDirectionsClass();

                IArray streetNameFieldsArray = new ArrayClass();

                streetNameFieldsArray.Add(streetNameFields);

                streetNetworkSourceDirections.StreetNameFields = streetNameFieldsArray;

                streetsNetworkSource.NetworkSourceDirections = streetNetworkSourceDirections;

 

 

                IArray sourceArray = new ArrayClass();

                sourceArray.Add(streetsNetworkSource);

                deNetworkDataset.Sources = sourceArray;

                //*********************************************************************************

 

 

                //global turns

                deNetworkDataset.SupportsTurns = true;

 

 

                //Attributes

                IArray attributeArray = new ArrayClass();

 

 

                // Initialize variables reused when creating attributes.

                IEvaluatedNetworkAttribute evalNetAttr;

                INetworkAttribute2 netAttr2;

                INetworkFieldEvaluator netFieldEval;

                INetworkConstantEvaluator netConstEval;

 

                //Length field

                // Create an EvaluatedNetworkAttribute object and populate its settings.

                evalNetAttr = new EvaluatedNetworkAttributeClass();

                netAttr2 = (INetworkAttribute2)evalNetAttr;

                netAttr2.Name = "Length";

                netAttr2.UsageType = esriNetworkAttributeUsageType.esriNAUTCost;

                netAttr2.DataType = esriNetworkAttributeDataType.esriNADTDouble;

                netAttr2.Units = esriNetworkAttributeUnits.esriNAUMeters;

                netAttr2.UseByDefault = true;

 

 

                // Create evaluator objects and set them on the EvaluatedNetworkAttribute object.

                netFieldEval = new NetworkFieldEvaluatorClass();

                netFieldEval.SetExpression("[Shape]", "");

                //netFieldEval.SetExpression("[SpeedLimit]", "");

                evalNetAttr.set_Evaluator(streetsNetworkSource,

                    esriNetworkEdgeDirection.esriNEDAlongDigitized, (INetworkEvaluator)netFieldEval);

                evalNetAttr.set_Evaluator(streetsNetworkSource,

                    esriNetworkEdgeDirection.esriNEDAgainstDigitized, (INetworkEvaluator)

                    netFieldEval);

 

 

                netConstEval = new NetworkConstantEvaluatorClass();

                netConstEval.ConstantValue = 0;

                evalNetAttr.set_DefaultEvaluator(esriNetworkElementType.esriNETEdge,

                    (INetworkEvaluator)netConstEval);

                evalNetAttr.set_DefaultEvaluator(esriNetworkElementType.esriNETJunction,

                    (INetworkEvaluator)netConstEval);

                evalNetAttr.set_DefaultEvaluator(esriNetworkElementType.esriNETTurn,

                    (INetworkEvaluator)netConstEval);

 

                // Add the attribute to the array.

                attributeArray.Add(evalNetAttr);

 

                //************************************************************************************************************************

                deNetworkDataset.Attributes = attributeArray;

 

 

                // Create a NetworkDirections object and populate its settings.

                INetworkDirections networkDirections = new NetworkDirectionsClass();

                networkDirections.DefaultOutputLengthUnits = esriNetworkAttributeUnits.esriNAUMiles;

                networkDirections.LengthAttributeName = "Length";

                //networkDirections.TimeAttributeName = "TravelTimeSeconds";

                //networkDirections.RoadClassAttributeName = "RoadClass";

 

 

                // Add the NetworkDirections object to the network dataset data element.

                deNetworkDataset.Directions = networkDirections;

 

 

                // Get the feature dataset extension and create the network dataset based on the data element.

                IFeatureDatasetExtensionContainer fdxContainer = (IFeatureDatasetExtensionContainer)

                    featureClass.FeatureDataset;

                IFeatureDatasetExtension featureDatasetExtension = fdxContainer.FindExtension

                    (esriDatasetType.esriDTNetworkDataset);

                IDatasetContainer2 datasetContainer2 = (IDatasetContainer2)featureDatasetExtension;

                IDEDataset deDataset = (IDEDataset)deNetworkDataset;

                INetworkDataset networkDataset = (INetworkDataset)datasetContainer2.CreateDataset

                    (deDataset);

 

                // Once the network dataset is created, build it.

                INetworkBuild networkBuild = (INetworkBuild)networkDataset;

                networkBuild.BuildNetwork(geoDataset.Extent);

            }

            catch (Exception ex)

            {

                //close

            }

 

 

        }

Outcomes