【AO筆記】有關使用AO基於shp文件創建網絡數據集的一個細節
前些日子,和群友交流時提及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的錯誤。
參考資料:
[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
【AO筆記】有關使用AO基於shp文件創建網絡數據集的一個細節