小秋的家

          home

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            1 Posts :: 91 Stories :: 17 Comments :: 0 Trackbacks
          數據編輯問題 AE中數據的編輯是一個重點,也是一個難點。它包括的東西非常多,如:地物的添加,地物的修改,地物查詢,節點捕捉,地物的符號化等一系列的問題。熟練的使用地物編輯的功能,是開發一個系統必須具備的條件。數據編輯問題解決得好壞直接決定著軟件是否操作方便。在這我只是寫一些相應的功能函數,至于軟件開發中的架構,我不考慮。


          1、 添加地物
          什么是地物,這是 GIS的基本概念,我在這不想多說,我只想說明一點,地物可以表現在地圖上,如房子、鐵路、水管等等。我們把房子的總稱稱為一個地物類,在AE中對應一個地物類(IFeatureClass),一個地物類在地圖上表示為一個地物層(IFeatureLayer),單獨的一棟房子或一條管道我們稱為地物(IFeature),Arcgis中一類地物只能放在一個層,通過圖層的疊加組成一幅地圖。


          熟悉面向對象的編程語言的人都知道,其實上邊的地物類,地物的概念就是類和實體的概念。房子、鐵路、水管等是一類地物的抽象,而具體的某一房子就是對象了。大家了解了這一點。接下來的開發就容易理解一些了。當然,還有一些其他的概念也必須了解一下:如長事務、短事務、編輯空間等。請大家查找一些相關資料,了解這方面的內容。


          我們先開始最基本的編輯功能:添加點線面的操作。它包括輸入添加點線面和通過鼠標拖動添加點線面。下邊討論一下添加點線面的基本的實現方法:


          一、添加點
          我們可以有多種方法添加點,但基本的思路一樣,只是有少量的接口有變化。下邊是通過FeatrueClassCreateFeature()函數添加地物。


          public void AddPointByStore() 
                { 
                        //得到要添加地物的圖層 
                        IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer; 

                        //定義一個地物類,把要編輯的圖層轉化為定義的地物類 

                        IFeatureClass fc = l.FeatureClass ; 

                       //先定義一個編輯的工作空間,然后把轉化為數據集,最后轉化為編輯工作空間, 

                        IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit; 

                        IFeature f ; 

                        IPoint p; 

                        //開始事務操作 

                        w.StartEditing (false); 

                        //開始編輯 

                        w.StartEditOperation() ; 

                        for (int i = 0 ; i< 100 ; i++ ) 
                        { 
                             //創建一個地物 
                             f= fc.CreateFeature(); 

                             p = new PointClass(); 

                             //設置點的坐標 

                             p.PutCoords (i,i); 

                             //確定圖形類型 

                             f.Shape = p; 

                             //保存地物 

                             f.Store();     

                        } 

                        //結束編輯 

                        w.StopEditOperation(); 

                        //結束事務操作 

                        w.StopEditing(true);
          }


          上邊的代碼能添加點地物,但不能作為最終的代碼使用,細心的人會看到。這段代碼只是把第一層加進來,然后在第一層上邊添加點地物,如果第一層不是點層,該怎么辦,那就要判斷了。怎么判斷我們以后再說。通過上邊的代碼,我們已經清楚地了解到,編輯地物的基本框架,這也是我們所說的事務,如果想操作能返回和重做,就必須把代碼寫在IWorkspaceEditStartEditing()StopEditing()函數之間,把相關的操作寫在IWorkspaceEditStartEditOperation()StopEditOperation()之間。并且操作是利用IWorkspaceEdit接口完成的,所以要仔細理會IWorkspaceEdit接口的用處,如何工作空間都可以轉化為IWorkspaceEdit的對象,當轉化為IWorkspaceEdit定義的對象后,我們定義一個IFeature的對象,然后利用IFeatureClassCreateFeature()函數創建一個地物,并賦值給定義的IFeature對象。接著設置IFeature對象的一些屬性,如:坐標值,坐標系,地物類型等,最后是調用IFeature對象的Store()保存添加的地物。


          上邊的方法可以添加點地物,接著看看下邊的代碼。看有什么不同:


          public void AddPointByWrite()


               {


                   IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer;


                   IFeatureClass fc = l.FeatureClass ;


                   IFeatureClassWrite fr = fc as IFeatureClassWrite ;


                   IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit;


                   IFeature f ;  


                   IPoint p;


                   w.StartEditing (true);


                   w.StartEditOperation() ;


                   for (int i = 0 ; i< 100 ; i++ )


                   {


                        f= fc.CreateFeature();


                        p = new PointClass();


                        p.PutCoords (i,i);


                        f.Shape = p;


                        fr.WriteFeature (f);


                   }


                        w.StopEditOperation();


                        w.StopEditing(true);


               }


          代碼中用紅色標記的兩行就是不同的代碼,其實他就是保存方式的不同而已。在這利用了IFeatureClassWrite 接口來保存數據。再看看下邊的代碼:


                   public void AddPointByBuffer()


                   {


                        IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer;


                        IFeatureClass fc = l.FeatureClass ;


                        IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit;


                        w.StartEditing (true);


                        w.StartEditOperation() ;


                        IPoint p;


                        IFeatureBuffer f;


                        IFeatureCursor cur = fc.Insert(true);


                        for (int i = 0 ; i< 100 ; i++ )


                        {


                             f= fc.CreateFeatureBuffer();


                             p = new PointClass();


                             p.PutCoords (i,i);


                             f.Shape = p;


                             cur.InsertFeature (f);


                        }


                        w.StopEditOperation();


                        w.StopEditing(true);


               }
          其實不同的地方就兩句代碼,紅色表示的。在這沒有再定義地物接口了(IFeature),而是使用IFeatureBuffer 接口,保存的時候是使用InsertFeature()保存,這對大數據量處理的非常有好處。他是先把要添加的保存到緩沖區里。最后一次性保存。
          二、添加線
          添加線的方法跟添加點一樣,不同的只是地物類型不一樣而已,我把代碼貼出來,大家跟添加點的方式進行對比。這樣便于記憶。也有利于理解。


               public void AddLineByWrite()


               {


                   IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer;


                   IFeatureClass fc = l.FeatureClass ;


                   IFeatureClassWrite fr = fc as IFeatureClassWrite ;


                   IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit;


                   IFeature f ;  


          //可選參數的設置


          object Missing = Type.Missing;


                   IPoint p=new PointClass();


                   w.StartEditing (true);


                   w.StartEditOperation() ;


                   for (int i = 0 ; i< 100 ; i++ )


                   {


                        f = fc.CreateFeature();


                        //定義一個多義線對象


                        IPolyline PlyLine=new PolylineClass();


                        //定義一個點的集合


                        IPointCollection ptclo = PlyLine as IPointCollection;


                        //定義一系列要添加到多義線上的點對象,并賦初始值


                        for(int j=0;j<4;j++)


                        {  


                             p.PutCoords(j,j);


                             ptclo.AddPoint(p,ref Missing,ref Missing);


                        }


                             f.Shape = PlyLine;


                             fr.WriteFeature (f);


                   }


                        w.StopEditOperation();


                        w.StopEditing(true);


          }


          至于添加線的其他兩種方法,通過修改添加點的代碼,就可以得到。可以自己想想然后測試,這樣便于記憶和理解。
          posted on 2008-12-18 12:41 棋劍小秋 閱讀(353) 評論(0)  編輯  收藏 所屬分類: GIS
          主站蜘蛛池模板: 北碚区| 宁明县| 南召县| 庆元县| 宁化县| 晋宁县| 荥阳市| 武乡县| 汉川市| 泸水县| 论坛| 汾阳市| 吉首市| 贵南县| 江西省| 民县| 巴彦淖尔市| 墨竹工卡县| 抚顺市| 汉沽区| 乐安县| 徐汇区| 白山市| 中西区| 苗栗市| 万宁市| 泰州市| 托克逊县| 六枝特区| 许昌县| 石景山区| 马龙县| 石楼县| 醴陵市| 井冈山市| 固原市| 娄烦县| 安平县| 樟树市| 衢州市| 平原县|