zoukankan      html  css  js  c++  java
  • ArcEngine10.2 how to create a geodatabase network dataset

    ESRI 官方例子 how to create a geodatabase network dataset

    public static void CreateGeodatabaseNetworkDataset()
    {
        // ------------------------------------------------------------------------
        // Creating a new network dataset data element
        // ------------------------------------------------------------------------
        // Create a new empty data element for a buildable network dataset.
        IDENetworkDataset deNetworkDataset = new DENetworkDatasetClass();
        deNetworkDataset.Buildable = true;
        // Open the feature dataset and cast to the IGeoDataset interface.
        IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactory();
        IWorkspace workspace = workspaceFactory.OpenFromFile(@"C:\Users\Desktop\CreateNetworkDataset\Paris.gdb", 0);
        IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
        IFeatureDataset featureDataset = featureWorkspace.OpenFeatureDataset("RoadNetwork");
        IGeoDataset geoDataset = (IGeoDataset)featureDataset;
        // 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 = "ParisNet";
        // ------------------------------------------------------------------------
        // Adding the network sources
        // ------------------------------------------------------------------------
        // ---- Specifying the connectivity settings for the edge source ----
        // Create a new EdgeFeatureSource object and point it to the Streets feature class.
        INetworkSource edgeNetworkSource = new EdgeFeatureSourceClass();
        edgeNetworkSource.Name = "Streets";
        edgeNetworkSource.ElementType = esriNetworkElementType.esriNETEdge;
        // Set the edge feature source's connectivity settings.
        IEdgeFeatureSource edgeFeatureSource = (IEdgeFeatureSource)edgeNetworkSource;
        edgeFeatureSource.UsesSubtypes = true;
        edgeFeatureSource.set_SubtypeConnectivityGroup(1, 1);
        edgeFeatureSource.set_SubtypeConnectivityPolicy(1,
            esriNetworkEdgeConnectivityPolicy.esriNECPEndVertex);
        edgeFeatureSource.set_SubtypeConnectivityGroup(2, 1);
        edgeFeatureSource.set_SubtypeConnectivityPolicy(2,
            esriNetworkEdgeConnectivityPolicy.esriNECPEndVertex);
        edgeFeatureSource.set_SubtypeConnectivityGroup(3, 1);
        edgeFeatureSource.set_SubtypeConnectivityPolicy(3,
            esriNetworkEdgeConnectivityPolicy.esriNECPAnyVertex);
        // ---- Specifying the directions settings for the edge source ----
        // Create a StreetNameFields object and populate its settings.
        IStreetNameFields streetNameFields = new StreetNameFieldsClass();
        streetNameFields.Priority = 1; // Indicates the primary street name.
        streetNameFields.StreetNameFieldName = "FULL_NAME";
        // Add the StreetNameFields object to a new NetworkSourceDirections object,
        // then add it to the EdgeFeatureSource created earlier.
        INetworkSourceDirections nsDirections = new NetworkSourceDirectionsClass();
        IArray nsdArray = new ArrayClass();
        nsdArray.Add(streetNameFields);
        nsDirections.StreetNameFields = nsdArray;
        edgeNetworkSource.NetworkSourceDirections = nsDirections;
        // ---- Specifying the turn source ----
        deNetworkDataset.SupportsTurns = true;
        // Create a new TurnFeatureSource object and point it to the ParisTurns feature class.
        INetworkSource turnNetworkSource = new TurnFeatureSourceClass();
        turnNetworkSource.Name = "ParisTurns";
        turnNetworkSource.ElementType = esriNetworkElementType.esriNETTurn;
        IArray sourceArray = new ArrayClass();
        sourceArray.Add(edgeNetworkSource);
        sourceArray.Add(turnNetworkSource);
        deNetworkDataset.Sources = sourceArray;
        // ------------------------------------------------------------------------
        // Adding the network attributes
        // ------------------------------------------------------------------------
        IArray attributeArray = new ArrayClass();
        // ----- Oneway network attribute -----
        // Create a new EvaluatedNetworkAttribute object and populate its settings.
        IEvaluatedNetworkAttribute oneWayAttribute = new EvaluatedNetworkAttributeClass();
        INetworkAttribute2 oneWayNetworkAttribute2 = (INetworkAttribute2)oneWayAttribute;
        oneWayNetworkAttribute2.Name = "Oneway";
        oneWayNetworkAttribute2.UsageType =
            esriNetworkAttributeUsageType.esriNAUTRestriction;
        oneWayNetworkAttribute2.DataType = esriNetworkAttributeDataType.esriNADTBoolean;
        oneWayNetworkAttribute2.Units = esriNetworkAttributeUnits.esriNAUUnknown;
        oneWayNetworkAttribute2.UseByDefault = true;
        // Create evaluator objects and set them on the EvaluatedNetworkAttribute object.
        INetworkFieldEvaluator oneWayToFromNetworkFieldEvaluator = new
            NetworkFieldEvaluatorClass();
        INetworkEvaluator oneWayToFromNetworkEvaluator = (INetworkEvaluator)
            oneWayToFromNetworkFieldEvaluator;
        oneWayToFromNetworkFieldEvaluator.SetExpression("restricted",
            "restricted = False\n\rSelect Case UCase([Oneway])\n\r Case \"N\", \"TF\", \"T\": restricted = True\n\rEnd Select");
        oneWayAttribute.set_Evaluator(edgeNetworkSource,
            esriNetworkEdgeDirection.esriNEDAlongDigitized, oneWayToFromNetworkEvaluator);
        INetworkFieldEvaluator oneWayFromToNetworkFieldEvaluator = new
            NetworkFieldEvaluatorClass();
        INetworkEvaluator oneWayFromToNetworkEvaluator = (INetworkEvaluator)
            oneWayFromToNetworkFieldEvaluator;
        oneWayFromToNetworkFieldEvaluator.SetExpression("restricted",
            "restricted = False\n\rSelect Case UCase([Oneway])\n\r Case \"N\", \"FT\", \"F\": restricted = True\n\rEnd Select");
        oneWayAttribute.set_Evaluator(edgeNetworkSource,
            esriNetworkEdgeDirection.esriNEDAgainstDigitized, oneWayFromToNetworkEvaluator);
        INetworkConstantEvaluator oneWayNetworkConstantEvaluator = new
            NetworkConstantEvaluatorClass();
        INetworkEvaluator oneWayConstantNetworkEvaluator = (INetworkEvaluator)
            oneWayNetworkConstantEvaluator;
        oneWayNetworkConstantEvaluator.ConstantValue = false; // False = traversable
        oneWayAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETEdge,
            oneWayConstantNetworkEvaluator);
        oneWayAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETJunction,
            oneWayConstantNetworkEvaluator);
        oneWayAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETTurn,
            oneWayConstantNetworkEvaluator);
        // Add the attribute to the array.
        attributeArray.Add(oneWayAttribute);
        // ----- Minutes network attribute -----
        // Create a new EvaluatedNetworkAttribute object and populate its settings.
        IEvaluatedNetworkAttribute minutesAttribute = new EvaluatedNetworkAttributeClass();
        INetworkAttribute2 minutesNetworkAttribute2 = (INetworkAttribute2)minutesAttribute;
        minutesNetworkAttribute2.Name = "Minutes";
        minutesNetworkAttribute2.UsageType = esriNetworkAttributeUsageType.esriNAUTCost;
        minutesNetworkAttribute2.DataType = esriNetworkAttributeDataType.esriNADTDouble;
        minutesNetworkAttribute2.Units = esriNetworkAttributeUnits.esriNAUMinutes;
        minutesNetworkAttribute2.UseByDefault = true;
        // Create evaluator objects and set them on the EvaluatedNetworkAttribute object.
        INetworkFieldEvaluator ftMinutesNetworkFieldEvaluator = new
            NetworkFieldEvaluatorClass();
        INetworkEvaluator ftMinutesNetworkEvaluator = (INetworkEvaluator)
            ftMinutesNetworkFieldEvaluator;
        ftMinutesNetworkFieldEvaluator.SetExpression("[FT_Minutes]", "");
        minutesAttribute.set_Evaluator(edgeNetworkSource,
            esriNetworkEdgeDirection.esriNEDAlongDigitized, ftMinutesNetworkEvaluator);
        INetworkFieldEvaluator tfMinutesNetworkFieldEvaluator = new
            NetworkFieldEvaluatorClass();
        INetworkEvaluator tfMinutesNetworkEvaluator = (INetworkEvaluator)
            tfMinutesNetworkFieldEvaluator;
        tfMinutesNetworkFieldEvaluator.SetExpression("[TF_Minutes]", "");
        minutesAttribute.set_Evaluator(edgeNetworkSource,
            esriNetworkEdgeDirection.esriNEDAgainstDigitized, tfMinutesNetworkEvaluator);
        INetworkConstantEvaluator minutesNetworkConstantEvaluator = new
            NetworkConstantEvaluatorClass();
        INetworkEvaluator minutesConstantNetworkEvaluator = (INetworkEvaluator)
            minutesNetworkConstantEvaluator;
        minutesNetworkConstantEvaluator.ConstantValue = 0;
        minutesAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETEdge,
            minutesConstantNetworkEvaluator);
        minutesAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETJunction,
            minutesConstantNetworkEvaluator);
        minutesAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETTurn,
            minutesConstantNetworkEvaluator);
        // Add the attribute to the array.
        attributeArray.Add(minutesAttribute);
        // ----- Meters network attribute -----
        // Create a new EvaluatedNetworkAttribute object and populate its settings.
        IEvaluatedNetworkAttribute metersAttribute = new EvaluatedNetworkAttributeClass();
        INetworkAttribute2 metersNetworkAttribute2 = (INetworkAttribute2)metersAttribute;
        metersNetworkAttribute2.Name = "Meters";
        metersNetworkAttribute2.UsageType = esriNetworkAttributeUsageType.esriNAUTCost;
        metersNetworkAttribute2.DataType = esriNetworkAttributeDataType.esriNADTDouble;
        metersNetworkAttribute2.Units = esriNetworkAttributeUnits.esriNAUMeters;
        metersNetworkAttribute2.UseByDefault = false;
        // Create evaluator objects and set them on the EvaluatedNetworkAttribute object.
        INetworkFieldEvaluator metersNetworkFieldEvaluator = new NetworkFieldEvaluatorClass()
            ;
        INetworkEvaluator metersNetworkEvaluator = (INetworkEvaluator)
            metersNetworkFieldEvaluator;
        metersNetworkFieldEvaluator.SetExpression("[Meters]", "");
        metersAttribute.set_Evaluator(edgeNetworkSource,
            esriNetworkEdgeDirection.esriNEDAlongDigitized, metersNetworkEvaluator);
        metersAttribute.set_Evaluator(edgeNetworkSource,
            esriNetworkEdgeDirection.esriNEDAgainstDigitized, metersNetworkEvaluator);
        INetworkConstantEvaluator metersNetworkConstantEvaluator = new
            NetworkConstantEvaluatorClass();
        INetworkEvaluator metersConstantNetworkEvaluator = (INetworkEvaluator)
        metersNetworkConstantEvaluator;
        metersNetworkConstantEvaluator.ConstantValue = 0;
        metersAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETEdge,
                                             metersConstantNetworkEvaluator);
        metersAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETJunction,
                                             metersConstantNetworkEvaluator);
        metersAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETTurn,
                                             metersConstantNetworkEvaluator);
        // Add the attribute to the array.
        attributeArray.Add(metersAttribute);
        // ----- RoadClass network attribute -----
        // Create a new EvaluatedNetworkAttribute object and populate its settings.
        IEvaluatedNetworkAttribute roadClassAttribute = new EvaluatedNetworkAttributeClass();
        INetworkAttribute2 roadClassNetworkAttribute2 = (INetworkAttribute2)
            roadClassAttribute;
        roadClassNetworkAttribute2.Name = "RoadClass";
        roadClassNetworkAttribute2.UsageType =
            esriNetworkAttributeUsageType.esriNAUTDescriptor;
        roadClassNetworkAttribute2.DataType = esriNetworkAttributeDataType.esriNADTInteger;
        roadClassNetworkAttribute2.Units = esriNetworkAttributeUnits.esriNAUUnknown;
        roadClassNetworkAttribute2.UseByDefault = false;
        // Create evaluator objects and set them on the EvaluatedNetworkAttribute object.
        INetworkFieldEvaluator roadClassNetworkFieldEvaluator = new
            NetworkFieldEvaluatorClass();
        INetworkEvaluator roadClassNetworkEvaluator = (INetworkEvaluator)
            roadClassNetworkFieldEvaluator;
        roadClassNetworkFieldEvaluator.SetExpression("rc",
            "rc = 1 'Local road\n\rSelect Case UCase([CFCC])\n\r" +
            " Case \"A10\", \"A11\", \"A12\", \"A13\", \"A14\", \"A15\", \"A16\", \"A17\", \"A18\", \"A19\"\n\r" + " rc = 2 'Highway\n\r" + " Case \"A60\", \"A63\"\n\r" + " rc = 3 'Ramp\n\r" + " Case \"A65\", \"A66\", \"A68\", \"A69\"\n\r" + " rc = 4 'Ferry\n\r" + " Case \"A62\"\n\r" + " rc = 5 'Roundabout\n\r" + "End Select");
        roadClassAttribute.set_Evaluator(edgeNetworkSource,
            esriNetworkEdgeDirection.esriNEDAlongDigitized, roadClassNetworkEvaluator);
        roadClassAttribute.set_Evaluator(edgeNetworkSource,
            esriNetworkEdgeDirection.esriNEDAgainstDigitized, roadClassNetworkEvaluator);
        INetworkConstantEvaluator roadClassNetworkConstantEvaluator = new
            NetworkConstantEvaluatorClass();
        INetworkEvaluator roadClassConstantNetworkEvaluator = (INetworkEvaluator)
            roadClassNetworkConstantEvaluator;
        roadClassNetworkConstantEvaluator.ConstantValue = 0;
        roadClassAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETEdge,
            roadClassConstantNetworkEvaluator);
        roadClassAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETJunction,
            roadClassConstantNetworkEvaluator);
        roadClassAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETTurn,
            roadClassConstantNetworkEvaluator);
        // Add the attribute to the array.
        attributeArray.Add(roadClassAttribute);
        // ----- TurnRestriction network attribute -----
        // Create a new EvaluatedNetworkAttribute object and populate its settings.
        IEvaluatedNetworkAttribute turnAttribute = new EvaluatedNetworkAttributeClass();
        INetworkAttribute2 turnNetworkAttribute2 = (INetworkAttribute2)turnAttribute;
        turnNetworkAttribute2.Name = "TurnRestriction";
        turnNetworkAttribute2.UsageType = esriNetworkAttributeUsageType.esriNAUTDescriptor;
        turnNetworkAttribute2.DataType = esriNetworkAttributeDataType.esriNADTInteger;
        turnNetworkAttribute2.Units = esriNetworkAttributeUnits.esriNAUUnknown;
        turnNetworkAttribute2.UseByDefault = false;
        INetworkConstantEvaluator turnTrueNetworkConstantEvaluator = new
            NetworkConstantEvaluatorClass();
        INetworkEvaluator turnTrueNetworkEvaluator = (INetworkEvaluator)
            turnTrueNetworkConstantEvaluator;
        turnTrueNetworkConstantEvaluator.ConstantValue = true;
        turnAttribute.set_Evaluator(turnNetworkSource, esriNetworkEdgeDirection.esriNEDNone,
            turnTrueNetworkEvaluator);
        INetworkConstantEvaluator turnFalseNetworkConstantEvaluator = new
            NetworkConstantEvaluatorClass();
        INetworkEvaluator turnFalseNetworkEvaluator = (INetworkEvaluator)
            turnFalseNetworkConstantEvaluator;
        turnFalseNetworkConstantEvaluator.ConstantValue = false;
        turnAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETEdge,
            turnFalseNetworkEvaluator);
        turnAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETJunction,
            turnFalseNetworkEvaluator);
        turnAttribute.set_DefaultEvaluator(esriNetworkElementType.esriNETTurn,
            turnFalseNetworkEvaluator);
        // Add the attribute to the array.
        attributeArray.Add(turnAttribute);
        deNetworkDataset.Attributes = attributeArray;
        // ------------------------------------------------------------------------
        // Specifying directions settings
        // ------------------------------------------------------------------------
        // Create a NetworkDirections object and populate its settings.
        INetworkDirections networkDirections = new NetworkDirectionsClass();
        networkDirections.DefaultOutputLengthUnits = esriNetworkAttributeUnits.esriNAUMeters;
        networkDirections.LengthAttributeName = "Meters";
        networkDirections.TimeAttributeName = "Minutes";
        networkDirections.RoadClassAttributeName = "RoadClass";
        // Add the NetworkDirections object to the network dataset data element.
        deNetworkDataset.Directions = networkDirections;
        // ------------------------------------------------------------------------
        // Creating and building the network dataset
        // ------------------------------------------------------------------------
        // Get the feature dataset extension and create the network dataset based on the data element.
        IFeatureDatasetExtensionContainer fdxContainer = (IFeatureDatasetExtensionContainer)
            featureDataset;
        IFeatureDatasetExtension fdExtension = fdxContainer.FindExtension
            (esriDatasetType.esriDTNetworkDataset);
        IDatasetContainer2 datasetContainer2 = (IDatasetContainer2)fdExtension;
        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);
    }
    
  • 相关阅读:
    WPF 组织机构摄像机树 全量加载 大数据量 分页加载摄像机节点
    vue3 自定义指令(简易版防抖、节流)
    测试Writer
    The blog In The cnblogs!
    分割
    coeLmiGMmW
    js 之 setTimeout 0 分析
    vue 组件 之 注册 及 组件内data的使用
    Js/es for(let i in Obj)效率分析及优化
    vue.js 表单控件 输入绑定 vmodel的使用
  • 原文地址:https://www.cnblogs.com/lqqgis/p/12642558.html
Copyright © 2011-2022 走看看