導航:首頁 > 編程語言 > ae開發空間分析代碼

ae開發空間分析代碼

發布時間:2025-07-14 20:14:36

Ⅰ 如何編輯SDE數據

1. 打開 SDE 數據。 SDE 數據一定要使用工作空間工廠去初始化工作空間,在工作空間打開 FeatureClass,這是 最常規的操作。下面通過一段 C#代碼連接 SDE,打開並返回一個 IWorkspace。 public IWorkspace FindWsByDefault() { IPropertySet propSet = new PropertySetClass(); propSet.SetProperty("Server", Lan); propSet.SetProperty("Instance", yangyang); propSet.SetProperty("Database", ""); propSet.SetProperty("User", user); propSet.SetProperty("Password", pwd); propSet.SetProperty("Version", version); IWorkspaceFactory factory = new SdeWorkspaceFactoryClass(); IWorkspace workspace = factory.Open(propSet, 0); return workspace; } 通過上述代碼打開了 SDE 的工作空間,接下來要做的就是獲取要編輯的 FeatureClass。寫一 個函數,通過 FeatureClass 的別名和所在的 Dataset 返回 FeatureClass。做法是先遍歷所有的 DataSet, 找到符合要求的 Dataset 之後遍歷裡面的要素, 返回與參與別名一致的 FeatureClass (順便說一下,FeatureClass 在沒有指定別名的時候默認與 FeatureClass 名稱相同) //查找指定要素 public IFeatureClass FindClassByName(IWorkspace ws, string className, string dsName) { IEnumDataset enumDs; if (dsName != "") { enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureDataset); IFeatureDataset featureDs = enumDs.Next() as IFeatureDataset; while (featureDs != null) { if (featureDs.Name == dsName) { return GetFcFromDataset(featureDs, className); } featureDs = enumDs.Next() as IFeatureDataset; } } else { enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureClass); return GetFcFromEnumDataset(enumDs,className); } return null; } //在數據集中查找要素類 private IFeatureClass GetFcFromDataset(IFeatureDataset featDs, string className) { IFeatureClass featClass; IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer; for (int i = 0; i < fcContainer.ClassCount; i++) { featClass = fcContainer.get_Class(i); if (featClass.AliasName == className) { return featClass; } } return null; } //在要素類集合中查找要素類 private IFeatureClass GetFcFromEnumDataset(IEnumDataset enumDs, string className) { IFeatureClass featClass = enumDs.Next() as IFeatureClass; while (featClass != null) { if (featClass.AliasName == className) { return featClass; } featClass = enumDs.Next() as IFeatureClass; } return null; } //通過要素類名和數據集名在指定的工作空間中尋找要素類 public IFeatureClass FindClassByName(string className, string datasetName) { IWorkspace ws = FindWsByDefault(); IFeatureClass featClass = FindClassByName(ws, className, datasetName); return featClass; } 特別需要留意的是最後一個函數 FindClassByName(,,先是打開 SDE 的工作空間,在這 ) 個工作空間返回符合條件的要素集。通過這樣的指向才能對 SDE 的 FeatureClass 進行寫入 和刪除的操作。 可以把上述代碼寫成一個靜態類, 這樣就可以很方便的通過數據集名稱和要 數集別名指向要編輯的 FeatureClass 了。 值得一提的是, 很多新手都沒有養成這種良好的習慣, 就是先打開工作空間再進行數據的編 輯 ,即便是使用 shp 文件或是 MDB 數據。他們習慣性的使用 MapControl 去載入 MXD 文 件,然後在 MapControl 通過 MapControl.get_layer(index)的方法去獲取圖層,然後將其轉為 IFeatureLayer 或是 IFeatureClass 進行操作。 事實上,MXD 已經不用開發者寫一句載入圖層的代碼就完成了對圖層的載入,確實比較方 便。 但是它有很多看不見的操作沒有表現出來, 載入完數據之後就把工作空間給自動關閉了。 對於 shp 文件和 MDB 數據,通過讀取地圖控制項的圖層是可以直接達到寫入的目的,但一旦 有用戶進行操作該圖層文件就會被鎖死,這就是不支持版本技術的表現。而 SDE 數據由於 存在版本(原理不多說了) ,因此有需要去確保數據的安全性和一致性,必須使用工作空間 的形式去打開。如果用讀取 MapControl 圖層的方法去獲取 FeatureClass,實際上獲取的是一 個沒有打開的編輯操作的 FeatureClass,在 ESRI 的幫助文檔裡面我們不難發現它是只讀的, 就像在 ArcMap 裡面沒有用 Editor 執行 startEdit 一樣。 2. 編輯 SDE 數據 利用上述的方法獲取了 FeatureClass 後就可以用常規的方式對其進行編輯,如 delete()和 CreateFeature(),或是更改屬性值。但是仍然會出現無法編輯數據的現象,這種現象通常提 示沒有足夠的授權去編輯數據,這就涉及到 AE 對 SDE 數據編輯的授權,也就是 gdbedite 的授權(主要是在 AE9.2 裡面) 。 關於 GDBEdite 的授權,懶羊羊已經在之前發過一份比較完整的文檔,但還是在這里再歸納 一下。 ArcEngine9.2 在用戶許可上做了很大的改動,應用程序是強制初始化許可,也就是說必須使 用 LicenseControl 或 AO 介面初始化許可, 否則應用程序無法啟動。 Engine9.1 未採取強制初 始化許可策略,而是應用程序創建時就初始化標准 Engine 許可。在一般情況下,我們會用 將 LicenseControl 拖放到主窗體上完成初始化。但當 Engine 程序需要使用 ArcGIS Engine Enterprise Geodatabase(以下簡稱 GDB Update)許可的時候,我們就往往會由於意識不到應 該使用該許可,以及無法正確的初始化該許可而陷入麻煩。 對於許可這東西,首先要學會看軟體產品的購貨單。下表是一份關於 ArcEngine9.2 的購貨 單。 下面對 GDB update 許可進行討論 1. 什麼情況下需要 GDB Update 許可 當需要對 SDE 里數據進行編輯時,以及需要在 SDE 和 Personal Geodatabase 中創建復雜 ArcGIS 對象時,需要使用 GDB Update 許可。 對 SDE 里的數據編輯,很好理解,大致就是進行數據插入,刪除,更新;對表添加、刪除 和修改,表結構的變化(添加、刪除列)等,因為這些動作都會造成後台資料庫的寫操作。 對於 Personal Geodatabase,進行簡單數據對象和編輯,包括創建、刪除和修改普通表都是不 需要 GDB Update 許可的, 但對於復雜的 Geodatabse 對象的創建、 刪除和修改, 則需要 GDB Update 許可,其中復雜的 Geodatabse 對象包括幾何網路,網路分析模型,拓撲,關系類。 這也是為什麼往往有寫好了一個創建幾何網路或拓撲的程序後,執行起來會被報「需要 Geodatabase Update 許可」的錯。 2. 怎樣初始化 GDB Update 許可 當我們意識到需要使用 Engine 的 GDB Update 許可時,怎樣才能將它正確的初始化呢? Engine 給我們提供了兩種初始化許可的方法: 1) 使用 LicenseControl 控制項。將該控制項拖放到主窗體之上,勾選適當的許可,並確保 程序啟動該窗體可載入,就可以完成許可初始化。如下圖: 2) 使用 IAoInitialize.Initialize 方法加入適當的參數進行初始化 下面是 C#的代碼 private IAoInitialize m_AoInitialize = new AoInitializeClass(); private void Form1_Load(object sender, EventArgs e) { m_AoInitialize.Initialize(esriLicenseProctCode.esriLicenseProctCo deEngineGeoDB); } 在窗體載入的時候初始化 GDB 許可。 當然, 對於一個健壯的程序而言, 我們還需要在初始化之前先判斷將被初始化的許可是否可 用,應先使用 IsProctCodeAvailable 方法進行判斷,需要初始化擴展模塊的許可,可使用 CheckOutExtension 方法。

閱讀全文

與ae開發空間分析代碼相關的資料

熱點內容
半條命2有幾個版本 瀏覽:333
電腦管家微信備份文件夾 瀏覽:826
ubuntu文件夾解鎖 瀏覽:34
網站多少錢一單 瀏覽:382
系統鏡像恢復找不到文件 瀏覽:255
進什麼網站 瀏覽:588
修改了配置文件代碼沒有讀出來 瀏覽:749
vss資料庫是什麼 瀏覽:899
奇跡13單機系統找不到指定文件 瀏覽:719
flyme魅藍3以前的版本 瀏覽:318
安卓文件管理哪些文件夾可以刪除 瀏覽:290
安卓車載導航沒有聲音是怎麼回事 瀏覽:810
cjson數組格式 瀏覽:159
vb文件在哪裡 瀏覽:215
工廠里都招什麼編程人員 瀏覽:932
jspsql登錄 瀏覽:981
網路用語粉絲閱讀什麼意思 瀏覽:333
紅頭文件怎麼列印 瀏覽:94
熱血江湖130刺客升級 瀏覽:106
jsp頁面放大鏡技術介紹 瀏覽:101

友情鏈接