ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集

上节提及如何使用IDatasetContainer2接口访问到网络数据集,上例可以封装为一个方法。

这节就使用IDatasetContainer2接口(Geodatabase类库)的CreateDataset()方法创建网络数据集。

涉及到的接口(全在Geodatabase类库中)

IDatasetContainer2、IDataset、INetworkDataset、IDEDataset、IDENetworkDataset4(重点)

涉及到的枚举类型(全在Geodatabase类库中)

esriDatasetType(本例使用枚举值为esriDTNetworkDataset)

涉及到的类(全在Geodatabase类库中)

DENetworkDataset(实现了IDEDataset、IDENetworkDataset接口)

1. DENetworkDataset类和IDENetworkDataset接口介绍

DENetworkDataset是一个轻量级的对象,保存有关网络数据集的信息(在内存中)。

它可以与更新网络数据集的INetworkBuild接口的UpdateSchema()方法配合使用。

IDENetworkDataset4接口,是IDENetworkDataset的升级版,过程还有2、3两个接口。IDENetworkDataset接口用于访问网络数据集中的某些网络属性,例如道路等级信息。IDENetworkDataset接口与InetworkBuild接口的UpdateSchema方法结合使用,如添加多个网络数据源或网络属性到网络数据集中。这些操作的过程与在Catalog中创建网络数据集的设置过程大体一致。访问网络数据集中的数据元素将使用IDatasetComponent接口及DataElement方法。

IDENetworkDataset接口的属性表如下:

这个接口几乎可以说是创建网络数据集的核心。有了IDENetworkDataset接口,才能在内存中组织网络数据集的各种复杂的数据,它的类DENetworkDataset的实例才是网络数据集的数据本身,而INetworkDataset只是存在于数据库中的数据集。

他们两个接口的关系是:

IDENetworkDataset作为数据元素,被IDatasetContainer2的CreateDataset()方法作用,产生的结果就是INetworkDataset,如下代码:

 1         /// <summary>
 2         /// 根据要素数据集与数据元素网络数据集,创建网络数据集。
 3         /// </summary>
 4         /// <param name="_pFeatureDataset">包含网络数据集的要素数据集</param>
 5         /// <param name="_pDENetDataset">数据元素网络数据集</param>
 6         /// <returns></returns>
 7         public INetworkDataset CreateBuildingDataset(IFeatureDataset _pFeatureDataset, IDENetworkDataset2 _pDENetDataset)
 8         {
 9             IFeatureDatasetExtensionContainer featureDatasetExtensionContainer = (IFeatureDatasetExtensionContainer)_pFeatureDataset;
10             IFeatureDatasetExtension featureDatasetExtension = featureDatasetExtensionContainer.FindExtension(esriDatasetType.esriDTNetworkDataset);
11             IDatasetContainer2 datasetContainer2 = (IDatasetContainer2)featureDatasetExtension;
12             IDEDataset deNetDataset = _pDENetDataset as IDEDataset;
13             //创建网络数据集
14             INetworkDataset networkDataset = (INetworkDataset)datasetContainer2.CreateDataset(deNetDataset);
15             return networkDataset;
16         }

于是,所有的任务就交给了如何创建一个数据元素网络数据集(DENetworkDataset,接口是IDENetworkDataset)。

有关数据元素网络数据集和网络数据集的区别,官方的解释也不是很明确,我个人的理解就是,如果要访问网络数据集中各个元素,就要访问其数据元素网络数据集,网络数据集只不过是后者+构建出来的一些拓扑法则而已。也可能是我翻译水平不够...

下篇文章继续研究INetworkDataset和IDENetworkDataset的各种属性如何设置。

总之,构建网络数据集是一个坑,基于INetworkDataset做NetworkAnalyst又是一个坑。两个坑填完,也就是所谓的AO二次开发之网络分析了。

原文地址:https://www.cnblogs.com/onsummer/p/6994366.html