为了创建或打开一个网络数据集,你必须使用NetworkDatasetFDExtension对象(文件地理数据库中的数据集)或NetworkDatasetWorkspaceExtension对象(对于Shp文件组成的网络数据集)。
当你拥有了合适的对象后,就可以使用IDatasetContainer2接口去创建或者打开网络数据集了。
如果当前打开的Map对象中有网络数据集图层,那么就可以通过访问INetworkLayer接口的NetworkDataset字段来访问网络图层中的网络数据集。
IDatasetContainer2接口的CreateDataset方法可以用于创建网络数据集。网络数据集创建完成后应立即用INetworkBuild接口的BuildNetwork方法构建。
网络数据集的NetworkDatasetName对象可以被IDatasetContainer2接口的DatasetNames方法访问。
涉及到的重要接口:
IDatasetContainer2(Geodatabase类库中)、INetworkLayer(Carto类库中)
涉及到的重要类(全部在Geodatabase类库中):
NetworkDatasetFDExtension、NetworkDatasetWorkspaceExtension
NetworkDatasetNameClass
1. 寻找IDatasetContainer2变量(要素数据集、Shp文件、SDC文件)
下面的代码就演示了如何在给定数据库的要素数据集(要素数据集名称为fds)中打开网络数据集。
1 IFeatureDatasetExtensionContainer fdsExtCont = fds as IFeatureDatasetExtensionContainer; //要素数据集身份转化 2 IFeatureDatasetExtension fdsExt = fdsExtCont.FindExtension(esriDTNetworkDataset); //从要素数据集中找到IFeatureDatasetExtension对象 3 IDatasetContainer2 dsCont = fdsExt as IDatasetContainer2; //将IFeatureDatasetExtension对象身份转化为IDatasetContainer2
下面的代码就演示了如何在给定shp文件(shp文件对象的名称为shpWS)中打开网络数据集。
1 IWorkspaceExtensionManager wsExtMgr = shpWS as IWorkspaceExtensionManager; 2 UID myUID = new UIDClass(); 3 myUID.Value = "esriGeoDatabase.NetworkDatasetWorkspaceExtension"; 4 IWorkspaceExtension wsExt = wsExtMgr.FindExtension(myUID); //与上面类似 5 IDatasetContainer2 dsCont = wsExt as IDatasetContainer2; //与上面类似
下面的代码演示了如何从给定的SDC文件中获取网络数据集(SDC文件对象名为sdcWS)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 IWorkspaceExtensionManager wsExtMgr = sdcWS as IWorkspaceExtensionManager; 2 UID myUID = new UIDClass(); 3 myUID.Value = "esriGeoDatabase.NetworkDatasetWorkspaceExtension"; 4 IWorkspaceExtension wsExt = wsExtMgr.FindExtension(myUID); 5 IDatasetContainer2 dsCont = wsExt as IDatasetContainer2;
2. 使用IDatasetContainer2访问网络数据集
一旦获取了用于访问合适的数据源(文件地理数据库或shp文件)的网络数据集扩展对象后,你就可以访问网络数据集了。例如,下面的代码就演示了如何打开名为“Street_ND”的网络数据集。
1 // 上面的IDatasetContainer2变量 dsCont 的方法DatasetByName()找到名为"Street_ND"的网络数据集,返回一个IDataset对象 2 IDataset dataset = dsCont.DatasetByName(esriDTNetworkDataset, "Street_ND"); 3 // 使用INetworkDataset变量 networkDataset 接住IDataset对象(经身份转换为INetworkDataset) 4 INetworkDataset networkDataset = dataset as INetworkDataset;
这样,就拿到了INetworkDataset,有了NetworkDataset(网络数据集),就可以转入NetworkAnalyst类库中的网络分析了。