前些日子,和群友交流時提及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