前些日子,和群友交流时提及shp文件创建单一网络数据集的创建问题。
由于项目需求,用shp文件创建网络合适,所以不得不去找一些古老的代码资料...
以前的研究中,创建网络数据集是根据IDatasetContainer2.CreateDataset()方法创建的,参数是一个IDEDataset对象,返回一个IDataset引用。
IDatasetContainer2可以根据IFeatureDataset接口(若为地理数据库要素数据集创建网络)或IWorkspace接口(若为shp文件创建单一网络)转换而来。
读取shp文件,转换接口为IFeatureClass后,将IFeatureClass as IDataset,利用IDataset的Workspace接口访问其工作空间IWorkspace
将IWorkspace as IWorkspaceExtensionManager,使用其FindExtension()方法获取IWorkspaceExtension
将IWorkspaceExtension as IDatasetContaner2即可。
读取要素数据集IFeatureDataset后,IFeatureDataset as IFeatureDatasetExtensionContainer,利用其FindExtension()方法获取IFeatureDatasetExtension将IFeatureDatasetExtension as IDatasetContainer2即可。
但是,总是会在IDatasetContainer2.CreateDataset()方法处报错。
究其原因,是IDEDataset的子接口引用IDENetworkDataset的一个设置有误。
IDENetworkDataset是掌管网络数据集的数据组织的接口,是数据元素网络数据集的具体描述。
其升级接口是IDENetworkDataset2。
它继承自IDEDataset。
实例化一个数据元素网络数据集类只需:
IDENetworkDataset deNetworkDataset = new DENetworkDatasetClass();属于ESRI.ArcGIS.Geodatabase类库。
如何设置IDENetworkDataset接口下的各种属性,参考我网络分析系列博客。
在桌面Catalog窗口创建网络数据集时,大家都知道有一步是设置点线等数据源的高程信息:
关键就在这里。
直接给出结论:
- 若用代码创建shp文件的网络数据集,且对高程无需求(即选择无),必须对IDENetworkDataset2.ElevationModel设置为None;
- 若用代码创建地理数据库中要素数据集的网络数据集,且对高程无需求(即选择无),默认IDENetworkDataset2.ElevationModel就是None,无需设置;
代码即:
// 假如shp创建单一网络
// 并且需求中无需指定网络数据集的高程信息
// 则必须如下设置
IDENetworkDataset2 deNetworkDataset2 = deNetworkDataset as IDENetworkDataset2;
deNetworkDataset2.ElevationModel = esriNetworkElevationModel.esriNEMNone;
否则会报0x8004228E的错误。
ps:有可能是破解版的问题,等正版用户测试。
参考资料:
[1]. AE网络分析; http://jhlong12345.blog.163.com/blog/static/12306312920134811529595/
[2]. How to create a shapefile-based network dataset(使用AO 9.3); http://resources.esri.com/help/9.3/arcgisengine/dotnet/06443414-d0a7-455d-a199-dfd49aca7d98.htm