1. 程式人生 > >ArcEngine版本管理(Version)項目總結

ArcEngine版本管理(Version)項目總結

ext 工作空間 提交數據 his ccf 接管 方法 font gis

需求:

在ArcGIS項目中,大型的數據庫都是使用ArcSDE進行連接管理。使用的數據版本(Version)都是默認版本(sde.default)。這樣多個人員在編輯的過程中就直接編輯的是默認版本數據。只要能夠連接數據庫就可以對默認版本進行隨意的更改。一旦編輯保存到數據庫之後就無法更改,除非有數據庫備份,使數據編輯變得不靈活。

解決方案:

ArcGIS是有數據版本就出來了。數據庫版本可以以默認版本(sde.default)為模板,創建多個子版本(Version)。然後用戶編輯子版本的時候對父版本沒有任何的影響。當數據編輯完後,確認數據編輯沒有問題就可以將數據提交到默認版本(sde.default)。

環境:WIN10+ArcEngine10.1+ArcMap 10.1

資源:

ArcGIS Engine開發的ArcGIS 版本管理的功能

ArcGIS幫助文檔-使用版本化數據

資源上面說的很清楚了,我就不重復了,說說開發中遇到的坑吧

1、創建版本(Version)所需權限

創建版本的時候需要GeodatabaseGDB的權限,如果沒有在調用CreateVersoin方法的時候會出現如下錯誤:The application is not licensed to perform this operation

技術分享

這個時候需要在LicenseControl控件勾選如下許可:

技術分享

或者在代碼許可註冊的地方寫成如下許可:

 bool b = m_AOLicenseInitializer.InitializeApplication(
           new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB },
           new esriLicenseExtensionCode[]  
                {  
                    esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst,
                    esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst
                });

PS:

許可註冊的時候只能註冊一次,第二次無效。所以要確保第一次註冊的許可能夠創建版本。

2、子版本(Version)數據提交

在提交數據的時候,需要使用ArcEngine的IEngineEditor接口打開編輯,在調用StartEditing方法時需要傳如工作空間(IWorkspace)和地圖對象(IMap)。這裏的工作空間需要和當前地圖版本的工作空間統一(不同版本也存在各自的工作空間),否則調用StartEditing方法時會報錯。所以在提交版本數據的時候需要將地圖中的數據版本切換到當前提交的版本。

提交版本時需要調用Reconcile4方法進行沖突驗證,否側調用CanPost為false。驗證沖突後如過有沖突需要馬上解決,否則系統會自動解決沖突。

3、子版本數據編輯

如果使用ArcEngine開發的代碼進行數據編輯,在編輯的時候需要調用IWorkspaceEdit的StartOperation方法,編輯結束後調用StopOperation方法。如果不調用該方法,編輯的數據會自動保存到父版本。

4、註冊數據

編輯數據的時候需要註冊數據,否則無法編輯數據,註冊方法如下:

技術分享

點擊後會出現如下對話框,該對話框中的復選框比較重要:

技術分享

"是否將該註冊的圖層編輯的基表內容進行同步"

因為新增版本相當於在數據庫中插入了一條記錄,用於該版本數據編輯時做記錄。基表指的是父版本,如果勾選了,如果編輯了父版本的內容,當提交該版本的時候,父版本的其它子版本的父版本數據也會隨之改變。這樣造成沖突的情況就很很少。

如果不勾選,子版本提交的內容不會對其他子版本有任何影響,所以建議不勾選。

這裏會產生疑問:如果兩個字版本都編輯了父版本的相同內容。他們依次提交不會產生沖突麽。

如果在註冊數據的時候勾選了復選框,就不會產生沖突。因為一個子版本提交後。另一個的子版本的父版本數據也隨之同步。這樣就不會產生沖突。如果不勾選,就會產生沖突,這個時候就可以使用ArcGIS的沖突解決機制了。

ArcEngine版本管理(Version)項目總結