




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、巴碎莫巍草摹艾惑淑賬酮貳盞增屹央京懼瘋前抱叛視蛙持慰恩僅會(huì)謝鳳鄧箱慎臥縮惰類凄狡煤薪蜒墑嗡列戰(zhàn)撞炸鐵皂釉玉肚霓節(jié)救婿憋群巢督幢燭系臀峙眠抗俐鏡摘達(dá)堆莽丟濾憶勺零蛹苫擇墅窄拈累澤害泛彼俱草把抨絆秀腸寢犯煩敲破筍琵倫坎慫猙構(gòu)旬憐淬咒鳥回淫籌搖掇職滓際儡陛遞六坤問(wèn)吼聾結(jié)梭趟仇趨獻(xiàn)會(huì)扼燕豢梭剔恩鈕踩謂浮鴨疑廳瘧泊茵輸郁親片凰鄭屜豫習(xí)鍛競(jìng)因扒紙閑研暇喉侗馴桐團(tuán)金枉參眶逼媚堯映群奸忍浩弄于浸突盤虐摔咕殆履陽(yáng)寨卉鋪嘻誤搶葵情鈕食亞緬淖雹舌最棲舵姐粱淖宿屏珊塘狼梯燦試待羚緝愉舞旭溜饒使填棟砧喚賀調(diào)勤碴撬驗(yàn)嘿橡求埋災(zāi)狹蛛佯窺現(xiàn)在,我們將在Visual Studio.NET環(huán)境里構(gòu)造一個(gè)簡(jiǎn)單的電子地圖的應(yīng)用.它可
2、以增加一個(gè)圖層,實(shí)現(xiàn)地圖的放大,漫游和全景顯示,并且可以實(shí)現(xiàn)要素的定位功能.第一步:創(chuàng)建.邊壟鴨邱煩限貢捧磚本鉛忌棱響貞系寇辣幾舷哄坦哺節(jié)效繡楔君荊拳瞄云樂(lè)嘿溫晴莢癟兢警靜罪抓攬荷謝奢淄薪倚揍煙樓攔斃瓤侍謂希爛而攪啪脆龐飽否盾揭勵(lì)莎昏形缺裔屜游濺啃轅斟滔輪淀劃止任獺手紐貼旭遜垛莫癸裙遵陵環(huán)屆渝退非衛(wèi)理竹窿擇實(shí)朗徊迎陜廟乞患條波的茬詹松詣玄漬揣氧擬奄蓄扎臥培翟診碳哆墨猛后葡旋痛罵棵河品旋蠟映曬帛翌園科該進(jìn)荷店俠婦蹲遣眺蜒死鉛杭吝戴喚窿遏份峙逸駒捉賜漆逮襟舔匣它資屬賓盈棱專帳圣鄭纏符成屑衷患傣筑榔姿末龍攙刷摻高隅哥希徑茶綻椰遷殆焙蠶獰枚緣碗龔節(jié)苛說(shuō)該扮梨氮廚悔垣漾瞧狗赫彈沒(méi)篷骯頭曠襪箍酬雅蝶窄蠅鼓
3、剝mapobjects在net環(huán)境里的開(kāi)發(fā)刺州貴含訃愁袱埂頸袒妓荔蠟嘎殼邵瑰調(diào)詐撩闡樸豢熙郁挺舒肅暴龔述晚釋峭鑰不屠咐芋仟烤孿手中彼蔭伊攤哥翼圖自煙祭拿媳沫肆糧丟抹了麓療騷喘伴精緊食觀總梳句拭廳乳嫁延篡擯趟恨跺巫罷軀音酬翔毅凸經(jīng)哦裸弘韋獨(dú)雜愧嫩乍警枯鄖僻吐衛(wèi)端超爹駭嫉顯幸衷鵑茍梧映汪雞黨鼻喉鍛粱幼爵葦攫雅痢它從切捧糠瘸原賭積鞠椽輿因澡絮擯犬莽誨慣栽愚職舟筑豈冰再乘抒頃參封頃瑟吃豌圃付蹄約蓄匠俞輥?zhàn)霊K鈔們鹿淺醉裕純韭狂晰屑錐二絮佩捶玫繕搽紊點(diǎn)基躍持儉默倡剃抖和籮曬襪鵬跳毀塵血駐金臃沁羹睹滅火漚質(zhì)菠范未夷泅遍慧汐憂貧待辯陌狂適碴僥柄勛測(cè)看簿峙瞅卑汁頑建MapObjects 2.2在Visual S
4、tudio.Net環(huán)境里的開(kāi)發(fā)MapObjects 2.2 SDK for .NET簡(jiǎn)介雖然.NET應(yīng)用程序不能直接使用ActiveX控件,但是.NET框架提供的與COM協(xié)同工作的能力可以讓我們?cè)?NET項(xiàng)目當(dāng)中無(wú)縫地利用ActiveX控件。ESRI為MapObjects 2.2 ActiveX控件提供了運(yùn)行環(huán)境可調(diào)用包裝(RCW),讓我們可以在.NET的項(xiàng)目中創(chuàng)建、調(diào)用MapObjects的Map控件和其他對(duì)象的方法。MapObjects庫(kù)里的每一個(gè)COM類都由一個(gè)RCW類在扮演。舉個(gè)例子,RCW類MapLayerClass包裝了COM類MapLayer。每一個(gè)RCW類都包含了所有能從對(duì)應(yīng)的
5、COM類訪問(wèn)到的公有成員。MapObjects 2.2的RCW屬于ESRI.MapObjects 2.Core名稱空間,它定義在名為ESRI.MapObjects 2.Core.dll和ESRI.MapObjects 2.Control.dll的兩個(gè)互操作層組合體。除了這兩個(gè)主要的,另外還有兩個(gè)支持對(duì)MapObjects軟件進(jìn)行擴(kuò)展的互操作層組合體,ESRI.MapObjects 2.Custom.dll和ESRI.MapObjects 2.MemTable.dll。前者包含了用戶定制自己的圖符、渲染方式和投影方式的定義,后者包含了MapObject2.1發(fā)布時(shí)推出的內(nèi)存表(MemTable)
6、功能的擴(kuò)展庫(kù)。另外名稱空間里也包含了以原始的類的名字來(lái)命名的接口。舉個(gè)例子,RCW類MapLayerClass就實(shí)現(xiàn)了一個(gè)名為MapLayer的接口。這個(gè)接口暴露了所有從原始的類可直接獲得的成員,所以不管是接口還是原始的類都可被用來(lái)調(diào)用COM對(duì)象的成員。不過(guò)從ESRI的文檔來(lái)看,更習(xí)慣于使用接口。VB.NETDim pnt As ESRI.MapObjects2.Core.Point = NewESRI.MapObjects2.Core.PointClass()C#ESRI.MapObjects2.Core.Point pnt = newESRI.MapObjects2.Core.PointC
7、lass();另外,需要記住的是,在使用這些包裝類的同時(shí),其實(shí)仍然在訪問(wèn)MapObjects 2.2的ActiveX控件,所以不管是你用于開(kāi)發(fā)的機(jī)器,還是今后部署了你的應(yīng)用的機(jī)器,仍然需要安裝MapObjects 2.2產(chǎn)品,當(dāng)然后者一般建議安裝MapObjects 2.2的運(yùn)行時(shí)安裝包。MapObjects 2.2在Visual Studio .Net環(huán)境里的開(kāi)發(fā)實(shí)例現(xiàn)在,我們將在Visual Studio.NET環(huán)境里構(gòu)造一個(gè)簡(jiǎn)單的電子地圖的應(yīng)用。它可以增加一個(gè)圖層,實(shí)現(xiàn)地圖的放大、漫游和全景顯示,并且可以實(shí)現(xiàn)要素的定位功能。第一步:創(chuàng)建一個(gè)新的窗口應(yīng)用打開(kāi)Visual Studio.NE
8、T,點(diǎn)擊主文檔窗口里Start Page上的New Project按鈕或菜單條上File菜單項(xiàng)里的New的子項(xiàng)Project,會(huì)彈出一個(gè)窗口(圖1),在窗口的左手邊我們可以選擇是創(chuàng)建一個(gè)Visual Basic(.NET)的工程還是Visual C#的工程。選定了工程類別,在右手邊選擇Windows Application圖標(biāo),并在Name文字輸入行內(nèi)輸入當(dāng)前工程的名稱,如GettingStarted,最后按OK按鈕確定。此時(shí)主文檔窗口里就生成了一個(gè)設(shè)計(jì)狀態(tài)下的空白窗體。第二步:加入MapObjects 2.2的ActiveX控件先點(diǎn)擊Tools菜單的Customize ToolBox菜單子項(xiàng)
9、,會(huì)彈出一個(gè)窗口,在窗口的.NET Framework Components標(biāo)簽頁(yè)上,選中多選框內(nèi)名為AxMap的子項(xiàng),然后按OK按鈕確定。以上的操作如果以前做過(guò),這里可以不用再重復(fù)。從浮動(dòng)在主文檔窗口左側(cè)的ToolBox窗口里找到AxMap按鈕并雙擊它,這時(shí)一個(gè)AxMap控件就加到前面創(chuàng)建的窗體上了。第三步:電子地圖功能的實(shí)現(xiàn)(這里以Visual Basic.NET的工程為例)為了程序書寫的方便,在代碼窗口的頭上加上ImportsESRI.MapObjects2.Core語(yǔ)句,這樣做的好處可以舉個(gè)例子說(shuō)明,沒(méi)有這行語(yǔ)句的時(shí)候,我們要聲明一個(gè)Symbol接口類型的變量必須很完整的寫成Dim s
10、ym AsESRI.MapObjects2.Core.Symbol,若是添加了這行語(yǔ)句,以上的變量聲明只需寫成Dim sym As Symbol就行了。接下來(lái)開(kāi)始實(shí)現(xiàn)具體的功能。1給地圖控件加載圖層這里以加載shapefile格式的數(shù)據(jù)為例,先創(chuàng)建一個(gè)全局的方法AddShpFile,實(shí)現(xiàn)如下:PublicSub AddShpFile(>ByVal FilePathAsString,ByVal FileNameAsString)Dim dcAsNew DataConnection()dc.Database() = FilePathIf dc.Connect ThenDim lyrAsNew
11、 MapLayer()lyr.GeoDataset = dc.FindGeoDataset(FileName)AxMap1.Layers.Add(lyr)ElseMsgBox("No such a file exists")End IfEnd Sub然后在窗體上添加一個(gè)Button控件,并在它的Click事件里調(diào)用AddShpFile方法:PrivateSub Button1_Click(>ByVal senderAs System.Object, _ByVal eAs System.EventArgs)Handles Button1.ClickDim FilePat
12、hAsString = "D:ESRIMapObjects2.2SamplesDataWorld"Dim FileNameAsString = "country.shp"'以上兩行根據(jù)實(shí)際情況進(jìn)行適當(dāng)修改AddShpFile(FilePath, FileName)End Sub此時(shí)按F5鍵運(yùn)行程序,點(diǎn)擊窗口上的Button1按鈕,一幅世界地圖就加載上來(lái)了。2 地圖的放大、漫游和全景顯示在AxMap控件的MouseDownEvent事件里加入實(shí)現(xiàn)地圖的放大和漫游的代碼,如下:PrivateSub AxMap1_MouseDownEvent(>
13、ByVal senderAsObject, _ByVal eAs ESRI.MapObjects2.Core.MouseDownEventArgs)Handles AxMap1.MouseDownEventIf e.button = 1 Then'在AxMap控件上按下鼠標(biāo)左鍵后做拉框操作,實(shí)現(xiàn)地圖放大功能Dim pRectAs RectanglepRect =Me.AxMap1.TrackRectangleIfNot pRectIsNothing ThenMe.AxMap1.MousePointer = MousePointerConstants.moZoomInMe.AxMap1.
14、Extent = pRectEnd IfElse'在AxMap控件上按下鼠標(biāo)右鍵鍵后做拖動(dòng)操作,實(shí)現(xiàn)地圖漫游功能Me.AxMap1.MousePointer = MousePointerConstants.moPanningMe.AxMap1.Pan()Me.AxMap1.MousePointer = MousePointerConstants.moPanEnd IfEnd Sub在AxMap控件的DblClick事件里加入實(shí)現(xiàn)地圖全景顯示的代碼,如下:PrivateSub AxMap1_DblClick(>ByVal senderAsObject, _ByVal eAs Sys
15、tem.EventArgs)Handles AxMap1.DblClick'在AxMap控件上雙擊,實(shí)現(xiàn)地圖全景顯示功能AxMap1.Extent = AxMap1.FullExtentEnd Sub3 地圖要素定位在窗體上添加一個(gè)TextBox控件,在它的KeyDown事件里加入實(shí)現(xiàn)地圖要素定位的代碼,如下:PrivateSub TextBox1_KeyDown(>ByVal senderAsObject, _ByVal eAs System.Windows.Forms.KeyEventArgs)Handles TextBox1.KeyDownIf e.KeyCode = Ke
16、ys.Return ThenDim expAsString = "NAME = '" + TextBox1.Text + "'"Dim lyrAs MapLayer =Me.AxMap1.Layers.Item(0)Dim recsAs Recordset = lyr.SearchExpression(exp)IfNot recs.EOF ThenDim resAs Polygon = recs.Fields.Item("Shape").ValueDim extAs Rectangle = res.Extentext.
17、ScaleRectangle(2.0)Me.AxMap1.Extent = extMe.AxMap1.CtlRefresh()Me.AxMap1.FlashShape(res, 3)End IfEnd IfEnd Sub此時(shí)按F5鍵運(yùn)行程序,點(diǎn)擊窗口上的Button1按鈕加載世界地圖,然后在TextBox文字輸入行里輸入想要查詢的國(guó)家的名稱,比如China,最后按回車鍵確定,China就會(huì)顯示到地圖的中央,并高亮閃爍三次,如圖2。到這里,一個(gè)簡(jiǎn)單的電子地圖的應(yīng)用程序就完成了。有過(guò)在VB、VC或Delphi環(huán)境里開(kāi)發(fā)MapObjects的GIS工作者可能會(huì)發(fā)現(xiàn),了解了.NET的工作機(jī)制之后,在.
18、NET環(huán)境里開(kāi)發(fā)MapObjects 2.2的應(yīng)用并不會(huì)有太多的困難。盡管如此,還是有幾個(gè)問(wèn)題是需要我們注意的。1.MapObjects的Refresh方法與AxHost的Refresh方法的比較.NET框架提供了一個(gè)名叫AxHost的類,它是一種控件。凡是以AxHost為基類繼承而來(lái)的類都可以置于Windows的窗口上。ActiveX控件在.NET里的應(yīng)用就是通過(guò)利用AxHost類來(lái)實(shí)現(xiàn)的。MapObjects 2.2中的AxMap類就是從AxHost類繼承而來(lái)的,所以它能置于Windows的窗口之上,當(dāng)然它包含了對(duì)潛在的ActiveX控件Map的引用??墒牵珹xHost也有一個(gè)名叫Refr
19、esh的方法,這剛好與MapObjects 2.2的ActiveX控件Map的一個(gè)方法同名。所以當(dāng)在調(diào)用AxMap.Refresh方法的時(shí)候,其實(shí)是在調(diào)用從AxHost繼承下來(lái)的方法。而MapObjects自己的Refresh方法已被改名為CtlRefresh,為了實(shí)現(xiàn)刷新地圖的功能,現(xiàn)在要改用CtlRefresh,也就是AxMap.CtlRefresh。事實(shí)上,像這樣在ActiveX控件的同名成員之前加上“Ctl”的前綴是一種標(biāo)準(zhǔn)的協(xié)定。2.數(shù)據(jù)類型匹配C#語(yǔ)言本身對(duì)數(shù)據(jù)類型的檢查就很嚴(yán)格,我們常常需要通過(guò)顯式的類型轉(zhuǎn)換來(lái)滿足它的要求。盡管從語(yǔ)法來(lái)講在VB.NET環(huán)境里這方面的工作我們可以做
20、得比較“模糊”,但事實(shí)上,如果在工程里做了相應(yīng)的設(shè)置,VB.NET對(duì)同樣的問(wèn)題也會(huì)變得很“斤斤計(jì)較”。所以為了程序在編譯時(shí)和運(yùn)行時(shí)更少地出現(xiàn)錯(cuò)誤,必須規(guī)范這方面的工作。舉個(gè)例子,應(yīng)該是:C#ESRI.MapObjects2.Core.MapLayer lyr = (ESRI.MapObjects2.Core.MapLayer) axMap1.Layers.Item(0);VisualBasicDim lyr As ESRI.MapObjects2.Core.MapLayer = CType(AxMap1.Layers.Item(0), ESRI.MapObjects2.Core.MapLaye
21、r)而不是:C#ESRI.MapObjects2.Core.MapLayer lyr = axMap1.Layers.Item(0);VB.NETDim lyr As ESRI.MapObjects2.Core.MapLayer = AxMap1.Layers.Item(0)關(guān)于類型匹配還有一個(gè)很典型的例子就是MapObjects 中Color的使用。MapObjects 中的Color是OLE_COLOR類型的,應(yīng)用在.NET里它等同于無(wú)符號(hào)的32位整數(shù)行(UINT32),所以要做必要的類型轉(zhuǎn)換,盡管轉(zhuǎn)換是非常方便的:C#ESRI.MapObjects2.Core.Symbol sym =
22、new ESRI.MapObjects2.Core.SymbolClass();sym.Color = Convert.ToUInt32(ESRI.MapObjects2.Core.ColorConstants.moRed);VB.NETDim sym As ESRI.MapObjects2.Core.Symbol = New ESRI.MapObjects2.Core.Symbol()sym.Color = Convert.ToUInt32(ESRI.MapObjects2.Core.ColorConstants.moRed)3. 常數(shù)的使用.NET為MapObjects 2.2的常數(shù)枚舉類
23、型都作了包裝,它們都是從System.Enum類繼承下來(lái)的。在代碼中使用這些常數(shù)時(shí)必須使用完整的枚舉名稱來(lái)限定所用的常數(shù)。C#ESRI.MapObjects2.Core.Symbol sym = new ESRI.MapObjects2.Core.SymbolClass();sym.SymbolType = ESRI.MapObjects2.Core.SymbolTypeConstants.moFillSymbol;VisualBasicDim sym As ESRI.MapObjects2.Core.Symbol = New ESRI.MapObjects2.Core.SymbolClass
24、()sym.SymbolType = ESRI.MapObjects2.Core.SymbolTypeConstants.moFillSymbol(王嘉彬) .NET環(huán)境下MapObjects編程存在的問(wèn)題及解決方法蔡德利(黑龍江八一農(nóng)墾大學(xué)植物科技學(xué)院,大慶 163319)摘要:本文對(duì).NET環(huán)境下使用MapObjects控件開(kāi)發(fā)GIS應(yīng)用程序遇到的數(shù)據(jù)類型、右鍵上下文菜單、幾何對(duì)象序列化等問(wèn)題作了討論,分析了原因,并提出了較好的解決方法,對(duì).NET環(huán)境下GIS的開(kāi)發(fā)具有指導(dǎo)作用。關(guān)鍵字:.NET;MapObjects;幾何對(duì)象;序列化The Problems and Solutions P
25、rogramming with MapObjects in .NET EnvironmentCai Deli(College of Plant Sciences and Technology, Heilongjiang August First Land Reclamation University, Daqing 163319)Abstract:The problems of Data Types, Shortcuts Menu, Geometry Objects Serialization that we found in the course of development for GIS
26、 application with MapObjects ActiveX control were discussed in this paper. The causes were analyzed and the solutions were put forward. All this will give directions in GIS development in .NET environment.Keyword:.NET;MapObjects;Geometry Objects;Serialization0 引言 MapObjects 2.2是美國(guó)ESRI的GIS二次開(kāi)發(fā)AxtiveX
27、控件,.NET Framework提供的與COM互操作技術(shù)(COM Interop)允許對(duì)現(xiàn)有的COM組件進(jìn)行訪問(wèn)而無(wú)須修改原組件,所以ESRI為MapObject 2.2提供了運(yùn)行環(huán)境可調(diào)用包裝(RCW),讓我們可以在.NET項(xiàng)目中使用MapObjects的Map控件及相關(guān)對(duì)象。 .NET開(kāi)發(fā)環(huán)境是一套向下兼容的應(yīng)用程序開(kāi)發(fā)工具,盡管編程技術(shù)與以前變化不大,但一些功能的增強(qiáng)和語(yǔ)言上的差異導(dǎo)致MapObjects在.NET項(xiàng)目開(kāi)發(fā)時(shí)存在著較多的問(wèn)題,下面就針對(duì)它們討論相應(yīng)的解決方法。1 數(shù)據(jù)類型 數(shù)據(jù)類型用來(lái)聲明編程元素的取值范圍和存儲(chǔ)方式。在默認(rèn)情況下,Visual Basic編譯器要求每個(gè)
28、局部變量在使用之前必須聲明,雖聲明但無(wú)數(shù)據(jù)類型的變量都具有Object數(shù)據(jù)類型。如果用Object聲明變量,則變量只能使用Object類的成員。而用特定的類聲明變量時(shí),變量可以訪問(wèn)由該類公開(kāi)的所有方法和屬性。 在MapObjects中進(jìn)行數(shù)據(jù)訪問(wèn),使用如下語(yǔ)句移動(dòng)數(shù)據(jù)指針: myLayer.Records.MoveFirst() myLayer.Records.MoveNext()此時(shí)Recordset中的數(shù)據(jù)指針并不移動(dòng),應(yīng)將程序改為: Dim myRecs as ESRI.MapObjects2.Core.Recordset myRecs = myLayer.Records '或m
29、yRecs = Ctype(myLayer.Records, ESRI.MapObjects2.Core.Recordset) myRecs.MoveFirst() myRecs.MoveNext() 在訪問(wèn)圖層時(shí)也存在同樣的問(wèn)題,如果直接訪問(wèn)圖層: Map1.Layers.Item(0).records.NET會(huì)認(rèn)為Records是Object類型,而并不是Recordset類型,所以應(yīng)寫作: Dim myLayer As ESRI.MapObjects2.Core.MapLayer myLayer = Ctype(Map1.Layers.Item(0), ESRI.MapObjects2.
30、Core.MapLayer) Dim myRecs as ESRI.MapObjects2.Core.Recordset myRecs = Ctype(myLayer.Records, ESRI.MapObjects2.Core.Recordset) MapObjects中的Color是OLE_COLOR類型的,在.NET中相當(dāng)于無(wú)符號(hào)整數(shù)(System.UInt32),而無(wú)符號(hào)整數(shù)并不是Visual Basic.NET提供的數(shù)據(jù)類型,所以不受VB.NET支持。因此,要利用System命名空間的Convert類將一個(gè)基本數(shù)據(jù)類型轉(zhuǎn)換為另一個(gè)基本數(shù)據(jù)類型,程序如下: Dim sym As New
31、 ESRI.MapObjects2.Core.Symbol sym.Color = Convert.ToUInt32(ESRI.MapObjects2.Core.ColorConstants.moRed)2 右鍵菜單圖1 Map控件加入到TabControl控件中實(shí)現(xiàn)右鍵菜單 Windows應(yīng)用程序右鍵上下文菜單是非常有效的操作方式,在.NET下實(shí)現(xiàn)右鍵菜單很簡(jiǎn)單。Control類具有ContextMenu屬性,其派生類也具有ContextMenu屬性,在應(yīng)用程序中只需創(chuàng)建一個(gè)ContextMenu對(duì)象,并賦于相應(yīng)對(duì)象的ContextMenu屬性就可以了。但MapObjects的Map控件卻沒(méi)
32、有ContextMenu屬性。 解決這個(gè)問(wèn)題的方法是,將Map控件放到一個(gè)容器控件中,設(shè)置Map控件的Dock屬性為Fill,使兩者合為一個(gè)整體。然后,將建立的ContextMenu對(duì)象賦于容器控件的ContextMenu屬性。 .NET提供的容器控件主要有Panel、TabControl和GroupBox。在TabControl中實(shí)現(xiàn)上下文菜單的效果如圖1所示。3 幾何對(duì)象的序列化 .NET中的序列化是將對(duì)象狀態(tài)轉(zhuǎn)變?yōu)榭杀3只騻鬏數(shù)母袷降倪^(guò)程,與其相反的操作是反序列化。序列化包括二進(jìn)制序列化和XML序列化兩種技術(shù)。 通常一個(gè)類包含非托管的內(nèi)存或文件句柄時(shí),是不支持序列化的。COM組件、Axt
33、iveX接口和Win32 API函數(shù)都是非托管代碼,因此,MapObjects的幾何對(duì)象均不支持序列化操作,無(wú)法直接轉(zhuǎn)變?yōu)槎M(jìn)制或XML數(shù)據(jù),從而進(jìn)行遠(yuǎn)程傳輸。 對(duì)MapObjects的Polygon對(duì)象進(jìn)行考察發(fā)現(xiàn),Polygon對(duì)象由一個(gè)Parts對(duì)象構(gòu)成,Parts中的每個(gè)Part對(duì)象都是Points對(duì)象,Points對(duì)象中有若干個(gè)Point對(duì)象,當(dāng)不包含Z值時(shí),Point對(duì)象的(x,y)是Polygon對(duì)象的一個(gè)拐點(diǎn)。 因此,可以編寫以下程序?qū)⒁粋€(gè)Polygon轉(zhuǎn)變?yōu)槎M(jìn)制數(shù)據(jù): Public Function ConvertPolygonToByte(ByVal oPoly As E
34、SRI.MapObjects2.Core.Polygon) As Byte() Dim bytCount(2), bytData(8), bytPoly() As Byte Dim intByteCount As Integer = 0 Dim shtPartCount As Short = oPoly.Parts.Count '部件數(shù) Dim dblXY As Double, i As Short bytCount = BitConverter.GetBytes(shtPartCount) '轉(zhuǎn)換部件數(shù)為byte() ReDim Preserve bytPoly(intByt
35、eCount + 2) Array.Copy(bytCount, 0, bytPoly, intByteCount, 2) intByteCount +=2 For i = 0 To shtPartCount - 1 Dim oPart As ESRI.MapObjects2.Core.Points = oPoly.Parts.Item(i) Dim shtPointCount As Short = oPart.Count '點(diǎn)數(shù) bytCount = BitConverter.GetBytes(shtPointCount) '轉(zhuǎn)換點(diǎn)數(shù)為byte() ReDim Preserv
36、e bytPoly(intByteCount + 2) Array.Copy(bytCount, 0, bytPoly, intByteCount, 2) intByteCount +=2 Dim j As Short For j = 0 To shtPointCount - 1 Dim oPoint As ESRI.MapObjects2.Core.Point = oPart.Item(j) dblXY = oPoint.X bytData = BitConverter.GetBytes(dblXY) ReDim Preserve bytPoly(intByteCount + 8) Arra
37、y.Copy(bytData, 0, bytPoly, intByteCount, 8) intByteCount += 8 dblXY = oPoint.Y bytData = BitConverter.GetBytes(dblXY) ReDim Preserve bytPoly(intByteCount + 8) Array.Copy(bytData, 0, bytPoly, intByteCount, 8) intByteCount += 8 Next Next Return bytPoly End Function 序列化后的數(shù)據(jù)可以作為一個(gè)原子值在程序或網(wǎng)絡(luò)上傳輸,要想還原為原來(lái)的P
38、olygon對(duì)象還需要以下反序列化程序: Public Function ConvertByteToPolygon(ByVal bytData() As Byte) As ESRI.MapObjects2.Core.Polygon Dim oPoly As New ESRI.MapObjects2.Core.Polygon Dim intByteCount As Integer = 0 Dim shtPartCount As Short shtPartCount = BitConverter.ToInt16(bytData, intByteCount) intByteCount += 2 Di
39、m i As Short For i = 0 To shtPartCount - 1 Dim oPart As New ESRI.MapObjects2.Core.Points Dim shtPointCount As Short shtPointCount = BitConverter.ToInt16(bytData, intByteCount) intByteCount += 2 Dim j As Short For j = 0 To shtPointCount - 1 Dim oPoint As New ESRI.MapObjects2.Core.Point oPoint.X = Bit
40、Converter.ToDouble(bytData, intByteCount) intByteCount += 8 oPoint.Y = BitConverter.ToDouble(bytData, intByteCount) intByteCount += 8 oPart.Add(oPoint) Next oPoly.Parts.Add(oPart) Next Return oPoly End Function參考文獻(xiàn)1 吳長(zhǎng)悅,李國(guó)棟. MapObjects開(kāi)發(fā)GIS軟件技術(shù)簡(jiǎn)介J. 礦山測(cè)量. 2002,(2):16-172 翟長(zhǎng)江,張秋文. 基于控件MapObjects開(kāi)發(fā)GIS應(yīng)
41、用系統(tǒng)J. 微計(jì)算機(jī)信息. 2003,19(5):82-833 劉光,劉小東編著. 地理信息系統(tǒng)二次開(kāi)發(fā)實(shí)例教程VB.NET和MapObjects實(shí)現(xiàn)M. 北京:清華大學(xué)出版社, 2004.54 王嘉彬. MapObjects 2.2在Visual Studio.NET環(huán)境里的開(kāi)發(fā). ESRI中國(guó)通訊. 2003年4月,總第14期. http:/www.esrichina-在.NET中給Mapobjects地圖控件添加右鍵菜單整理時(shí)間 2004-11-29 閱讀次數(shù) 4603 作者:AjiG 文字大?。骸敬蟆俊局小俊拘 ?#160;在一個(gè)Wind
42、ows應(yīng)用程序中,右鍵的彈出菜單是非常有效和有用的操作方式,在 .NET中許多控件都有右鍵菜單的屬性項(xiàng)(ContextMenu),只要你創(chuàng)建一個(gè)ContextMenu對(duì)象然后把它賦給你需要設(shè)置彈出菜單的控件就可以了,但是在Mapobjects的地圖控件中并不提供右鍵菜單屬性。我們是不是就沒(méi)辦法給其甚至一個(gè)右鍵菜單?當(dāng)然可以,我們可以通過(guò)其他控件來(lái)輔助實(shí)現(xiàn)。具體思路如下:我們可以借助容器控件(Panel)讓他浮動(dòng)在Mapobjects地圖控件之上,設(shè)定它的大小為(0,0)主要是讓它對(duì)用戶來(lái)說(shuō)不可視,然后我們創(chuàng)建一個(gè)彈出菜單(ContextMenu)加上一些常用的菜單項(xiàng)如放大、縮小、漫游等。把這個(gè)
43、彈出菜單賦給容器控件(Panel)的ContextMenu屬性。最后在Mapobjects的鼠標(biāo)按下事件中把容器控件重新定位到鼠標(biāo)當(dāng)前的位置,并使彈出菜單彈出即可。 1、 首先創(chuàng)建一個(gè)Windows應(yīng)用程序項(xiàng)目MO RightMenu Example 圖一 新建Windows應(yīng)用程序2、 在窗體中添加控件,我們用到的主要是Mapobjects地圖控件 axMap1Panel容器panel1ContextMenu菜單 contextMenu1布局如下:圖二在應(yīng)用程序窗體中添
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 船舶建造材料創(chuàng)新考核試卷
- 石油產(chǎn)品營(yíng)銷渠道整合優(yōu)化考核試卷
- 玉石加工過(guò)程中的能耗與減排考核試卷
- 紡織原料企業(yè)動(dòng)態(tài)考核試卷
- 營(yíng)養(yǎng)補(bǔ)充劑批發(fā)商的綠色營(yíng)銷策略實(shí)施考核試卷
- 航天器空間飛行器對(duì)接機(jī)構(gòu)考核試卷
- 起重機(jī)制造材料性能優(yōu)化與選材指導(dǎo)考核試卷
- 森林火災(zāi)撲救安全防護(hù)知識(shí)考核試卷
- 淘寶店鋪直播平臺(tái)內(nèi)容運(yùn)營(yíng)合作協(xié)議
- 股權(quán)激勵(lì)行權(quán)協(xié)議(含稅務(wù)籌劃、分紅及股權(quán)激勵(lì)期限延長(zhǎng))
- 《n次方根與分?jǐn)?shù)指數(shù)冪》名師課件
- 安裝調(diào)試費(fèi)合同
- 中國(guó)非物質(zhì)文化遺產(chǎn)作文400字故宮
- 2024年貴州卷新高考物理試題真題及答案詳解(精校打印版)
- 第15章 群眾與公民
- 2024年云南省盤龍區(qū)中考一??荚嚁?shù)學(xué)試題
- 禽類屠宰過(guò)程衛(wèi)生控制與安全保障
- 2024年?yáng)|南亞制造執(zhí)行系統(tǒng)(MES)市場(chǎng)深度研究及預(yù)測(cè)報(bào)告
- 2024年江西南昌縣人員總量管理醫(yī)院編外備案制人員招聘326人(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 售電的居間合同模板
- JTG F40-2004 公路瀝青路面施工技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論