二次开发就是搭积木,但是这种积木在AO中可以成为接口,那么我们二次开发就要想实现我们功能的相关接口组合起来,
ArcGIS中有两种网络,无向网络和有向网络,我在这里讨论是无向网络,网络是用来模拟现实世界中的如交通道路等,这也是GIS中的一个精华,ArcGIS中用一组要素对现实世界中的网络进行抽象,比如用线要素来模拟边,用点要素模拟交汇点等,而网络不是要素,是又相关的要素构建而成的“逻辑图“,所有的分析都是在这个逻辑图上进行的,也可以说这个逻辑图是由相互关联的要素结合一定的规则,派生出来的。而在ArcGIS中无向网络可以有shpfile创建也可以由geodatabase中的数据集创建,而有向网络智能由后者。
对ArcMap的熟练程度有助于我们更快速的开发,我们用网络分析的时候,第一步干什么,第二步干什么……也就是这个流程的熟练程度对我们开发是很有帮助的,下面我们用代码来说明下,因为这个代码很长,我只说明原理等
重要接口Inetworkbuild,利用开发帮助也是一种技巧,这种技巧就好比我们遇到问题了Google下。
步骤一 创建网络数据集
IDENetworkDataset deNetworkDataset = new DENetworkDatasetClass();
deNetworkDataset.Buildable = true;
// Open the shapefile and cast to the IGeoDataset interface.
IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();
IWorkspace workspace = workspaceFactory.OpenFromFile(@
"C:\Program Files\ArcGIS\DeveloperKit\SamplesNET\data\CreateNetworkDataset", 0);
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("Streets");
IGeoDataset geoDataset = (IGeoDataset)featureClass;
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 = "Streets_ND";
步骤二:
刚才我们创建了网络,但是并没有和相关的要素关联
网络数据集建立了,我们说过网络数据集中应该包含相互关联的要素,而这种主要体现在边和交汇点这两个之上,同时还有一定的规则,比如道路的联通规则,所以我刚才说了逻辑图是由相互关联的要素结合一定的规则,派生出来的
[C#]
// Create a new EdgeFeatureSource object and point it to the Streets shapefile.
IEdgeFeatureSource streetsEdgeFeatureSource = new EdgeFeatureSourceClass();
INetworkSource streetsNetworkSource = (INetworkSource)streetsEdgeFeatureSource;
streetsNetworkSource.Name = "Streets";
streetsNetworkSource.ElementType = esriNetworkElementType.esriNETEdge;
// Set the connectivity settings for the edge feature source.
streetsEdgeFeatureSource.UsesSubtypes = false;
streetsEdgeFeatureSource.ClassConnectivityGroup = 1;
streetsEdgeFeatureSource.ClassConnectivityPolicy =
esriNetworkEdgeConnectivityPolicy.esriNECPEndVertex;
streetsEdgeFeatureSource.FromElevationFieldName = "F_ZLEV";
streetsEdgeFeatureSource.ToElevationFieldName = "T_ZLEV";
ArcGIS的强大在于他能跟准确的模拟这个显示,通过搞成字段可以区分立交桥
步骤三,方向设置
// Create a StreetNameFields object and populate its settings.
IStreetNameFields streetNameFields = new StreetNameFieldsClass();
streetNameFields.Priority = 1; // Priority 1 indicates the primary street name.
streetNameFields.PrefixDirectionFieldName = "PREFIX";
streetNameFields.PrefixTypeFieldName = "PRE_TYPE";
streetNameFields.StreetNameFieldName = "NAME";
streetNameFields.SuffixTypeFieldName = "TYPE";
streetNameFields.SuffixDirectionFieldName = "SUFFIX";
// Add the StreetNameFields object to a new NetworkSourceDirections object,
// then add it to the EdgeFeatureSource created earlier.
INetworkSourceDirections networkSourceDirections = new NetworkSourceDirectionsClass()
;
IArray streetNameFieldsArray = new ArrayClass();
streetNameFieldsArray.Add(streetNameFields);
networkSourceDirections.StreetNameFields = streetNameFieldsArray;
streetsNetworkSource.NetworkSourceDirections = networkSourceDirections;
// Add the EdgeFeatureSource object to the data element as a source in the network dataset.
IArray sourceArray = new ArrayClass();
sourceArray.Add(streetsEdgeFeatureSource);
deNetworkDataset.Sources = sourceArray;
步骤四,可以有turn,也可以没有
步骤五 网络权重设置
// Create a new EvaluatedNetworkAttribute object and populate its settings.
IEvaluatedNetworkAttribute minutesEvaluatedNetworkAttribute = new
EvaluatedNetworkAttributeClass();
INetworkAttribute2 minutesNetworkAttribute2 = (INetworkAttribute2)
minutesEvaluatedNetworkAttribute;
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 minutesFTNetworkFieldEvaluator = new
NetworkFieldEvaluatorClass();
minutesFTNetworkFieldEvaluator.SetExpression("[FT_Minutes]", "");
INetworkEvaluator minutesFTNetworkEvaluator = (INetworkEvaluator)
minutesFTNetworkFieldEvaluator;
minutesEvaluatedNetworkAttribute.set_Evaluator(streetsNetworkSource,
esriNetworkEdgeDirection.esriNEDAlongDigitized, minutesFTNetworkEvaluator);
INetworkFieldEvaluator minutesTFNetworkFieldEvaluator = new
NetworkFieldEvaluatorClass();
minutesTFNetworkFieldEvaluator.SetExpression("[TF_Minutes]", "");
INetworkEvaluator minutesTFNetworkEvaluator = (INetworkEvaluator)
minutesTFNetworkFieldEvaluator;
minutesEvaluatedNetworkAttribute.set_Evaluator(streetsNetworkSource,
esriNetworkEdgeDirection.esriNEDAgainstDigitized, minutesTFNetworkEvaluator);
INetworkConstantEvaluator minutesNetworkConstantEvaluator = new
NetworkConstantEvaluatorClass();
minutesNetworkConstantEvaluator.ConstantValue = 0;
INetworkEvaluator minutesConstantNetworkEvaluator = (INetworkEvaluator)
minutesNetworkConstantEvaluator;
minutesEvaluatedNetworkAttribute.set_DefaultEvaluator
(esriNetworkElementType.esriNETEdge, minutesConstantNetworkEvaluator);
minutesEvaluatedNetworkAttribute.set_DefaultEvaluator
(esriNetworkElementType.esriNETJunction, minutesConstantNetworkEvaluator);
minutesEvaluatedNetworkAttribute.set_DefaultEvaluator
(esriNetworkElementType.esriNETTurn, minutesConstantNetworkEvaluator);
// Add the attribute to the array.
attributeArray.Add(minutesEvaluatedNetworkAttribute);
步骤六 建立网络
// Create a new UID that references the NetworkDatasetWorkspaceExtension.
UID ndWorkspaceExtensionUID = new UIDClass();
ndWorkspaceExtensionUID.Value = "esriGeoDatabase.NetworkDatasetWorkspaceExtension";
// Get the workspace extension and create the network dataset based on the data element.
IWorkspaceExtensionManager workspaceExtensionManager = (IWorkspaceExtensionManager)
workspace;
IWorkspaceExtension workspaceExtension = workspaceExtensionManager.FindExtension
(ndWorkspaceExtensionUID);
IDatasetContainer2 datasetContainer2 = (IDatasetContainer2)workspaceExtension;
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);