數據編輯問題 在AE中數據的編輯是一個重點,也是一個難點。它包括的東西非常多,如:地物的添加,地物的修改,地物查詢,節點捕捉,地物的符號化等一系列的問題。熟練的使用地物編輯的功能,是開發一個系統必須具備的條件。數據編輯問題解決得好壞直接決定著軟件是否操作方便。在這我只是寫一些相應的功能函數,至于軟件開發中的架構,我不考慮。
1、 添加地物
什么是地物,這是 GIS的基本概念,我在這不想多說,我只想說明一點,地物可以表現在地圖上,如房子、鐵路、水管等等。我們把房子的總稱稱為一個地物類,在AE中對應一個地物類(IFeatureClass),一個地物類在地圖上表示為一個地物層(IFeatureLayer),單獨的一棟房子或一條管道我們稱為地物(IFeature),Arcgis中一類地物只能放在一個層,通過圖層的疊加組成一幅地圖。
熟悉面向對象的編程語言的人都知道,其實上邊的地物類,地物的概念就是類和實體的概念。房子、鐵路、水管等是一類地物的抽象,而具體的某一房子就是對象了。大家了解了這一點。接下來的開發就容易理解一些了。當然,還有一些其他的概念也必須了解一下:如長事務、短事務、編輯空間等。請大家查找一些相關資料,了解這方面的內容。
我們先開始最基本的編輯功能:添加點線面的操作。它包括輸入添加點線面和通過鼠標拖動添加點線面。下邊討論一下添加點線面的基本的實現方法:
一、添加點
我們可以有多種方法添加點,但基本的思路一樣,只是有少量的接口有變化。下邊是通過FeatrueClass的CreateFeature()函數添加地物。
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);
}
上邊的代碼能添加點地物,但不能作為最終的代碼使用,細心的人會看到。這段代碼只是把第一層加進來,然后在第一層上邊添加點地物,如果第一層不是點層,該怎么辦,那就要判斷了。怎么判斷我們以后再說。通過上邊的代碼,我們已經清楚地了解到,編輯地物的基本框架,這也是我們所說的事務,如果想操作能返回和重做,就必須把代碼寫在IWorkspaceEdit的StartEditing()和StopEditing()函數之間,把相關的操作寫在IWorkspaceEdit的StartEditOperation()和StopEditOperation()之間。并且操作是利用IWorkspaceEdit接口完成的,所以要仔細理會IWorkspaceEdit接口的用處,如何工作空間都可以轉化為IWorkspaceEdit的對象,當轉化為IWorkspaceEdit定義的對象后,我們定義一個IFeature的對象,然后利用IFeatureClass的CreateFeature()函數創建一個地物,并賦值給定義的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);
}
至于添加線的其他兩種方法,通過修改添加點的代碼,就可以得到。可以自己想想然后測試,這樣便于記憶和理解。
什么是地物,這是 GIS
熟悉面向對象的編程語言的人都知道,其實上邊的地物類,地物的概念就是類和實體的概念。房子、鐵路、水管等是一類地物的抽象,而具體的某一房子就是對象了。大家了解了這一點。接下來的開發就容易理解一些了。當然,還有一些其他的概念也必須了解一下:如長事務、短事務、編輯空間等。請大家查找一些相關資料,了解這方面的內容。
我們先開始最基本的編輯功能:添加點線面的操作。它包括輸入添加點線面和通過鼠標拖動添加點線面。下邊討論一下添加點線面的基本的實現方法:
一、
我們可以有多種方法添加點,但基本的思路一樣,只是有少量的接口有變化。下邊是通過FeatrueClass
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);
}
上邊的代碼能添加點地物,但不能作為最終的代碼使用,細心的人會看到。這段代碼只是把第一層加進來,然后在第一層上邊添加點地物,如果第一層不是點層,該怎么辦,那就要判斷了。怎么判斷我們以后再說。通過上邊的代碼,我們已經清楚地了解到,編輯地物的基本框架,這也是我們所說的事務,如果想操作能返回和重做,就必須把代碼寫在IWorkspaceEdit
上邊的方法可以添加點地物,接著看看下邊的代碼。看有什么不同:
public void AddPointByWrite()
{
IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer;
IFeatureClass fc = l.FeatureClass ;
IFeatureClassWrite fr = fc as IFeatureClassWrite ;
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
二、
添加線的方法跟添加點一樣,不同的只是地物類型不一樣而已,我把代碼貼出來,大家跟添加點的方式進行對比。這樣便于記憶。也有利于理解。
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);
}
至于添加線的其他兩種方法,通過修改添加點的代碼,就可以得到。可以自己想想然后測試,這樣便于記憶和理解。