AE數據加載

1、 數據加載問題:



任何系統都離不開數據的加載,下邊就AE中幾種常用的數據加載做一個列舉。以便查閱:





1、加載個人數據庫



個人數據庫是保存在Access中的數據庫。其加載方式有兩種:通過名字和通過屬性加載(也許不只這兩種,AE中實現同一功能可以有多種方式)。





A、通過設置屬性加載個人數據庫。



首先通過IPropertySet接口定義要連接數據庫的一些相關屬性,在個人數據庫中爲數據庫的路徑,例如:





IPropertySet  Propset = new PropertySetClass(); 



         Propset.SetProperty("DATABASE",@"D:/test/Ao/data/sh/MapData.mdb" );



     當定義完屬性並設置屬性後就可以進行打開數據庫的操作了,在ArcEngine開發中存在IWorkspaceFactory、IFeatureWorkspace、IFeatureClass、IFeatureLayer等幾個常用的用於打開和操作數據空間地物的接口。IWorkspaceFactory是一個用於創建和打開工作空間的接口,它是一個抽象的接口,我們在具體應用時要用對應的工作空間實例化它,如下:



IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass ();



如果我們打開的是SDE數據庫就要用SdeWorkspaceFactoryClass實例化Fact。當我們完成了工作空間的實例化後就可以根據上邊設置的屬性打開對應的Access數據庫了。打開方式如下:





         IFeatureWorkspace Workspace = Fact.Open(Propset,0) as IFeatureWorkspace;



打開Access工作空間後接下來的事情是做什麼了,很簡單,找到對應的地物類,賦給相應的層,通過MapControl控件添加對應的層,然後刷新地圖。以下爲添加某一層的代碼:





        IFeatureClass Fcls = Workspace.OpenFeatureClass("District");



       IFeatureLayer Fly = new FeatureLayerClass();



       Fly.FeatureClass = Fcls;



       MapCtr.Map.AddLayer (Fly);



MapCtr.ActiveView.Refresh();



其中District爲地物類的名字,MapCtr爲AE中MapControl的對象。上邊的通過屬性設置加載數據空間的方式還可以用於SDE數據庫,在SDE數據庫加載時會介紹。





以下爲通過設置屬性加載Access數據庫的完整C#代碼:





public void AddAccessDBByPro()



{



IPropertySet  Propset = new PropertySetClass(); 



       Propset.SetProperty("DATABASE",@"D:/test/Ao/data/sh/MapData.mdb" );






IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass ();



       IFeatureWorkspace Workspace = Fact.Open(Propset,0) as IFeatureWorkspace;



         



IFeatureClass Fcls = Workspace.OpenFeatureClass ("District");



       IFeatureLayer Fly = new FeatureLayerClass();



       Fly.FeatureClass = Fcls;



 



       MapCtr.Map.AddLayer(Fly);



MapCtr.ActiveView.Refresh();



}



B、通過數據庫名字加載個人數據庫





在這我先把完整的代碼寫出來,讓您先跟上邊的代碼做個對比。以下爲完整的代碼:





public void AddAccessDBByName()



{



  IWorkspaceName  pWorkspaceName = new WorkspaceNameClass() ;



pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.AccessWorkspaceFactory";



  pWorkspaceName.PathName = @"D:/test/Ao/data/sh/MapData.mdb";






  IName n = pWorkspaceName as IName ;



  IFeatureWorkspace Workspace = n.Open() as IFeatureWorkspace;



                                                             



  IFeatureClass Fcls = Workspace.OpenFeatureClass ("District");



  IFeatureLayer Fly = new FeatureLayerClass();



  Fly.FeatureClass = Fcls;






  MapCtr.Map.AddLayer (Fly);



  MapCtr.ActiveView.Refresh();



}



細心的人已經注意到,打開Access工作空間後接下來的代碼是一樣的,都是找到對應的地物類,賦給相應的層,通過MapControl控件添加對應的層,然後刷新地圖。現在講解一下上邊的代碼,首先是創建一個個人數據庫工作空間名,在指定工作空間名的ProgID,以確定打開的是什麼類型的工作空間,例如在打開Access個人數據庫時使用的是下邊的代碼:





IWorkspaceName  pWorkspaceName = new WorkspaceNameClass() ;



pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.AccessWorkspaceFactory";



pWorkspaceName.PathName = @"D:/test/Ao/data/sh/MapData.mdb";



屬性WorkspaceFactoryProgID可以確保工作空間是AccessWorkspaceFactory,即個人數據庫,同時指定要打開數據庫的路徑。爲了打開數據庫,我們通過AE的類圖可以發現打開工作空間必須使用IName接口(個人認爲,不一定正確,可以思考一下看有其他辦法沒有),所以接着定義IName對象,並把工作空間名轉換成IName類型並賦值給IName對象,然後通過IName對象的Open()方法打開相應的工作空間,代碼如下:



IName n = pWorkspaceName as IName ;



IFeatureWorkspace Workspace = n.Open () as IFeatureWorkspace;



接下來的事情就是上邊提到。



2、加載SDE數據庫



什麼是SDE數據庫?這個問題要詳細地講解將花費大量的時間,但我可以告訴你SDE數據數據庫可以是任何關係數據庫。ESRI公司爲了使空間數據能保存在關係數據庫中,並且能很好的查詢相關的空間屬性而開發的一箇中間件,使用SDE能很好的將空間數據保存在關係數據庫中。如Orcale SQL Server 等。SDE具體細節的瞭解請查找相關的資料,這裏只介紹怎麼連接SDE數據庫。SDE數據庫的聯機分爲直接連接和通過SDE連接。當服務器的性能比較好的時候可以採用SDE連接,否則採用直接連接,這樣可以減輕服務器的任務。建議採用直接連接,其實,SDE連接方式和直接連接的方式只是一個屬性參數設置的問題。跟個人數據庫採用屬性連接的方式一樣,先定義一個屬性對象,然後設置屬性參數,接着定義一個工作空間並用SdeWorkspaceFactoryClass()實例化它,接着加在加載圖層,至於加載圖層的代碼,與加載個人數據庫中圖層的方法一樣,其實不只加載這兩種數據類型,加載其他類型的數據時也是採用相同的方法加載圖層,只是工作空間採用不同的實例而已,下邊爲完整的對嗎”//”後的爲注析:





public void AddSDELayer(bool ChkSdeLinkModle)



{



     //定義一個屬性



IPropertySet  Propset = new PropertySetClass(); 



         if (ChkSdeLinkModle==true) // 採用SDE連接



         { 



            //設置數據庫服務器名



           Propset.SetProperty ("SERVER", "zhpzh");



            //設置SDE的端口,這是安裝時指定的,默認安裝時"port:5151"



           Propset.SetProperty ("INSTANCE", "port:5151");



            //SDE的用戶名



           Propset.SetProperty ("USER", "sa");



            //密碼



           Propset.SetProperty ("PASSWORD", "sa");



//設置數據庫的名字,只有SQL Server  Informix 數據庫才需要設置



           Propset.SetProperty ("DATABASE", "sde");



//SDE的版本,在這爲默認版本



           Propset.SetProperty ("VERSION", "SDE.DEFAULT");



          }



         else // 直接連接



         {



           //設置數據庫服務器名,如果是本機可以用"sde:sqlserver:."



           Propset.SetProperty ("INSTANCE", "sde:sqlserver:zhpzh");



            //SDE的用戶名



           Propset.SetProperty ("USER", "sa");



            //密碼



           Propset.SetProperty ("PASSWORD", "sa");



//設置數據庫的名字,只有SQL Server  Informix 數據庫才需要設置             Propset.SetProperty ("DATABASE", "sde");



//SDE的版本,在這爲默認版本



           Propset.SetProperty ("VERSION", "SDE.DEFAULT");



          }



        //定義一個工作空間,並實力化爲SDE的工作空間



       IWorkspaceFactory Fact = new SdeWorkspaceFactoryClass();



       //打開SDE工作空間,並轉化爲地物工作空間



IFeatureWorkspace Workspace = (IFeatureWorkspace )Fact.Open(Propset,0);



/*定義一個地物類,並打開SDE中的管點地物類,寫的時候一定要寫全.如SDE中有一個管點層,你不能寫成IFeatureClass Fcls = Workspace.OpenFeatureClass ("管點");這樣,一定要寫成下邊的樣子.*/



       IFeatureClass Fcls = Workspace.OpenFeatureClass ("sde.dbo.管點");



           



       IFeatureLayer Fly = new FeatureLayerClass ();



       Fly.FeatureClass = Fcls;



       MapCtr.Map.AddLayer (Fly);



       MapCtr.ActiveView.Refresh ();



    }



不知道注意到了沒有,直接連接跟SDE連接的最大的不同是直接連接不要設置端口,同時他們的參數設置也不一樣,好好注意參數的設置。

3、加載CAD圖層

CAD圖層的加載可以分爲:分圖層加載和整幅圖加載





A、 分圖層加載





我們可以把CAD圖分爲點線面標註加載到MapControl中,跟加載其他數據一樣,首先要定義一個工作空間,並用CadWorkspaceFactoryClass()實例化它,當得到了工作空間後就可以打開相應的工作空間,然後再打開指定的層類型。下邊爲完整的代碼:





   public void AddCADByLayer()
    {



     //定義工作空間,並用CadWorkspaceFactoryClass()實例化它



   IWorkspaceFactory Fact = new CadWorkspaceFactoryClass();



   //打開相應的工作空間,並賦值給要素空間,OpenFromFile()



   //中的參數爲CAD文件夾的路徑



IFeatureWorkspace Workspace = Fact.OpenFromFile(@"I:/test/",0) as IFeatureWorkspace;



     



      /*打開線要素類,如果要打開點類型的要素,需要把下邊的代碼該成:



   IFeatureClass Fcls = Workspace.OpenFeatureClass ("modle.dwg:point");



由此可見modle.dwg爲CAD圖的名字,後邊加上要打開的要素類的類型,中間用冒號  隔開,大家可以想想多邊形和標註是怎麼打開的。 */



    IFeatureClass Fcls = Workspace.OpenFeatureClass ("modle.dwg:polyline");



           



      IFeatureLayer Fly = new FeatureLayerClass ();



      Fly.FeatureClass = Fcls;



MapCtr.Map.AddLayer (Fly);



      MapCtr.ActiveView.Refresh ();



}



B、 整幅CAD圖的加載





當我們要加載整幅CAD圖時,需要使用下邊的代碼,這跟加載地物類有一定的區別,詳細地介紹請看代碼中的注析:











public void AddWholeCAD()
{



      /*下邊的兩行代碼是定義一個CAD工作空間,然後打開它,但這次不是賦值給



    IFeatureWorkspace對象,而是賦值給IWorkspace定義的對象*/



IWorkspaceFactory Fact = new CadWorkspaceFactoryClass();



       IWorkspace Workspace = Fact.OpenFromFile(@"I:/test/",0);



    



    //定義一個CAD畫圖空間,並把上邊打開的工作空間賦給它



       ICadDrawingWorkspace dw =  Workspace as ICadDrawingWorkspace;



    //定義一個CAD的畫圖數據集,並且打開上邊指定的工作空間中一幅CAD圖



    //然後賦值給CAD數據集



       ICadDrawingDataset ds = dw.OpenCadDrawingDataset ("modle.DWG");



    //通過ICadLayer類,把上邊得到的CAD數據局賦值給ICadLayer類對象的



    //CadDrawingDataset屬性



       ICadLayer CadLayer = new  CadLayerClass();



       CadLayer.CadDrawingDataset = ds;



        //利用MapControl加載CAD層



       MapCtr.Map.AddLayer (CadLayer);



   MapCtr.ActiveView.Refresh ();



}



通過上邊的代碼和相關的解析,大家可能對整幅CAD圖的加載有一個瞭解,但要具體搞清楚它的含義,也不那麼容易。這留給大家去慢慢體會,在這我談談我自己的體會,但不一定正確。要打開數據集,首先要打開它的工作空間,至於什麼是工作空間,我也說不太明白,但我的理解是,如果數據是保存在文件中的,工作空間大概就是它對應的文件夾,如果是數據庫中的數據,我想大概就是對應的數據庫。打開數據空間後,在這因爲是整幅CAD圖加載,所以跟以前的有點不同,這也就是相當整個CAD圖就是一個數據集,所以要轉到CAD畫圖的工作空間,然後把CAD圖作爲CAD數據集打開。爲了在MapControl中加載CAD層,必須使用ICadLayer控件的對象,因爲MapCtr.Map.AddLayer ()方法中只能是ICadLayer的對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章