您的位置:首页 > 其它

创建NetWorkDataset---FileGDB篇

2016-04-15 10:38 274 查看
/// <summary>

/// 创建NetWorkDataset

/// </summary>

/// <returns>INetworkDataset.</returns>

public INetworkDataset CreateNetWorkDataset()

{

log.WriteLog("开始创建NetWorkDataset...");

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

IDENetworkDataset2 deNetworkDataset = new DENetworkDatasetClass();

deNetworkDataset.Buildable = true;

// Open the feature dataset and cast to the IGeoDataset interface.

Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");

IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);

IWorkspace workspace = workspaceFactory.OpenFromFile(@"E:\TEST.gdb", 0);

IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;

IFeatureDataset featureDataset = featureWorkspace.OpenFeatureDataset("HOSP");

IGeoDataset geoDataset = (IGeoDataset)featureDataset;

deNetworkDataset.NetworkType = esriNetworkDatasetType.esriNDTGeodatabase;

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

IDEGeoDataset deGeoDataset = (IDEGeoDataset)deNetworkDataset;

deGeoDataset.Extent = geoDataset.Extent;

deGeoDataset.SpatialReference = geoDataset.SpatialReference;

IDataElement dataElement = (IDataElement)deNetworkDataset;  // Specify the name of the network dataset.

dataElement.Name = Functions.g_ROAD + "_ND";

//删除已存在的dataset,否则再创建会报错

IEnumDataset enumFeatureDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);

enumFeatureDataset.Reset();

IDataset featureDataset2 = null;

IEnumDataset enumDataset = null;

while ((featureDataset2 = enumFeatureDataset.Next()) != null)

{

enumDataset = featureDataset.Subsets;

enumDataset.Reset();

IDataset dataset = null;

while ((dataset = enumDataset.Next()) != null)

{

if (dataset is INetworkDataset && dataset.Name == dataElement.Name && dataset.CanDelete())

{

dataset.Delete();

break;

}

}

}

// Specify the network dataset's elevation model.

deNetworkDataset.ElevationModel = esriNetworkElevationModel.esriNEMNone;

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

INetworkSource edgeNetworkSource = new EdgeFeatureSourceClass();

edgeNetworkSource.Name = Functions.g_ROAD;

edgeNetworkSource.ElementType = esriNetworkElementType.esriNETEdge;

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

IEdgeFeatureSource edgeFeatureSource = (IEdgeFeatureSource)edgeNetworkSource;

edgeFeatureSource.UsesSubtypes = false;

edgeFeatureSource.ClassConnectivityGroup = 1;

edgeFeatureSource.ClassConnectivityPolicy = esriNetworkEdgeConnectivityPolicy.esriNECPEndVertex;

IArray sourceArray = new ArrayClass();

sourceArray.Add(edgeNetworkSource);

deNetworkDataset.Sources = sourceArray;

IArray attributeArray = new ArrayClass();

IEvaluatedNetworkAttribute evalNetAttr;

INetworkAttribute2 netAttr2;

INetworkFieldEvaluator netFieldEval;

INetworkConstantEvaluator netConstEval;

// Create an EvaluatedNetworkAttribute object and populate its settings.

evalNetAttr = new EvaluatedNetworkAttributeClass();

netAttr2 = (INetworkAttribute2)evalNetAttr;

netAttr2.Name = "Time";

netAttr2.UsageType = esriNetworkAttributeUsageType.esriNAUTCost;

netAttr2.DataType = esriNetworkAttributeDataType.esriNADTDouble;

netAttr2.Units = esriNetworkAttributeUnits.esriNAUSeconds;

netAttr2.UseByDefault = false;

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

netFieldEval = new NetworkFieldEvaluatorClass();

netFieldEval.SetExpression("a", "aaaaaaaaaa"); //Shape_Length

evalNetAttr.set_Evaluator(edgeNetworkSource, esriNetworkEdgeDirection.esriNEDAlongDigitized, (INetworkEvaluator)netFieldEval);

netFieldEval = new NetworkFieldEvaluatorClass();

netFieldEval.SetExpression("a", "aaaaaaaaaaaaaa");

evalNetAttr.set_Evaluator(edgeNetworkSource, esriNetworkEdgeDirection.esriNEDAgainstDigitized, (INetworkEvaluator)netFieldEval);

netConstEval = new NetworkConstantEvaluatorClass();

netConstEval.ConstantValue = false;

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;

// 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);

log.WriteLog("NetWorkDataset创建完成,Building Network...");

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

INetworkBuild networkBuild = (INetworkBuild)networkDataset;

networkBuild.BuildNetwork(geoDataset.Extent);

log.WriteLog("BuildNetwork完成!");

return networkDataset;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: