1. 程式人生 > >【AO筆記】有關使用AO基於shp文件創建網絡數據集的一個細節

【AO筆記】有關使用AO基於shp文件創建網絡數據集的一個細節

style manager 博客 target 類庫 dataset IT pac red

前些日子,和群友交流時提及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文件創建網絡數據集的一個細節