C#開發(fā)GIS應(yīng)用簡明教程
1.工具(ToolConstants)
MapX為開發(fā)人員提供一系列的工具,這些工具的作用各有不同,我們通過開發(fā)一個(gè)應(yīng)用程序來了解這些工具的作用,至于這些工具的具體說明,可以在MapX的幫助文檔中,通過查找"Available Standard Tools" 看到相應(yīng)的解釋.一些MapX的相關(guān)資料也有介紹.
在.NET編程環(huán)境中新建一個(gè)C#的WindeosApplication(Windows應(yīng)用程序)項(xiàng)目,然后在菜單中選擇”項(xiàng)目/添加引用”,打開如下圖的窗口,在窗口中選擇COM標(biāo)簽,在組件名稱列表中雙擊MapInfo MapX V5.單擊"確認(rèn)"按鈕,將Map5控件加入到.Net的工具箱中.
接著,將MapInfo MapX V5 控件畫到窗體上,再在窗體上畫一個(gè)ComboBox控件comboBox1.如下圖:
雙擊設(shè)計(jì)窗體,編寫Form1_Load代碼如下:
- private void Form1_Load(object sender, System.EventArgs e)
- {
- ArrayList ToolsList=new ArrayList();
- ToolsList.Add(MapXLib.ToolConstants.miArrowTool);
- ToolsList.Add(MapXLib.ToolConstants.miCenterTool);
- ToolsList.Add(MapXLib.ToolConstants.miLabelTool);
- ToolsList.Add(MapXLib.ToolConstants.miPanTool);
- ToolsList.Add(MapXLib.ToolConstants.miPolygonSelectTool);
- ToolsList.Add(MapXLib.ToolConstants.miRadiusSelectTool);
- ToolsList.Add(MapXLib.ToolConstants.miSymbolTool);
- ToolsList.Add(MapXLib.ToolConstants.miTextTool);
- ToolsList.Add(MapXLib.ToolConstants.miZoomInTool);
- ToolsList.Add(MapXLib.ToolConstants.miZoomOutTool);
- comboBox1.DataSource=ToolsList;
- }
以上代碼通過一個(gè)數(shù)組ToolsList,將MapXLib的工具加入到comboBox1中.MapX還有一些其它的工具,它們的作用是往地圖上加上點(diǎn),線,多邊型和圓.因?yàn)檫@些工具要求有操作圖層,一并在介紹圖層的時(shí)候介紹.關(guān)于ArrayList的用法,請參考C#的有關(guān)資料.
接著,雙擊comboBox1,并編寫代碼如下
- private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
- {
- axMap1.CurrentTool=(MapXLib.ToolConstants)comboBox1.SelectedItem;
- }
應(yīng)注意,在C#中必須要顯式地把comboBox1的選擇項(xiàng)目SelectedItem(數(shù)據(jù)類型為object)轉(zhuǎn)換為MapXLib.ToolConstants.因?yàn)門oolConstants是MapX自己定義的一個(gè)枚舉數(shù)據(jù)類型,C#不能自動(dòng)完成這種枚舉成員變量到object的數(shù)據(jù)轉(zhuǎn)換.
編譯執(zhí)行程序,從comboBox1中選擇不同的工具,在地圖上進(jìn)行操作,你可以了解到MapX工具集的強(qiáng)大功能.
實(shí)際上,MapX提供的工具集就好像Photoshop,AutoCAD的工具欄一樣,為你提供了一些控制地圖的工具.但是,在開發(fā)GIS的時(shí)候,這些工具是不能完全滿足要求的.所以,還應(yīng)該學(xué)會(huì)自定義工具.
下面,通過一個(gè)在地圖上測距的例子,來介紹一下如何在C#下自定義MapX工具
如前所述建立一個(gè)C#的Windows應(yīng)用程序并將Mapinfo MapX V5 控件加到窗體上.并加入一個(gè)Button控件button1.將button1的Text屬性改為"測距",再在窗口中放上兩個(gè)Label控件label1,label2,將它們的Text屬性設(shè)置為""空字符串,如下圖:
雙擊設(shè)計(jì)窗體,編寫Form1_Load代碼如下:
- private void Form1_Load(object sender, System.EventArgs e)
- {
- axMap1.CreateCustomTool(100,MapXLib.ToolTypeConstants.miToolTypePoly,
- MapXLib.CursorConstants.miCrossCursor,null,null,null);
- }
在加載窗口的時(shí)候,我們定義了一個(gè)工具.它的編號(hào)是100(不要和MapX本身的工具編號(hào)重復(fù)),它的類型是一個(gè)多義線,采用十字光標(biāo).
關(guān)于此函數(shù)的用法,建議查看MapX的開發(fā)手冊和相關(guān)資料.
現(xiàn)在我們定義了一個(gè)編號(hào)為100的工具,可以在程序中使用它了.雙擊設(shè)計(jì)窗體中的button1,編寫它的Click事件處理代碼如下:
- private void button1_Click(object sender, System.EventArgs e)
- {
- axMap1.CurrentTool=(MapXLib.ToolConstants)100;
- }
現(xiàn)在編譯運(yùn)行,單擊button1,就可以在地圖上使用這個(gè)工具了.但是還有一部分重要的代碼沒有完成:測距!
完成測距功能的代碼在C#使用MapX開發(fā)GIS中非常具有代表性,也比較有難度.我在首次使用C#+MapX開發(fā)GIS的時(shí)候,被這個(gè)問題困擾了很久.項(xiàng)目經(jīng)理也來研究,過兩天說有結(jié)果了,但他給出的例子根本就行不通.當(dāng)然,會(huì)了就不難了.其實(shí),也很簡單.
首先,在窗口類中聲明兩個(gè)私有全局變量以保存測出的距離和總距,注意聲明代碼的位置:
- public class Form1 : System.Windows.Forms.Form
- {
- private AxMapXLib.AxMap axMap1;
- private System.Windows.Forms.Button button1;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Label label2;
- ///
- /// 必需的設(shè)計(jì)器變量。
- ///
- private System.ComponentModel.Container components = null;
- private double Dis=0,DisSum=0;
- ...
- ...
現(xiàn)在來編寫工具的事件.注意,在MapX畫多義線的時(shí)候,它觸發(fā)消息的方式和一般的工具是不同的,首先,它并不是用鼠標(biāo)一點(diǎn)擊就完成了的,還可以繼續(xù)畫下去,所以,不應(yīng)該在MapX控件的ToolUsed事件中編寫,而應(yīng)該在PolyToolUsed事件中實(shí)現(xiàn)測距.代碼如下:
- private void axMap1_PolyToolUsed(object sender, AxMapXLib.CMapXEvents_PolyToolUsedEvent e)
- {
- MapXLib.PointsClass pts=new MapXLib.PointsClass();
- switch(e.flags)
- {
- case (int)MapXLib.ToolFlagConstants.miToolInProgress:
- pts=(MapXLib.PointsClass)e.points;
- Dis=axMap1.Distance(pts._Item(pts.Count-1).X,
- pts._Item(pts.Count-1).Y,
- pts._Item(pts.Count).X,
- pts._Item(pts.Count).Y);
- DisSum+=Dis;
- break;
- default:
- Dis=0;
- DisSum=0;
- break;
- }
- label1.Text="距離:"+Dis.ToString("#.00");
- label2.Text="總距"+DisSum.ToString("#.00");
- }
這段代碼雖短.但要注意的地方很多.
首先,定義一個(gè)MapXLib.PointsClass類型的變量pts,注意,是PointsClass,不是PointClass.前者是點(diǎn)集,后者是點(diǎn).為什么要增加那么一個(gè)變量呢?因?yàn)镸apX的PolyToolUsed事件的返回參數(shù)e的成員points不是MapXLib.PointsClass類型,而是object.類型.所以需要這么一個(gè)變量來轉(zhuǎn)換它,當(dāng)然,你也可以在程序使用pts的地方直接使用(MapXLib.PointsClass)e.points,但那樣一來程序就比較難懂了;
其次,要判斷事件的標(biāo)識(shí)e.flags的值,它指出工具當(dāng)前的狀態(tài),是剛開始畫多義線呢,還是正在畫多義線,或者已經(jīng)結(jié)束了,或者結(jié)束退出.我們只要在畫的時(shí)候測距就可以了.其它時(shí)候?qū)⒕嚯x和總距都設(shè)置為0;
接著,還要注意的是e.points的點(diǎn)數(shù)據(jù)保存方式,e.points首先是一個(gè)object,當(dāng)在畫多義線的時(shí)候,它被初試化為一個(gè)MapXLib.PointsClass的變量,并以二維數(shù)組的方式保存點(diǎn)集.這個(gè)數(shù)組是從1開始的,而不是從0開始的.它保存了多義線上每個(gè)轉(zhuǎn)折點(diǎn)的坐標(biāo),鼠標(biāo)每點(diǎn)一下,就增加一個(gè)新的數(shù)據(jù)到點(diǎn)集,我們計(jì)算最后一條直線長度,應(yīng)該從這個(gè)數(shù)組的末尾往前取.計(jì)算好距離以后再加入到總距中.許多測距的程序例子都要做一個(gè)循環(huán),其實(shí)是不必要的.
最后,請注意數(shù)字轉(zhuǎn)換到字符串的格式問題.在這個(gè)例子中我們保留兩位小數(shù).
補(bǔ)充一點(diǎn),因?yàn)闆]有設(shè)置地圖的地理坐標(biāo)系統(tǒng),所以測出來的距離單位是英里,如果要改為公里,把MapX控件的MapUnit屬性改為miUnitKilometer就可以了.要提高測量精度,除了可以通過轉(zhuǎn)換格式的時(shí)候增加小數(shù)位,還應(yīng)該注意到地圖的測繪精度.否則,再多的小數(shù)位也是沒有意義的.
練習(xí)
1.建立一個(gè)應(yīng)用程序,加入MapX控件和一個(gè)ComboBox控件,兩個(gè):Label控件,在ComboBox中加入第一個(gè)例子中的所有工具和測距工具,在ComboBox中選擇測距工具時(shí)實(shí)現(xiàn)測距功能.
2.將測距工具的光標(biāo)改成箭頭光標(biāo).并以米為單位顯示測距數(shù)據(jù).
2.圖層和圖元(Layers and Features)
有關(guān)圖層和圖元的概念,請參照相關(guān)資料.
圖層的應(yīng)用分為幾個(gè)方面,我們分別加以介紹.
1)圖層的創(chuàng)建:
創(chuàng)建永久圖層:
在C#中,使用以下方法創(chuàng)建永久圖層:
- MapXLib.Layer lyr;
- lyr=axMap1.Layers.CreateLayer("MyLayer","D:\\MapTest\\MyLayer.Tab",0,32,axMap1.DisplayCoordSys);
當(dāng)執(zhí)行這兩句程序時(shí),在指定的路徑生成了一系列文件.它們是:
MyLayer.Dat:圖層的數(shù)據(jù)文件,它保存的是圖層的數(shù)據(jù)庫數(shù)據(jù);
MyLayer.ID:圖層數(shù)據(jù)的唯一的,自動(dòng)生成的編碼,用以區(qū)分不同的圖元;
MyLayer.IND:圖層數(shù)據(jù)的索引文件,以實(shí)現(xiàn)圖層上圖元的快速查找;
MyLaer.MAP:圖層上圖元的圖形數(shù)據(jù);
MyLaer.TAB:這是一個(gè)文本文件,它的作用是將圖層的有關(guān)信息保存起來,供GST地圖文件或其它程序調(diào)用圖層.
用記事本打開MyLayer.TAB文件,看到如下內(nèi)容:
- !table
- !version 450
- !charset WindowsSimpChinese
- Definition Table
- Description "MyLayer"
- Type Native charset "WindowsSimpChinese"
- Fields 1
- GEONAME char (32) Index 1 ;
第一行總是"!table",說明這是一個(gè)圖層表的文件;
第二行指出圖層文件的版本號(hào),MapInfo MapX 5.0生成的圖層版本號(hào)是450;
第三行指出生成圖層的操作系統(tǒng);
接著是對圖層的定義段:
首先指出圖層的描述,就是我們上面程序代碼中的"Mylayer".
接著說明了字符集類型是簡體中文;
然后指出表格中只有一個(gè)字段,這個(gè)字段的名稱是"GEONAME",是長度為32的字符類型字段,在表中的列索引為1.
2)添加現(xiàn)有的圖層:
添加現(xiàn)有圖層的方法和一般的程序語言沒有很大的區(qū)別,我們在當(dāng)前圖層上添加剛才創(chuàng)建的永久圖層,程序代碼如下:
- MapXLib.LayerInfo li;
- li=new MapXLib.LayerInfoClass();
- li.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;
- li.AddParameter("FileSpec","D:\\MapTest\\MyLayer.tab");
- li.AddParameter("Visible",false);
- li.AddParameter("AutoCreateDataset",true);
- li.AddParameter("DatasetName","MyLayer");
- axMap1.Layers.Add(li,0);
- axMap1.Layers.LayersDlg("","");
- axMap1.SaveMapAsGeoset("測試","D:\\MapTest\\MyMap.GST");
在程序的最后,我們顯示了圖層信息對話框,以觀察圖層是否已經(jīng)添加到當(dāng)前的地圖中.可以看到,地圖中添加了我們創(chuàng)建的圖層"MyLayer".放在第0層.
然后,將地圖保存在一個(gè)MyMap.GST的地圖文件中,這個(gè)地圖的標(biāo)題是"測試".
3)移除圖層:
好,接著我們上面做的工作,將工程的axMap1的GeoSet屬性設(shè)置為剛剛生成的地圖文件: "D:\MapTest\MyMap.GST".現(xiàn)在我們將MyLayer從地圖中移除.
添加一個(gè)按鈕,在按鈕的Click事件中編寫如下代碼:
- axMap1.Layers.LayersDlg("","");
- axMap1.Layers.Remove(1);
- axMap1.Layers.LayersDlg("","");
我們使用兩次顯示圖層對話框的方式查看程序的效果,應(yīng)該注意的是在Remove第0層的時(shí)候使用的是Remove(1),如果不清楚圖層的位置,就要作一個(gè)循環(huán),將圖層的位置取出來再移除,如下:
- int lyrind=0;
- axMap1.Layers.LayersDlg("","");
- for( int i=1;i
- {
- if (axMap1.Layers[i]._Name.Trim()=="MyLayer")
- {
- lyrind=i;
- break;
- }
- }
- axMap1.Layers.Remove(lyrind);
- axMap1.Layers.LayersDlg("","");
移除操作只在內(nèi)存中進(jìn)行,也就是說,程序并不刪除任何文件,也沒有將圖層真正地從地圖集合中去掉,當(dāng)程序重新啟動(dòng)的時(shí)候,MyLayer圖層仍然在地圖中.
3)移除所有圖層:
使用axMap1.Layers.RemoveAll();就可以移除所有圖層,用法和Remove相似.
4)圖層定位:
和其它編程語言一樣,使用axMap1.Move(1,2)函數(shù)就可以將圖層的位置改變.
5)創(chuàng)建臨時(shí)圖層
臨時(shí)圖層和永久圖層不同,它只存放在內(nèi)存中,當(dāng)關(guān)閉程序以后該圖層將不存在.
在這里我們將使用LayerInfo對象來創(chuàng)建臨時(shí)圖層,這和傳統(tǒng)的MAPX程序相近,但是引入了C#編程的一些特色:
- MapXLib.LayerInfoClass li=new MapXLib.LayerInfoClass();
- MapXLib.Features ftrs=null;
- MapXLib.FieldsClass flds=new MapXLib.FieldsClass();
- MapXLib.Fields Myflds=null;
- MapXLib.Dataset dts=null;
- flds.Add("State","State_Name",
- MapXLib.AggregationFunctionConstants.miAggregationSum,
- MapXLib.FieldTypeConstants.miTypeString);
- dts=axMap1.DataSets.Add(MapXLib.DatasetTypeConstants.miDataSetLayer,
- axMap1.Layers._Item(1),"MyLayer",0,0,0,flds,false);
- Myflds=dts.Fields;
- ftrs=axMap1.Layers._Item("USA").Selection.Clone();
- li.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTemp;
- li.AddParameter("Name","USA Temp Layer");
- li.AddParameter("Fields",Myflds);
- li.AddParameter("Features",ftrs);
- axMap1.Layers.Add(li,1);
- axMap1.Layers.LayersDlg("","");
這段程序有兩個(gè)關(guān)鍵的地方:
一個(gè)是在C#中DataSets.Add的用法,在許多編程語言中,都可以使用空的參數(shù)或者干脆不用參數(shù)來調(diào)用這個(gè)函數(shù),但是在C#中是不行的,必須8個(gè)參數(shù)全部指定.而且,還應(yīng)該事先初始化Fields參數(shù).這個(gè)函數(shù)的使用涉及到許多方面的知識(shí),包括對MAPX相關(guān)概念的理解和C#編程的認(rèn)識(shí),是一個(gè)很重要,也比較難掌握的技術(shù).后面的章節(jié)中我們還會(huì)作進(jìn)一步的探討.
另一個(gè)是li.AddParameter和li.Type的配合使用問題,這在許多的MAPX書籍中都有論述,此處不再重復(fù).
以上程序最好能自己多琢磨琢磨.才能更好地掌握C#開發(fā)GIS的要領(lǐng).
6)縮放圖層:
所謂的縮放圖層,并不是指將單個(gè)圖層縮放.而是指定圖層的可見范圍比例,例如,設(shè)置一個(gè)圖層在縮小顯示大于5英里的時(shí)候隱藏.小于5英里的時(shí)候顯示.和其它編程語言一樣,只要設(shè)置Layer的ZoomMin和ZoomMax就可以了.
7)顯示整個(gè)圖層:
這里要提及的一個(gè)技巧是在C#下面怎樣顯示整個(gè)圖層.眾所周知,在VB下面只要:
Map1.Bounds = Map1.Layers("USA").Bounds
一句程序就可以輕松實(shí)現(xiàn).但是要是在C#中這樣寫的話,百分百會(huì)出錯(cuò).其實(shí),這里有一個(gè)小小的技巧,聰明的你一定能看出來:
axMap1.CtlBounds=axMap1.Layers._Item("USA").Bounds;
8)在圖層上繪制永久圖形:
我們在介紹工具的時(shí)候,有一些工具沒有介紹,這些工具其實(shí)是用來在圖層上創(chuàng)建永久圖形對象的(圖元).當(dāng)在圖層上繪制了圖形以后,這些圖形將以數(shù)據(jù)記錄的形式保存在圖層表中,也就是創(chuàng)建了一個(gè)圖元.如果不想保存圖元,可以在臨時(shí)圖層里繪制.
- axMap1.Layers._Item("USA Temp Layer").Editable=true;
- axMap1.Layers.InsertionLayer=axMap1.Layers._Item("USA Temp Layer");
- axMap1.CurrentTool=MapXLib.ToolConstants.miAddLineTool;
上面的程序使用了畫線的工具,在地圖上拖動(dòng)鼠標(biāo)就可以在臨時(shí)圖層上畫線了.這些工具使用的前提是必須指定axMap1的插入圖層(InsertionLayer).才能在圖層表中插入數(shù)據(jù).
關(guān)于圖層的關(guān)鍵技術(shù)就介紹到這里,掌握了這些技術(shù)以后,在作進(jìn)一步的研究時(shí),例如動(dòng)畫圖層和繪制圖層的開發(fā),遇到的困難應(yīng)該不大.
下面我們介紹C#對MAPX圖元的編程技術(shù).
9)在圖層上創(chuàng)建圖元:
根據(jù)MAP Info提供的MapX 5.0開發(fā)手冊,創(chuàng)建圖元有兩種方法,用兩段代碼說明這兩種代碼在C#的實(shí)現(xiàn)方法:
第一種實(shí)現(xiàn)方法:直接使用Feature類創(chuàng)建圖元
- MapXLib.Style sty=new MapXLib.StyleClass();
- MapXLib.Feature ftr=new MapXLib.FeatureClass();
- ftr.Attach(axMap1.GetOcx());
- ftr.Type=MapXLib.FeatureTypeConstants.miFeatureTypeText;
- sty.TextFontColor=255;
- sty.TextFont.Size=12;
- ftr.Style=sty;
- ftr.Caption="New Feature";
- ftr.Point.Set(axMap1.CenterX,axMap1.CenterY);
- axMap1.Layers._Item("US Top 20 Cities").Style=sty;
- ftr=axMap1.Layers._Item("US Top 20 Cities").AddFeature(ftr,new MapXLib.RowValuesClass());
- ftr.Update(ftr,new MapXLib.RowValuesClass());
有幾個(gè)要注意的地方:
ftr.Attach(axMap1.GetOcx());
如果在VB6下,這句程序應(yīng)該是這樣的:
ftr.Attach Map1
從這里可以看到在C#中因?yàn)閲?yán)格的類型管理所帶來的一些變化.如果不進(jìn)行GetOcx()的轉(zhuǎn)換,即使在VB.Net下也是錯(cuò)誤的.
ftr=axMap1.Layers._Item("US Top 20 Cities").AddFeature(ftr,new MapXLib.RowValuesClass());
我們在這個(gè)程序中加入了一行空的數(shù)據(jù),這也就代表著我們加入的圖元不包含任何數(shù)據(jù)信息.這是為了在介紹圖元的時(shí)候方便大家掌握,并不意味著這樣增加圖元就不能將數(shù)據(jù)保存進(jìn)去,實(shí)際上,通過設(shè)置一個(gè)新的RowValues變量,是可以將數(shù)據(jù)信息保存到圖元中的.我們將在后面的章節(jié)中介紹如何將數(shù)據(jù)保存在圖元中.
ftr.Update(ftr,new MapXLib.RowValuesClass());
這句程序的作用是將創(chuàng)建的圖元保存到圖層表中,這種保存是永久保存的.除非是在臨時(shí)圖層上增加的圖元,否則下次打開地圖文件的時(shí)候,將看到創(chuàng)建的圖元仍然保留在地圖上.因此,在對圖元操作之前請備份好地圖文件,避免不必要的損失.
另外,關(guān)于圖元的類型(Type)和風(fēng)格(Style),應(yīng)該和其所在的圖層相對應(yīng),比如上面程序中關(guān)于Type和Style的設(shè)置,都是和"US Top 20 Cities" 圖層的類型對應(yīng)的.有關(guān)類型和風(fēng)格的設(shè)置,請查閱相關(guān)手冊.
第二種實(shí)現(xiàn)方法:使用FeatureFactory創(chuàng)建圖元
- MapXLib.Feature ftr=new MapXLib.FeatureClass();
- MapXLib.Point p=new MapXLib.PointClass();
- p.Set(axMap1.CenterX,axMap1.CenterY);
- ftr=axMap1.Layers._Item("US Top 20 Cities")
- .AddFeature(axMap1.FeatureFactory.CreateText
- (p,"New Feature",MapXLib.PositionConstants.miPositionCC,
- new MapXLib.StyleClass()),
- new MapXLib.RowValuesClass());
這段代碼和上面和第一種實(shí)現(xiàn)方法類似,我們在這里不再設(shè)置圖元的Type和Style.
FeatureFactory類似于設(shè)計(jì)模式中的Factory模式,從它可以產(chǎn)生各種類型的圖元,這個(gè)過程相當(dāng)于設(shè)置了圖元的Type.
10)查找圖元:
查找圖元是很簡單的,可以用下邊的代碼實(shí)現(xiàn):
- MapXLib.FindFeature fRes=null;
- fRes=axMap1.Layers._Item("US Top 20 Cities").Find.Search("New York","");
- axMap1.CenterX=fRes.CenterX;
- axMap1.CenterY=fRes.CenterY;
上面這段代碼將找到的圖元放置在地圖中央.這里要注意的是不能使用
- MapXLib.FindFeature fRes=new MapXLib.FindFeatureClass();
來創(chuàng)建FindFeature對象,否則將會(huì)出錯(cuò):
"帶有 CLSID {436052C3-43E3-11D0-83EB-00AA00BD34FC}的COM對象無效或未注冊。"這是MapX 5.0的一個(gè)Bug.要避開它,只要在創(chuàng)建對象的時(shí)候賦null值就可以了.
下面我們對程序作一些改進(jìn),來避免找不到圖元的時(shí)候出錯(cuò),并在找到圖元以后選擇該圖元:
- MapXLib.FindFeature fRes=null;
- fRes=axMap1.Layers._Item("US Top 20 Cities").Find.Search("New York","");
- if (fRes.FindRC % 10 ==1)
- {
- axMap1.CenterX=fRes.CenterX;
- axMap1.CenterY=fRes.CenterY;
- axMap1.Layers._Item("US Top 20 Cities").Selection.Add(fRes);
- }
11)圖元的修改:
圖元的增加,修改和刪除都是非事務(wù)性的,也就是說,所作的修改都永久性地對圖層表數(shù)據(jù)產(chǎn)生影響.這可以使用戶對多個(gè)圖元進(jìn)行操作后一次更新地圖,但是在更新之前并不能看到更新后的效果.我們在使用第一種方法創(chuàng)建圖元的時(shí)候,在最后更新:
- ftr.Update(ftr,new MapXLib.RowValuesClass());
但是在FeatureFacory創(chuàng)建圖元的時(shí)候是不用Update的,因?yàn)镕eatureFactory的相關(guān)方法中已經(jīng)包含了Update.根據(jù)MapX 5.0的開發(fā)手冊介紹,修改了某個(gè)圖元并更新時(shí)應(yīng)使用Feature.Update方法,當(dāng)使用其它圖元取代某個(gè)圖元,應(yīng)使用Layers.UpdateFeature方法.
12)圖元的刪除:
和其它編程語言一樣,刪除圖元使用DeleteFeature方法,有關(guān)介紹請參看MapX的聯(lián)機(jī)幫助和開發(fā)手冊.
【編輯推薦】