




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C#開發(fā)GIS應用簡明教程2009-11-15 來自:CSDN Blog 字體大小:【大中小】摘要:這篇是C#開發(fā)GIS應用簡明教程,從工具開始將其,包括設計窗體、創(chuàng)建永久圖層等等。希望本文能對大家有所幫助。 C#開發(fā)GIS,這里將介紹MapX為開發(fā)人員提供一系列的工具,包括C#對MAPX圖元的編程技術。這些工具的使用,可以通過MapX的幫助文檔中查到。1.工具(ToolConstantsMapX為開發(fā)人員提供一系列的工具,這些工具的作用各有不同,我們通過開發(fā)一個應用程序來了解這些工具的作用,至于這些工具的具體說明,可以在MapX的幫助文檔中,通過查找Available Standard To
2、ols 看到相應的解釋.一些MapX的相關資料也有介紹.在.NET編程環(huán)境中新建一個C#的WindeosApplication(Windows應用程序項目,然后在菜單中選擇”項目/添加引用”,打開如下圖的窗口,在窗口中選擇COM標簽,在組件名稱列表中雙擊MapInfo MapX V5.單擊確認按鈕,將Map5控件加入到.Net的工具箱中.接著,將MapInfo MapX V5 控件畫到窗體上,再在窗體上畫一個ComboBox控件comboBo x1.如下圖:雙擊設計窗體,編寫Form1_Load代碼如下:1.private void Form1_Load(object sender, Syst
3、em.EventArgs e2.3.ArrayList ToolsList=new ArrayList(;4.ToolsList.Add(MapXLib.ToolConstants.miArrowTool;5.ToolsList.Add(MapXLib.ToolConstants.miCenterTool;6.ToolsList.Add(MapXLib.ToolConstants.miLabelTool;7.ToolsList.Add(MapXLib.ToolConstants.miPanTool;8.ToolsList.Add(MapXLib.ToolConstants.miPolygonS
4、electTool;9.ToolsList.Add(MapXLib.ToolConstants.miRadiusSelectTool;10.ToolsList.Add(MapXLib.ToolConstants.miSymbolTool;11.ToolsList.Add(MapXLib.ToolConstants.miTextTool;12.ToolsList.Add(MapXLib.ToolConstants.miZoomInTool;13.ToolsList.Add(MapXLib.ToolConstants.miZoomOutTool;boBox1.DataSource=ToolsLis
5、t;15.以上代碼通過一個數(shù)組ToolsList,將MapXLib的工具加入到comboBox1中.MapX還有一些其它的工具,它們的作用是往地圖上加上點,線,多邊型和圓.因為這些工具要求有操作圖層,一并在介紹圖層的時候介紹.關于ArrayList的用法,請參考C#的有關資料.接著,雙擊comboBox1,并編寫代碼如下1.private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e2.3.axMap1.CurrentTool=(MapXLib.ToolConstantscomboBox1.Selec
6、tedItem;4.應注意,在C#中必須要顯式地把comboBox1的選擇項目SelectedItem(數(shù)據(jù)類型為obje ct轉換為MapXLib.ToolConstants.因為ToolConstants是MapX自己定義的一個枚舉數(shù)據(jù)類型,C#不能自動完成這種枚舉成員變量到object的數(shù)據(jù)轉換.編譯執(zhí)行程序,從comboBox1中選擇不同的工具,在地圖上進行操作,你可以了解到MapX 工具集的強大功能.實際上,MapX提供的工具集就好像Photoshop,AutoCAD的工具欄一樣,為你提供了一些控制地圖的工具.但是,在開發(fā)GIS的時候,這些工具是不能完全滿足要求的.所以,還應該學會自
7、定義工具.下面,通過一個在地圖上測距的例子,來介紹一下如何在C#下自定義MapX工具如前所述建立一個C#的Windows應用程序并將Mapinfo MapX V5 控件加到窗體上.并加入一個Button控件button1.將button1的Text屬性改為測距,再在窗口中放上兩個Lab el控件label1,label2,將它們的Text屬性設置為空字符串,如下圖:雙擊設計窗體,編寫Form1_Load代碼如下:1.private void Form1_Load(object sender, System.EventArgs e2.3.axMap1.CreateCustomTool(100,M
8、apXLib.ToolTypeConstants.miToolTypePoly,4.MapXLib.CursorConstants.miCrossCursor,null,null,null;5.在加載窗口的時候,我們定義了一個工具.它的編號是100(不要和MapX本身的工具編號重復,它的類型是一個多義線,采用十字光標.關于此函數(shù)的用法,建議查看MapX的開發(fā)手冊和相關資料.現(xiàn)在我們定義了一個編號為100的工具,可以在程序中使用它了.雙擊設計窗體中的but ton1,編寫它的Click事件處理代碼如下:1.private void button1_Click(object sender, Sys
9、tem.EventArgs e2.3.axMap1.CurrentTool=(MapXLib.ToolConstants100;4.現(xiàn)在編譯運行,單擊button1,就可以在地圖上使用這個工具了.但是還有一部分重要的代碼沒有完成:測距!完成測距功能的代碼在C#使用MapX開發(fā)GIS中非常具有代表性,也比較有難度.我在首次使用C#+MapX開發(fā)GIS的時候,被這個問題困擾了很久.項目經(jīng)理也來研究,過兩天說有結果了,但他給出的例子根本就行不通.當然,會了就不難了.其實,也很簡單.首先,在窗口類中聲明兩個私有全局變量以保存測出的距離和總距,注意聲明代碼的位置:1.public class Form1
10、 : System.Windows.Forms.Form2.3.private AxMapXLib.AxMap axMap1;4.private System.Windows.Forms.Button button1;5.private System.Windows.Forms.Label label1;6.private System.Windows.Forms.Label label2;7./8./ 必需的設計器變量。9./10.private System.ComponentModel.Container components = null;11.private double Dis=0
11、,DisSum=0;12.13.現(xiàn)在來編寫工具的事件.注意,在MapX畫多義線的時候,它觸發(fā)消息的方式和一般的工具是不同的,首先,它并不是用鼠標一點擊就完成了的,還可以繼續(xù)畫下去,所以,不應該在M apX控件的ToolUsed事件中編寫,而應該在PolyToolUsed事件中實現(xiàn)測距.代碼如下:1.private void axMap1_PolyToolUsed(object sender, AxMapXLib.CMapXEvents_PolyToolUsedEvent e2.3.MapXLib.PointsClass pts=new MapXLib.PointsClass(;4.switch
12、(e.flags5.6.case (intMapXLib.ToolFlagConstants.miToolInProgress:7. pts=(MapXLib.PointsClasse.points;8.Dis=axMap1.Distance(pts._Item(pts.Count-1.X,9.pts._Item(pts.Count-1.Y,10.pts._Item(pts.Count.X,11.pts._Item(pts.Count.Y;12. DisSum+=Dis;13.break;14.default:15. Dis=0;16. DisSum=0;17.break;18.19.labe
13、l1.Text=距離:+Dis.ToString(#.00;20.label2.Text=總距+DisSum.ToString(#.00;21.這段代碼雖短.但要注意的地方很多.首先,定義一個MapXLib.PointsClass類型的變量pts,注意,是PointsClass,不是Poin tClass.前者是點集,后者是點.為什么要增加那么一個變量呢?因為MapX的PolyToolUsed 事件的返回參數(shù)e的成員points不是MapXLib.PointsClass類型,而是object.類型.所以需要這么一個變量來轉換它,當然,你也可以在程序使用pts的地方直接使用(MapXLib.Po
14、in tsClasse.points,但那樣一來程序就比較難懂了;其次,要判斷事件的標識e.flags的值,它指出工具當前的狀態(tài),是剛開始畫多義線呢,還是正在畫多義線,或者已經(jīng)結束了,或者結束退出.我們只要在畫的時候測距就可以了.其它時候?qū)⒕嚯x和總距都設置為0;接著,還要注意的是e.points的點數(shù)據(jù)保存方式,e.points首先是一個object,當在畫多義線的時候,它被初試化為一個MapXLib.PointsClass的變量,并以二維數(shù)組的方式保存點集.這個數(shù)組是從1開始的,而不是從0開始的.它保存了多義線上每個轉折點的坐標,鼠標每點一下,就增加一個新的數(shù)據(jù)到點集,我們計算最后一條直線長
15、度,應該從這個數(shù)組的末尾往前取.計算好距離以后再加入到總距中.許多測距的程序例子都要做一個循環(huán),其實是不必要的.最后,請注意數(shù)字轉換到字符串的格式問題.在這個例子中我們保留兩位小數(shù).補充一點,因為沒有設置地圖的地理坐標系統(tǒng),所以測出來的距離單位是英里,如果要改為公里,把MapX控件的MapUnit屬性改為miUnitKilometer就可以了.要提高測量精度,除了可以通過轉換格式的時候增加小數(shù)位,還應該注意到地圖的測繪精度.否則,再多的小數(shù)位也是沒有意義的.1.建立一個應用程序,加入MapX控件和一個ComboBox控件,兩個:Label控件,在ComboBox 中加入第一個例子中的所有工具和
16、測距工具,在ComboBox中選擇測距工具時實現(xiàn)測距功能.2.將測距工具的光標改成箭頭光標.并以米為單位顯示測距數(shù)據(jù).3.圖層和圖元(Layers and Features有關圖層和圖元的概念,請參照相關資料.圖層的應用分為幾個方面,我們分別加以介紹.1圖層的創(chuàng)建:創(chuàng)建永久圖層:在C#中,使用以下方法創(chuàng)建永久圖層:1.MapXLib.Layer lyr;2.lyr=axMap1.Layers.CreateLayer(MyLayer,D:MapTestMyLayer.Tab,0,32,axMap1.DisplayCoordSys;當執(zhí)行這兩句程序時,在指定的路徑生成了一系列文件.它們是:MyLa
17、yer.Dat:圖層的數(shù)據(jù)文件,它保存的是圖層的數(shù)據(jù)庫數(shù)據(jù);MyLayer.ID:圖層數(shù)據(jù)的唯一的,自動生成的編碼,用以區(qū)分不同的圖元;MyLayer.IND:圖層數(shù)據(jù)的索引文件,以實現(xiàn)圖層上圖元的快速查找;MyLaer.MAP:圖層上圖元的圖形數(shù)據(jù);MyLaer.TAB:這是一個文本文件,它的作用是將圖層的有關信息保存起來,供GST地圖文件或其它程序調(diào)用圖層.用記事本打開MyLayer.TAB文件,看到如下內(nèi)容:1.!table2.!version 4503.!charset WindowsSimpChinese4.Definition Table5.Description MyLayer6
18、.Type Native charset WindowsSimpChinese7.Fields 18.GEONAME char (32 Index 1 ;第一行總是!table,說明這是一個圖層表的文件;第二行指出圖層文件的版本號,MapInfo MapX 5.0生成的圖層版本號是450;第三行指出生成圖層的操作系統(tǒng);接著是對圖層的定義段:首先指出圖層的描述,就是我們上面程序代碼中的Mylayer.接著說明了字符集類型是簡體中文;然后指出表格中只有一個字段,這個字段的名稱是GEONAME,是長度為32的字符類型字段,在表中的列索引為1.2添加現(xiàn)有的圖層:添加現(xiàn)有圖層的方法和一般的程序語言沒有很
19、大的區(qū)別,我們在當前圖層上添加剛才創(chuàng)建的永久圖層,程序代碼如下:1.MapXLib.LayerInfo li;2.li=new MapXLib.LayerInfoClass(;3.li.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;4.li.AddParameter(FileSpec,D:MapTestMyLayer.tab;5.li.AddParameter(Visible,false;6.li.AddParameter(AutoCreateDataset,true;7.li.AddParameter(DatasetName,M
20、yLayer;8.axMap1.Layers.Add(li,0;9.axMap1.Layers.LayersDlg(,;10.axMap1.SaveMapAsGeoset(測試,D:MapTestMyMap.GST;在程序的最后,我們顯示了圖層信息對話框,以觀察圖層是否已經(jīng)添加到當前的地圖中.可以看到,地圖中添加了我們創(chuàng)建的圖層MyLayer.放在第0層.然后,將地圖保存在一個MyMap.GST的地圖文件中,這個地圖的標題是測試.3移除圖層:好,接著我們上面做的工作,將工程的axMap1的GeoSet屬性設置為剛剛生成的地圖文件: D:MapTestMyMap.GST.現(xiàn)在我們將MyLayer
21、從地圖中移除.添加一個按鈕,在按鈕的Click事件中編寫如下代碼:1.axMap1.Layers.LayersDlg(,;2.axMap1.Layers.Remove(1;3.axMap1.Layers.LayersDlg(,;我們使用兩次顯示圖層對話框的方式查看程序的效果,應該注意的是在Remove第0層的時候使用的是Remove(1,如果不清楚圖層的位置,就要作一個循環(huán),將圖層的位置取出來再移除,如下:1.int lyrind=0;2.axMap1.Layers.LayersDlg(,;3.for( int i=1;i4.5.if (axMap1.Layersi._Name.Trim(=M
22、yLayer6.7. lyrind=i;8.break;9.10.11.axMap1.Layers.Remove(lyrind;12.axMap1.Layers.LayersDlg(,;移除操作只在內(nèi)存中進行,也就是說,程序并不刪除任何文件,也沒有將圖層真正地從地圖集合中去掉,當程序重新啟動的時候,MyLayer圖層仍然在地圖中.3移除所有圖層:使用axMap1.Layers.RemoveAll(;就可以移除所有圖層,用法和Remove相似.4圖層定位:和其它編程語言一樣,使用axMap1.Move(1,2函數(shù)就可以將圖層的位置改變.5創(chuàng)建臨時圖層臨時圖層和永久圖層不同,它只存放在內(nèi)存中,當關
23、閉程序以后該圖層將不存在.在這里我們將使用LayerInfo對象來創(chuàng)建臨時圖層,這和傳統(tǒng)的MAPX程序相近,但是引入了C#編程的一些特色:1.MapXLib.LayerInfoClass li=new MapXLib.LayerInfoClass(;2.MapXLib.Features ftrs=null;3.MapXLib.FieldsClass flds=new MapXLib.FieldsClass(;4.MapXLib.Fields Myflds=null;5.MapXLib.Dataset dts=null;6.flds.Add(State,State_Name,7.MapXLib.
24、AggregationFunctionConstants.miAggregationSum,8.MapXLib.FieldTypeConstants.miTypeString;9.dts=axMap1.DataSets.Add(MapXLib.DatasetTypeConstants.miDataSetLayer,10.axMap1.Layers._Item(1,MyLayer,0,0,0,flds,false;11.Myflds=dts.Fields;12.ftrs=axMap1.Layers._Item(USA.Selection.Clone(;13.li.Type=MapXLib.Lay
25、erInfoTypeConstants.miLayerInfoTypeTemp;14.li.AddParameter(Name,USA Temp Layer;15.li.AddParameter(Fields,Myflds;16.li.AddParameter(Features,ftrs;17.axMap1.Layers.Add(li,1;18.axMap1.Layers.LayersDlg(,;這段程序有兩個關鍵的地方:一個是在C#中DataSets.Add的用法,在許多編程語言中,都可以使用空的參數(shù)或者干脆不用參數(shù)來調(diào)用這個函數(shù),但是在C#中是不行的,必須8個參數(shù)全部指定.而且,還應該事先
26、初始化Fields參數(shù).這個函數(shù)的使用涉及到許多方面的知識,包括對MAPX相關概念的理解和C#編程的認識,是一個很重要,也比較難掌握的技術.后面的章節(jié)中我們還會作進一步的探討.另一個是li.AddParameter和li.Type的配合使用問題,這在許多的MAPX書籍中都有論述,此處不再重復.以上程序最好能自己多琢磨琢磨.才能更好地掌握C#開發(fā)GIS的要領.6縮放圖層:所謂的縮放圖層,并不是指將單個圖層縮放.而是指定圖層的可見范圍比例,例如,設置一個圖層在縮小顯示大于5英里的時候隱藏.小于5英里的時候顯示.和其它編程語言一樣,只要設置Layer的ZoomMin和ZoomMax就可以了.7顯示整
27、個圖層:這里要提及的一個技巧是在C#下面怎樣顯示整個圖層.眾所周知,在VB下面只要:Map1.Bounds = Map1.Layers(USA.Bounds一句程序就可以輕松實現(xiàn).但是要是在C#中這樣寫的話,百分百會出錯.其實,這里有一個小小的技巧,聰明的你一定能看出來:axMap1.CtlBounds=axMap1.Layers._Item(USA.Bounds;8在圖層上繪制永久圖形:我們在介紹工具的時候,有一些工具沒有介紹,這些工具其實是用來在圖層上創(chuàng)建永久圖形對象的(圖元.當在圖層上繪制了圖形以后,這些圖形將以數(shù)據(jù)記錄的形式保存在圖層表中,也就是創(chuàng)建了一個圖元.如果不想保存圖元,可以在
28、臨時圖層里繪制.1.axMap1.Layers._Item(USA Temp Layer.Editable=true;2.axMap1.Layers.InsertionLayer=axMap1.Layers._Item(USA Temp Layer;3.axMap1.CurrentTool=MapXLib.ToolConstants.miAddLineTool;上面的程序使用了畫線的工具,在地圖上拖動鼠標就可以在臨時圖層上畫線了.這些工具使用的前提是必須指定axMap1的插入圖層(InsertionLayer.才能在圖層表中插入數(shù)據(jù).關于圖層的關鍵技術就介紹到這里,掌握了這些技術以后,在作進一
29、步的研究時,例如動畫圖層和繪制圖層的開發(fā),遇到的困難應該不大.下面我們介紹C#對MAPX圖元的編程技術.9在圖層上創(chuàng)建圖元:根據(jù)MAP Info提供的MapX 5.0開發(fā)手冊,創(chuàng)建圖元有兩種方法,用兩段代碼說明這兩種代碼在C#的實現(xiàn)方法:第一種實現(xiàn)方法:直接使用Feature類創(chuàng)建圖元1.MapXLib.Style sty=new MapXLib.StyleClass(;2.MapXLib.Feature ftr=new MapXLib.FeatureClass(;3.ftr.Attach(axMap1.GetOcx(;4.ftr.Type=MapXLib.FeatureTypeConstan
30、ts.miFeatureTypeText;5.sty.TextFontColor=255;6.sty.TextFont.Size=12;7.ftr.Style=sty;8.ftr.Caption=New Feature;9.ftr.Point.Set(axMap1.CenterX,axMap1.CenterY;10.axMap1.Layers._Item(US Top 20 Cities.Style=sty;11.ftr=axMap1.Layers._Item(US Top 20 Cities.AddFeature(ftr,new MapXLib.RowValuesClass(;12.ftr.
31、Update(ftr,new MapXLib.RowValuesClass(;有幾個要注意的地方:ftr.Attach(axMap1.GetOcx(;如果在VB6下,這句程序應該是這樣的:ftr.Attach Map1從這里可以看到在C#中因為嚴格的類型管理所帶來的一些變化.如果不進行GetOcx(的轉換,即使在VB.Net下也是錯誤的.ftr=axMap1.Layers._Item(US Top 20 Cities.AddFeature(ftr,new MapXLib.RowV aluesClass(;我們在這個程序中加入了一行空的數(shù)據(jù),這也就代表著我們加入的圖元不包含任何數(shù)據(jù)信息.這是為了
32、在介紹圖元的時候方便大家掌握,并不意味著這樣增加圖元就不能將數(shù)據(jù)保存進去,實際上,通過設置一個新的RowValues變量,是可以將數(shù)據(jù)信息保存到圖元中的.我們將在后面的章節(jié)中介紹如何將數(shù)據(jù)保存在圖元中.ftr.Update(ftr,new MapXLib.RowValuesClass(;這句程序的作用是將創(chuàng)建的圖元保存到圖層表中,這種保存是永久保存的.除非是在臨時圖層上增加的圖元,否則下次打開地圖文件的時候,將看到創(chuàng)建的圖元仍然保留在地圖上.因此,在對圖元操作之前請備份好地圖文件,避免不必要的損失.另外,關于圖元的類型(Type和風格(Style,應該和其所在的圖層相對應,比如上面程序中關于T
33、ype和Style的設置,都是和US Top 20 Cities 圖層的類型對應的.有關類型和風格的設置,請查閱相關手冊.第二種實現(xiàn)方法:使用FeatureFactory創(chuàng)建圖元1.MapXLib.Feature ftr=new MapXLib.FeatureClass(;2.MapXLib.Point p=new MapXLib.PointClass(;3.p.Set(axMap1.CenterX,axMap1.CenterY;4. 5. 6. 7. 8. ftr=axMap1.Layers._Item(US Top 20 Cities .AddFeature(axMap1.FeatureFactory.CreateText (p,New Feature,MapXLib.PositionConstants.miPositionCC, new MapXLib.StyleClass(, new MapXLib.RowValuesClass(; 這段代碼和上面和第一種實現(xiàn)方法類似,我們在這里不再設置圖元的 Type 和 Style. FeatureFactory 類似于設計模式中的 Factory 模式,從它可以產(chǎn)生各種類型的圖元,這 個過程相當于設置了圖元的 Type. 10查找圖元: 查找圖元是很簡單的,可以用下邊的代碼實現(xiàn): 1. MapXLib
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年醫(yī)院營養(yǎng)科考試題及答案
- 2025年企劃部面試題及答案
- 2025年財務筆試題庫及答案
- 2025年考研英語預測試題及答案
- 2025年大學英語考試試題及答案
- 2025年手術室泌尿組試題及答案
- 2025年口腔助理筆試題庫及答案
- 2025年集美試題及答案5年級
- 2025年測繪類招聘考試題及答案
- “法律與生活”教學中民事法律關系客體的區(qū)分
- 泥水平衡盾構簡介課件
- 無人機學習文件-飛行手冊
- 典范英語教材-1a-課件
- 教科版科學四年級下冊教師用書
- 娛樂主播如何轉型做帶貨主播
- 慢性腎病知識講座課件
- 光催化分解水制氫
- 工程勘察設計收費標準使用手冊
- 高速鐵路設計規(guī)范(最新版)
- 25種全球最流行的管理工具
- 道德與法治-五年級(下冊)-《建立良好的公共秩序》教學課件
評論
0/150
提交評論