天天看點

【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視窗建立網絡資料集時,大家都知道有一步是設定點線等資料源的高程資訊:

【AO筆記】有關使用AO基于shp檔案建立網絡資料集的一個細節

關鍵就在這裡。

直接給出結論:

  • 若用代碼建立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

繼續閱讀