版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
GIS工程設(shè)計(jì)開(kāi)發(fā)綜合實(shí)習(xí)、黃長(zhǎng)青——基于C#.NET和AO/AE的GIS設(shè)計(jì)與開(kāi)發(fā)GIS工程設(shè)計(jì)開(kāi)發(fā)綜合實(shí)習(xí)、黃長(zhǎng)青——基于C#.NET和AO2Part5:ArcGISEngine二次開(kāi)發(fā)入門(mén)2Part5:ArcGISEngine二次開(kāi)發(fā)入門(mén)3ArcGISEngine二次開(kāi)發(fā)入門(mén)5.1ArcGISEngine簡(jiǎn)介5.2ArcGISEngine開(kāi)發(fā)起步
5.3屬性查詢5.4空間查詢5.5BaseCommand開(kāi)發(fā)實(shí)例5.6BaseTool開(kāi)發(fā)實(shí)例5.7通過(guò)代碼添加圖層5.8構(gòu)建一個(gè)簡(jiǎn)單的GIS應(yīng)用5.9問(wèn)題解決方法及幫助文檔的使用3ArcGISEngine二次開(kāi)發(fā)入門(mén)5.1Arc5.1ArcGISEngine簡(jiǎn)介ArcGISEngine的功能十分強(qiáng)大。作為ArcGISEngine開(kāi)發(fā)者,您可以實(shí)現(xiàn)以下列出的和其他更多的功能,這包括:用多個(gè)圖層來(lái)顯示地圖,例如道路、水系、邊界等地圖的漫游和縮放地圖上要素的確認(rèn)地圖上要素的查詢和定位根據(jù)屬性值顯示注記根據(jù)航片或者衛(wèi)片顯示圖像繪制幾何圖形,例如點(diǎn)、線、弧、多邊形添加描述性的文字5.1ArcGISEngine簡(jiǎn)介ArcGISEn沿著線選擇或者選擇矩形、某一范圍內(nèi)、多邊形等內(nèi)部的要素選擇距離在某一范圍內(nèi)的要素利用SQL語(yǔ)言來(lái)尋找和選擇要素利用專題地圖來(lái)渲染要素,如唯一值法、分級(jí)法和點(diǎn)狀密度法動(dòng)態(tài)顯示實(shí)時(shí)地圖或者時(shí)序數(shù)據(jù)根據(jù)地理編碼來(lái)尋找位置轉(zhuǎn)換您地圖的坐標(biāo)系根據(jù)幾何操作來(lái)生成緩沖區(qū)、計(jì)算差值,或者進(jìn)行求交、求并等運(yùn)算編輯要素形狀或者旋轉(zhuǎn)地圖創(chuàng)建并更新要素的幾何形狀及其屬性沿著線選擇或者選擇矩形、某一范圍內(nèi)、多邊形等內(nèi)部的要素編輯要素(EditingFeatures)ArcGISEngine開(kāi)發(fā)包讓您構(gòu)建出能創(chuàng)建、修改和刪除geodatabase中矢量要素或者shapefile文件的應(yīng)用程序。標(biāo)準(zhǔn)的ArcGISEngineRuntime能夠讓編輯shapefile文件或者personalgeodatabase中簡(jiǎn)單要素的程序運(yùn)行。然而,要構(gòu)建企業(yè)級(jí)geodatabase的全部功能,就需要ArcGISEngineRuntime中的GeodatabaseUpdate選項(xiàng)。編輯要素(EditingFeatures)ArcGISE空間建模和分析空間建模和通過(guò)增加ArcGISEngineRuntime中的Spatial選項(xiàng),您能夠擴(kuò)展ArcGISEngine的功能。這個(gè)選項(xiàng)(Spatial選項(xiàng))能提供一系列強(qiáng)勁的空間建模和分析功能。您能夠創(chuàng)建、查詢、表達(dá)和分析基于象元的柵格數(shù)據(jù),能夠集成柵格和矢量數(shù)據(jù)進(jìn)行分析,能夠從已有數(shù)據(jù)挖掘出新的信息,能夠從多層數(shù)據(jù)中查詢信息,能夠在ArcGISEngine應(yīng)用程序中完美集成基于象元的柵格數(shù)據(jù)和矢量數(shù)據(jù)??臻g建模和分析空間建模和通過(guò)增加ArcGISEngine三維可視化等ArcGISEngineRuntime中的3D選項(xiàng)讓您通過(guò)使用Scene和Globe控件來(lái)有效的表達(dá)和分析區(qū)域及全球數(shù)據(jù)。例如,您能夠:顯示Scene和Globe文檔展示交互性的透視圖,包括漫游、縮放、旋轉(zhuǎn)、傾斜、模擬飛行以便于表達(dá)和分析顯示真實(shí)世界的表面要素,例如樓房展示視域和可見(jiàn)范圍分析、場(chǎng)景高度內(nèi)插、剖面分析和最短距離分析三維可視化等ArcGISEngineRuntime中的3這個(gè)例子將引導(dǎo)您創(chuàng)建第一個(gè)簡(jiǎn)單的地圖顯示程序,并添加基本的縮放和漫游功能。如果您之前沒(méi)有接觸過(guò)ArcGISEngine的開(kāi)發(fā),那么這個(gè)例子是您邁入ArcGISEngine二次開(kāi)發(fā)大門(mén)的極好例子,如果您之前沒(méi)有接觸C#.NET,也無(wú)需擔(dān)心,這個(gè)例子將從零開(kāi)始引導(dǎo)您一步一步完成任務(wù)。5.2ArcGISEngine開(kāi)發(fā)起步——第一個(gè)簡(jiǎn)單的地圖顯示程序這個(gè)例子將引導(dǎo)您創(chuàng)建第一個(gè)簡(jiǎn)單的地圖顯示程序,并添加基本的縮首先打開(kāi)MicrosoftVisualStudio2005,點(diǎn)擊菜單欄中的“文件”—>“新建項(xiàng)目”,在彈出的對(duì)話框中選擇新建一個(gè)C#的Windows應(yīng)用程序,之后更改項(xiàng)目名稱為“MapView”,更改文件的路徑為個(gè)人實(shí)習(xí)文件夾,點(diǎn)擊“確定”即可。創(chuàng)建一個(gè)新的工程圖23新建項(xiàng)目對(duì)話框首先打開(kāi)MicrosoftVisualStudio20點(diǎn)擊編譯器最左側(cè)的“工具箱”,在彈出的選擇項(xiàng)中找到“ArcGISWindowsForms”項(xiàng),單擊其中的MapControl,之后在Form1的空白處單擊鼠標(biāo)左鍵不放并拖拽鼠標(biāo),直到調(diào)整MapControl到合適的大小再松開(kāi)鼠標(biāo)(您也可以直接在工具箱中雙擊MapControl,該控件則會(huì)自動(dòng)加入到Form1中)。用同樣的方法,再將LicenseControl添加到Form1中。添加控件及引用圖24工具箱點(diǎn)擊編譯器最左側(cè)的“工具箱”,在彈出的選擇項(xiàng)中找到“ArcG如果您在工具箱中找不到MapControl,則請(qǐng)依次嘗試以下兩種解決方案。首先單擊工具欄,待工具箱彈出之后,在工具箱的任意位置上單擊鼠標(biāo)右鍵,從彈出菜單中選擇“重置工具箱”。如果這一步操作之后仍然無(wú)法看到MapControl,則請(qǐng)滑動(dòng)工具欄右側(cè)的滾動(dòng)條至最底部,找到“常規(guī)”選項(xiàng)卡,然后在“常規(guī)”選項(xiàng)卡上單擊鼠標(biāo)右鍵,在彈出菜單中單擊“選擇項(xiàng)(I)…”,在彈出的對(duì)話框中找到“AxLicenseControl”和“AxMapControl”,將這兩項(xiàng)前的復(fù)選框打上勾,最后點(diǎn)擊確定即可(如果在“.NETFramework組件”這個(gè)面板中找不到這兩項(xiàng),則選擇“COM組件”面板,在“ESRILicenseControl”和“ESRIMapControl”前面打勾)。圖25重置工具箱如果您在工具箱中找不到MapControl,則請(qǐng)依次嘗試以下圖26選擇項(xiàng)…圖27選擇工具箱項(xiàng)圖26選擇項(xiàng)…圖27選擇工具箱項(xiàng)圖28選擇工具箱項(xiàng)圖28選擇工具箱項(xiàng)添加好MapControl和LicenseControl之后,調(diào)整Form1和MapControl的位置與大小,如下圖所示:圖29窗體布局添加好MapControl和LicenseControl之后在MapControl上單擊鼠標(biāo)右鍵,選擇“屬性”,則會(huì)彈出MapControl的屬性設(shè)置面板,在之前也介紹過(guò),通過(guò)這個(gè)面板可以完成許多簡(jiǎn)單的工作。如圖所示,點(diǎn)擊“Map”面板,之后點(diǎn)擊按鈕,在彈出的對(duì)話框中選擇下圖所示的路徑(注:筆者的ArcGIS安裝在D盤(pán),若您的ArcGIS裝在別的盤(pán)符,請(qǐng)做相應(yīng)修改),再在此路徑下選擇“States”,點(diǎn)擊“Open”。之后在MapControl的屬性頁(yè)上點(diǎn)擊“確定”即可。添加地圖圖30文件添加路徑在MapControl上單擊鼠標(biāo)右鍵,選擇“屬性”,則會(huì)彈出至此,我們已經(jīng)完成了一個(gè)最簡(jiǎn)單的地圖顯示程序,下面一起來(lái)看一下成果吧。點(diǎn)擊“啟動(dòng)調(diào)試”按鈕(或者在“調(diào)試”菜單下選擇相應(yīng)命令,或者按鍵盤(pán)的F5鍵),可以得到如下的運(yùn)行結(jié)果。圖31“啟動(dòng)調(diào)試”按鈕至此,我們已經(jīng)完成了一個(gè)最簡(jiǎn)單的地圖顯示程序,下面一起來(lái)看一圖32初次運(yùn)行結(jié)果圖32初次運(yùn)行結(jié)果我們沒(méi)有書(shū)寫(xiě)任何代碼,就得到了一個(gè)最簡(jiǎn)單的地圖顯示程序。但這個(gè)程序還不能與用戶交互,下一步我們需要添加一些代碼,讓程序能響應(yīng)用戶的鼠標(biāo),完成放大和全圖顯示的功能。添加基本的代碼圖33MapControl控件支持的所有方法我們沒(méi)有書(shū)寫(xiě)任何代碼,就得到了一個(gè)最簡(jiǎn)單的地圖顯示程序。但這雙擊MapControl控件,可以進(jìn)入代碼編輯界面。從窗口上方的下拉列表框中,我們能夠看到MapControl能夠響應(yīng)的所有事件(關(guān)于每個(gè)事件的詳細(xì)使用方法等請(qǐng)參見(jiàn)幫助系統(tǒng),第六章對(duì)幫助系統(tǒng)有更加詳細(xì)的介紹)。雙擊MapControl進(jìn)入代碼編輯界面的時(shí)候,默認(rèn)的是“OnMouseDown”事件,下一步就需要在這個(gè)事件中添加響應(yīng)鼠標(biāo)的相關(guān)代碼。請(qǐng)您在PrivateSubAxMapControl1_OnMouseDown函數(shù)中添加如下代碼:
if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;雙擊MapControl控件,可以進(jìn)入代碼編輯界面。從窗口上再次運(yùn)行程序,鼠標(biāo)左鍵在地圖上拉框可以實(shí)現(xiàn)地圖的放大功能,而右鍵單擊地圖則會(huì)還原地圖的全圖顯示。圖34任意比例尺放大功能再次運(yùn)行程序,鼠標(biāo)左鍵在地圖上拉框可以實(shí)現(xiàn)地圖的放大功能,而如果將代碼替換如下,則能實(shí)現(xiàn)左鍵放大,右鍵漫游的功能。if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Pan();如果將代碼替換如下,則能實(shí)現(xiàn)左鍵放大,右鍵漫游的功能。下面我們依次來(lái)看看這些代碼都代表什么意思。首先看來(lái)第一段:if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;這個(gè)代碼是一個(gè)IfElse條件語(yǔ)句,關(guān)于“e”的詳細(xì)定義及其中包含的各參數(shù),請(qǐng)參考幫助中與“IMapControlEvents2,OnMouseDownEventHandlerdelegate”關(guān)鍵字相關(guān)的內(nèi)容。代碼解釋下面我們依次來(lái)看看這些代碼都代表什么意思。首先看來(lái)第一段:代可以根據(jù)e中包含的“button”值來(lái)判斷鼠標(biāo)的單擊操作是來(lái)自何處,若button值為1,則為鼠標(biāo)左鍵,2代表鼠標(biāo)右鍵,4代表鼠標(biāo)中鍵。當(dāng)判斷得到是鼠標(biāo)左鍵單擊時(shí),執(zhí)行“AxMapControl1.Extent=AxMapControl1.TrackRectangle”這條語(yǔ)句,其中,等號(hào)右側(cè)是調(diào)用了“TrackRectangle”方法,這個(gè)方法是在地圖上拖拽出一個(gè)矩形,之后將這個(gè)矩形賦值給當(dāng)前地圖的顯示區(qū)域(Extent),這樣就實(shí)現(xiàn)了地圖的放大功能。類似的,若鼠標(biāo)右鍵單擊,則將全圖范圍賦值給當(dāng)前的顯示范圍,實(shí)現(xiàn)了地圖的全圖顯示功能。第二段代碼與第一段結(jié)構(gòu)一樣,只是在右鍵的相應(yīng)事件上略有不同,這是調(diào)用了“Pan”方法,實(shí)現(xiàn)了地圖的漫游功能。可以根據(jù)e中包含的“button”值來(lái)判斷鼠標(biāo)的單擊操作是來(lái)通過(guò)這個(gè)例子,我們制作出了一個(gè)最簡(jiǎn)單的地圖瀏覽程序MapView,并能響應(yīng)一些基本的鼠標(biāo)操作。在MapControl的屬性頁(yè)中,其實(shí)還有許多內(nèi)容您可以嘗試,例如在“General”面板中可以直接加入地圖文件(*.mxd或者*.mxt),您也可以利用剛才的方式一次性多加入一些圖層而不僅僅加入“States”一個(gè),同時(shí)可以更改各圖層的疊放次序,也可以在“Data”面板中設(shè)置地圖的旋轉(zhuǎn)角度(Rotation)等,您還可以設(shè)置MapControl的顯示方式,是否支持地圖的預(yù)覽功能,邊框樣式等等。您可以做一些嘗試,看看能得到哪些有趣的結(jié)果,這些嘗試對(duì)您今后熟悉ArcGISEngine的開(kāi)發(fā)是有一定幫助的。如果需要重置MapControl,只需要點(diǎn)擊“Data”面板中的“Reset”按鈕。當(dāng)您完成了這個(gè)例子,并做了一些積極的嘗試之后,您就可以接著學(xué)習(xí)下一個(gè)小節(jié)的內(nèi)容了。小結(jié)通過(guò)這個(gè)例子,我們制作出了一個(gè)最簡(jiǎn)單的地圖瀏覽程序MapVi查詢是GIS中非常重要的一個(gè)功能,下面將分別介紹屬性查詢和空間查詢的制作方法。5.3屬性查詢添加控件如果上一小節(jié)的工程已經(jīng)關(guān)閉,則將其打開(kāi),如果您之后又在MapControl中添加了一些別的數(shù)據(jù),請(qǐng)將其刪除,只保留一個(gè)“states”圖層,請(qǐng)務(wù)必注意這一步,這直接關(guān)系到您下面的工作能否順利進(jìn)行。用之前講過(guò)的方式,在窗體中添加一個(gè)Label和一個(gè)TextBox。將Label的“Text”屬性修改為“StateName”,結(jié)果如下:圖35Label控件和TextBox控件查詢是GIS中非常重要的一個(gè)功能,下面將分別介紹屬性查詢和空首先添加引用。點(diǎn)擊菜單欄上的“項(xiàng)目”—>“添加引用”,在彈出的對(duì)話框中同時(shí)選擇“ESRI.ArcGIS.Carto”和“ESRI.ArcGIS.Geodatabase”(選擇的時(shí)候按下Ctrl鍵以同時(shí)選擇多個(gè)),點(diǎn)擊確定。之后雙擊TextBox1控件,進(jìn)入代碼編輯界面。在代碼編輯區(qū)域的最上方輸入以下內(nèi)容:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geodatabase;如下圖所示:添加引用和代碼圖36引用添加位置首先添加引用。點(diǎn)擊菜單欄上的“項(xiàng)目”—>“添加引用”,在彈出圖37添加引用對(duì)話框圖37添加引用對(duì)話框之后在控件TextBox的事件中選擇KeyUp,在KeyUp事件中添加以下代碼:圖38KeyPress方法之后在控件TextBox的事件中選擇KeyUp,在KeyUp
if(e.KeyCode==Keys.Enter){//定義圖層,要素游標(biāo),查詢過(guò)濾器,要素
IFeatureLayerpFeatureLayer;IFeatureCursorpFeatureCursor;IQueryFilterpQueryFilter;IFeaturepFeature;//獲取圖層
pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;//如果圖層名稱不是states,程序退出
if(pFeatureLayer.Name!="states")return;//清除上次查詢結(jié)果
this.axMapControl1.Map.ClearSelection();//pQueryFilter的實(shí)例化
pQueryFilter=newQueryFilterClass();//設(shè)置查詢過(guò)濾條件
pQueryFilter.WhereClause="STATE_NAME='"+txtStateName.Text+"'";
//查詢pFeatureCursor=pFeatureLayer.Search(pQueryFilter,true);//獲取查詢到的要素
pFeature=pFeatureCursor.NextFeature();//判斷是否獲取到要素
if(pFeature!=null){//選擇要素
this.axMapControl1.Map.SelectFeature(pFeatureLayer,pFeature);//放大到要素
this.axMapControl1.Extent=pFeature.Shape.Envelope;}else{//沒(méi)有得到pFeature的提示
MessageBox.Show("沒(méi)有找到名為"+txtStateName.Text+"的州","提示");}}}//查詢運(yùn)行程序,分別向編輯框中輸入“Texas”和“RS”,鍵入回車,如下圖所示:圖39Texas州查詢結(jié)果運(yùn)行程序,分別向編輯框中輸入“Texas”和“RS”,鍵入回圖40RS查詢結(jié)果圖40RS查詢結(jié)果
if(e.KeyCode==Keys.Enter)上述代碼是一個(gè)判斷語(yǔ)句,即當(dāng)用戶輸入回車的時(shí)候,開(kāi)始進(jìn)行查詢。下面兩行代碼是定義查詢的范圍,默認(rèn)為上一小節(jié)中添加的圖層“states”,如果找不到這個(gè)圖層則自動(dòng)退出。//獲取圖層
pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;//如果圖層名稱不是states,程序退出
if(pFeatureLayer.Name!="states")return;//清除上次查詢結(jié)果
this.axMapControl1.Map.ClearSelection();這一部分是生成一個(gè)新的查詢器,選擇條件(WhereClause)就是檢索是否有與用戶輸入相符的州,并將結(jié)果從查詢得到的pCursor中讀取出來(lái)。代碼解釋if(e.KeyCode==Keys.Enter)代碼解//判斷是否獲取到要素
if(pFeature!=null){//選擇要素
this.axMapControl1.Map.SelectFeature(pFeatureLayer,pFeature);//放大到要素
this.axMapControl1.Extent=pFeature.Shape.Envelope;}else{//沒(méi)有得到pFeature的提示
MessageBox.Show("沒(méi)有找到名為"+txtStateName.Text+"的州","提示");}
這一部分是一個(gè)判斷語(yǔ)句,若查詢得到的結(jié)果為空,則刷新地圖,彈出對(duì)話框通知用戶沒(méi)有查詢到結(jié)果,并退出程序。如果查詢得到的結(jié)果不為空,則將這個(gè)結(jié)果加入地圖的選擇集,并將地圖的顯示范圍定為查詢結(jié)果的外輪廓,這樣得到的州將高亮顯示同時(shí)居中放大到屏幕中心。//判斷是否獲取到要素這一部分中,我們接觸到了基本的屬性查詢。但是在這個(gè)例子中,我們不能實(shí)現(xiàn)對(duì)屬性表中任意屬性字段的查詢(在這個(gè)程序中,我們只能查詢州名——STATE_NAME,而不能對(duì)別的字段進(jìn)行查詢),而且這個(gè)查詢不支持模糊查詢。為了使查詢變的更加豐富,更加人性化,請(qǐng)您參考IQueryFilter接口中WhereClause屬性的設(shè)置方法,拓展WhereClause可以得到許多有趣的結(jié)果。在書(shū)寫(xiě)代碼的過(guò)程中,對(duì)任何有疑問(wèn)的地方,或者您想要拓展的位置,都可以在幫助系統(tǒng)中查詢相關(guān)的接口和屬性,查看最原始的定義,幫助系統(tǒng)中的解釋和定義對(duì)于您熟悉ArcObjects,熟悉ArcGISEngine的二次開(kāi)發(fā)以及后續(xù)的工作都是十分重要的,請(qǐng)一定不要忽視這個(gè)環(huán)節(jié)。如果您已經(jīng)嘗試了一些變化,或者對(duì)本小節(jié)的內(nèi)容比較熟悉了,則可以進(jìn)入下一小節(jié)的學(xué)習(xí)。小結(jié)這一部分中,我們接觸到了基本的屬性查詢。但是在這個(gè)例子中,我上一小節(jié)我們已經(jīng)學(xué)習(xí)了如何進(jìn)行屬性查詢,在這一小節(jié)中,我們將繼續(xù)學(xué)習(xí)GIS中的另一種查詢方式——空間查詢。如果上一小節(jié)的工程已經(jīng)關(guān)閉,則將其打開(kāi),如果您之后又在MapControl中添加了一些別的數(shù)據(jù),請(qǐng)將其刪除,只保留一個(gè)“states”圖層,請(qǐng)務(wù)必注意這一步,這直接關(guān)系到您下面的工作能否順利進(jìn)行。我們接著上一小節(jié)的內(nèi)容繼續(xù)完善。在窗體中添加一個(gè)Button,將其Text屬性修改為“點(diǎn)查詢”。5.4空間查詢添加控件圖41添加“點(diǎn)查詢”按鈕上一小節(jié)我們已經(jīng)學(xué)習(xí)了如何進(jìn)行屬性查詢,在這一小節(jié)中,我們將利用上一小節(jié)講的方式,添加引用“ESRI.ArcGIS.Geometry”,并在類中添加一個(gè)全局變量nMouseFlag,如下圖所示:添加引用和代碼圖42添加引用“ESRI.ArcGIS.Geometry”利用上一小節(jié)講的方式,添加引用“ESRI.ArcGIS.Ge之后在類中添加一個(gè)公共函數(shù),用來(lái)根據(jù)屏幕像素計(jì)算實(shí)際的地理距離privatedoubleConvertPixelToMapUnits(IActiveViewactiveView,doublepixelUnits){doublerealWorldDiaplayExtent;intpixelExtent;doublesizeOfOnePixel;doublemapUnits;//獲取設(shè)備中視圖顯示寬度,即像素個(gè)數(shù)pixelExtent=activeView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().right-activeView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().left;//獲取地圖坐標(biāo)系中地圖顯示范圍
realWorldDiaplayExtent=activeView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;//每個(gè)像素大小代表的實(shí)際距離
sizeOfOnePixel=realWorldDiaplayExtent/pixelExtent;//地理距離
mapUnits=pixelUnits*sizeOfOnePixel;returnmapUnits;}之后在類中添加一個(gè)公共函數(shù),用來(lái)根據(jù)屏幕像素計(jì)算實(shí)際的地理距此后,雙擊Button1,進(jìn)入Button的Click事件,向其中添加如下代碼://標(biāo)記點(diǎn)查詢
mMouseFlag=1;//設(shè)置鼠標(biāo)形狀
this.axMapControl1.MousePointer=ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerCrosshair;(注:上兩行代碼應(yīng)該書(shū)寫(xiě)在一行,由于空間有限,這里寫(xiě)為兩行)最后將MapControl控件的OnMouseDown事件中已有的代碼清除,替換為以下代碼:if(mMouseFlag==1){IFeatureLayerpFeatureLayer;IFeatureClasspFeatureClass;//獲取圖層和要素類,為空時(shí)返回
pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;if(pFeatureLayer.Name!="states")return;pFeatureClass=pFeatureLayer.FeatureClass;if(pFeatureClass==null)return;IActiveViewpActiveView;IPointpPoint;doublelength;
此后,雙擊Button1,進(jìn)入Button的Click事件,//獲取視圖范圍
pActiveView=this.axMapControl1.ActiveView;//獲取鼠標(biāo)點(diǎn)擊屏幕坐標(biāo)
pPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y);//2個(gè)像素大小的屏幕距離轉(zhuǎn)換為地圖距離
length=ConvertPixelToMapUnits(pActiveView,2);ITopologicalOperatorpTopoOperator;IGeometrypGeoBuffer;ISpatialFilterpSpatialFilter;//根據(jù)緩沖半徑生成空間過(guò)濾器
pTopoOperator=pPointasITopologicalOperator;pGeoBuffer=pTopoOperator.Buffer(length);pSpatialFilter=newSpatialFilterClass();pSpatialFilter.Geometry=pGeoBuffer;//根據(jù)圖層類型選擇緩沖方式
switch(pFeatureClass.ShapeType){caseesriGeometryType.esriGeometryPoint:pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;break;caseesriGeometryType.esriGeometryPolyline:pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelCrosses;break;caseesriGeometryType.esriGeometryPolygon:pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;break;}
//獲取視圖范圍//定義空間過(guò)濾器的空間字段
pSpatialFilter.GeometryField=pFeatureClass.ShapeFieldName;IQueryFilterpQueryFilter;IFeatureCursorpFeatureCursor;IFeaturepFeature;//利用要素過(guò)濾器查詢要素
pQueryFilter=pSpatialFilterasIQueryFilter;pFeatureCursor=pFeatureLayer.Search(pQueryFilter,true);pFeature=pFeatureCursor.NextFeature();intfieldIndex;if(pFeature!=null){//選擇指定要素
this.axMapControl1.Map.ClearSelection();this.axMapControl1.Map.SelectFeature((ILayer)pFeatureLayer,pFeature);this.axMapControl1.Refresh();fieldIndex=pFeature.Fields.FindField("STATE_NAME");MessageBox.Show("查找到“"+pFeature.get_Value(fieldIndex)+"”","提示");}}ArcGIS-Engine二次開(kāi)發(fā)入門(mén)課件運(yùn)行程序,結(jié)果如右圖所示:
圖43空間查詢運(yùn)行結(jié)果圖43空間查詢運(yùn)行結(jié)果距離轉(zhuǎn)換函數(shù)請(qǐng)您自行參看幫助系統(tǒng)中對(duì)相關(guān)接口的具體定義和解釋。Button1的Click事件中是將nMouseFlag設(shè)置為1,并將鼠標(biāo)在MapControl上的形狀改變?yōu)槭纸z狀。//獲取視圖范圍
pActiveView=this.axMapControl1.ActiveView;//獲取鼠標(biāo)點(diǎn)擊屏幕坐標(biāo)pPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y);//屏幕距離轉(zhuǎn)換為地圖距離
length=ConvertPixelToMapUnits(pActiveView,2);上述代碼是在MapControl的OnMouseDown事件中,當(dāng)您單擊鼠標(biāo)左鍵的時(shí)候,將屏幕上的點(diǎn)轉(zhuǎn)換成地圖上的點(diǎn)(關(guān)鍵在于坐標(biāo)值的轉(zhuǎn)換),方便后續(xù)操作。//根據(jù)緩沖半徑生成空間過(guò)濾器
pTopoOperator=pPointasITopologicalOperator;pGeoBuffer=pTopoOperator.Buffer(length);pSpatialFilter=newSpatialFilterClass();pSpatialFilter.Geometry=pGeoBuffer;代碼解釋距離轉(zhuǎn)換函數(shù)請(qǐng)您自行參看幫助系統(tǒng)中對(duì)相關(guān)接口的具體定義和解釋這一部分是將2個(gè)像素的距離轉(zhuǎn)換成實(shí)際的地理距離,并以這個(gè)距離為半徑,上一步生成的點(diǎn)為中心,生成一個(gè)緩沖區(qū)。這一部分是將2個(gè)像素的距離轉(zhuǎn)換成實(shí)際的地理距離,并以這個(gè)距離上述代碼是設(shè)置pSpatialFilter的各項(xiàng)參數(shù),供后續(xù)查詢,包括空間查詢的幾何形狀(之前生成的緩沖區(qū)),空間查詢的方式(相交,包含等)以及Shape字段。這兩句代碼是找出“STATE_NAME”所在的列數(shù),并將其顯示出來(lái)。上述代碼是設(shè)置pSpatialFilter的各項(xiàng)參數(shù),供后續(xù)在本節(jié)中我們完成更多的空間查詢功能,其中有點(diǎn)查詢、線查詢、矩形查詢、圓查詢新建一個(gè)C#.Net工程,向工程中添加控件,如下圖所示:其中包括MapControl,4個(gè)Button,一個(gè)TextBox進(jìn)一步完善空間查詢?cè)诒竟?jié)中我們完成更多的空間查詢功能,其中有點(diǎn)查詢、線查詢、矩通過(guò)在控件屬性中添加地圖的方法,向Mapcontrol中添加例子數(shù)據(jù)。(例子數(shù)據(jù)是位于World文件夾下的Continents.lyr)如下圖所示:
下面我們?cè)贛ainForm的代碼頁(yè)添加空間查詢的函數(shù)。本例中我們需要添加ESRI.ArcGIS.Carto、ESRI.ArcGIS.Geometry、ESRI.ArcGIS.Geodatabase、ESRI.ArcGIS.Controls四個(gè)個(gè)命名空間,并且我們?nèi)匀恍枰瞎?jié)中的ConvertPixelToMapUnits(IActiveViewactiveView,doublepixelUnits)函數(shù),請(qǐng)自行添加。空間查詢函數(shù)代碼如下:
///<summary>///空間查詢///</summary>///<paramname="mapControl">MapControl</param>///<paramname="geometry">空間查詢方式</param>///<paramname="fieldName">字段名稱</param>///<returns>查詢得到的要素名稱</returns>通過(guò)在控件屬性中添加地圖的方法,向Mapcontrol中添加privatestringQuerySpatial(AxMapControlmapControl,IGeometrygeometry,stringfieldName){
}{privatestringQuerySpatial(AxArcGIS-Engine二次開(kāi)發(fā)入門(mén)課件ArcGIS-Engine二次開(kāi)發(fā)入門(mén)課件在設(shè)計(jì)頁(yè)面雙擊點(diǎn)查詢按鈕,進(jìn)入點(diǎn)擊按鈕響應(yīng)事件填寫(xiě)如下代碼。相應(yīng)的線查詢、矩形查詢、圓查詢添加同樣的代碼,但nMouseFlag得值要有所改變。線查詢:nMouseFlag=2矩形查詢:nMouseFlag=3圓查詢:nMouseFlag=4為MapControl控件添加OnMouseDown事件,填入以下代碼在設(shè)計(jì)頁(yè)面雙擊點(diǎn)查詢按鈕,進(jìn)入點(diǎn)擊按鈕響應(yīng)事件填寫(xiě)如下代碼。ArcGIS-Engine二次開(kāi)發(fā)入門(mén)課件ArcGIS-Engine二次開(kāi)發(fā)入門(mén)課件點(diǎn)擊運(yùn)行,運(yùn)行效果如下圖所示:點(diǎn)擊運(yùn)行,運(yùn)行效果如下圖所示:仔細(xì)研讀代碼,您會(huì)發(fā)現(xiàn),在這部分中我們并沒(méi)有用到什么新的知識(shí),只是在結(jié)構(gòu)上做了調(diào)整,應(yīng)為空間查詢都是需要使用一個(gè)IGeometry對(duì)象進(jìn)行空間求交進(jìn)行查詢的。所以我們將公共的代碼放在公共的模塊中進(jìn)行調(diào)用。有心的同學(xué)可能發(fā)現(xiàn),我們?yōu)榱伺袛嘤脩粼贛apControl上的操作,我們引入了一個(gè)全局變量nMouseFlag,程序中多一個(gè)全局變量,對(duì)程序的結(jié)構(gòu)的封閉性就有所破壞,能不能去掉這個(gè)全局變量而是Mapcontrol自主判斷是哪個(gè)功能進(jìn)行操作呢?答案是肯定的,我們可以使用BaseCommand和BaseTool來(lái)完成這個(gè)工作,詳細(xì)的用法在3.4和3.5小節(jié)將會(huì)介紹。仔細(xì)研讀代碼,您會(huì)發(fā)現(xiàn),在這部分中我們并沒(méi)有用到什么新的知識(shí)小結(jié)
在這一小節(jié)中,我們學(xué)習(xí)了如何進(jìn)行簡(jiǎn)單的空間查詢??臻g查詢不僅包括點(diǎn)查詢,還包括線查詢,矩形查詢,多邊形查詢等(為了實(shí)現(xiàn)這些功能,可以參考MapControl中的TrackRectangle等方法)。對(duì)于這一小節(jié)的代碼,強(qiáng)烈建議您參看幫助系統(tǒng)中對(duì)相關(guān)接口的解釋和定義,以進(jìn)一步熟悉接口的使用,這對(duì)后面的學(xué)習(xí)以及掌握ArcGISEngine二次開(kāi)發(fā)是極有好處的。如果您對(duì)這一部分比較熟悉了,可以進(jìn)入下一小節(jié)。在第四章中,我們介紹了控件命令(ControlCommands),并提到ArcGISEngine允許用戶自定義開(kāi)發(fā)一些控件命令,在下兩小節(jié)中,我們將具體學(xué)習(xí)如何開(kāi)發(fā)。小結(jié)
在這一小節(jié)中,我們學(xué)習(xí)了如何進(jìn)行簡(jiǎn)單的空間查詢??臻g查5.5BaseCommand開(kāi)發(fā)實(shí)例在這一小節(jié)中,我們將學(xué)習(xí)BaseCommand的開(kāi)發(fā)步驟。BaseCommand的功能與Button的功能類似,是當(dāng)鼠標(biāo)點(diǎn)擊按鈕的時(shí)候,MapControl控件會(huì)對(duì)其中的命令做出相應(yīng)而無(wú)需額外的操作。在這一小節(jié)中,我們將制作一個(gè)“定比例尺放大”的按鈕,當(dāng)鼠標(biāo)單擊按鈕時(shí),地圖將居中放大一倍。添加控件如果上一小節(jié)的程序已經(jīng)關(guān)閉,則重新打開(kāi),同時(shí)保證MapControl控件中加載了至少一個(gè)圖層。在主窗體(frmMain)中添加一個(gè)Button,將其Text屬性更改為“居中放大”。3.3.5小結(jié)5.5BaseCommand開(kāi)發(fā)實(shí)例3.3.5小結(jié)添加BaseCommand添加BaseCommandArcGIS-Engine二次開(kāi)發(fā)入門(mén)課件添加代碼添加代碼ArcGIS-Engine二次開(kāi)發(fā)入門(mén)課件ArcGIS-Engine二次開(kāi)發(fā)入門(mén)課件小結(jié)小結(jié)End,Thanks!End,此課件下載可自行編輯修改,供參考!感謝您的支持,我們努力做得更好!此課件下載可自行編輯修改,供參考!GIS工程設(shè)計(jì)開(kāi)發(fā)綜合實(shí)習(xí)、黃長(zhǎng)青——基于C#.NET和AO/AE的GIS設(shè)計(jì)與開(kāi)發(fā)GIS工程設(shè)計(jì)開(kāi)發(fā)綜合實(shí)習(xí)、黃長(zhǎng)青——基于C#.NET和AO68Part5:ArcGISEngine二次開(kāi)發(fā)入門(mén)2Part5:ArcGISEngine二次開(kāi)發(fā)入門(mén)69ArcGISEngine二次開(kāi)發(fā)入門(mén)5.1ArcGISEngine簡(jiǎn)介5.2ArcGISEngine開(kāi)發(fā)起步
5.3屬性查詢5.4空間查詢5.5BaseCommand開(kāi)發(fā)實(shí)例5.6BaseTool開(kāi)發(fā)實(shí)例5.7通過(guò)代碼添加圖層5.8構(gòu)建一個(gè)簡(jiǎn)單的GIS應(yīng)用5.9問(wèn)題解決方法及幫助文檔的使用3ArcGISEngine二次開(kāi)發(fā)入門(mén)5.1Arc5.1ArcGISEngine簡(jiǎn)介ArcGISEngine的功能十分強(qiáng)大。作為ArcGISEngine開(kāi)發(fā)者,您可以實(shí)現(xiàn)以下列出的和其他更多的功能,這包括:用多個(gè)圖層來(lái)顯示地圖,例如道路、水系、邊界等地圖的漫游和縮放地圖上要素的確認(rèn)地圖上要素的查詢和定位根據(jù)屬性值顯示注記根據(jù)航片或者衛(wèi)片顯示圖像繪制幾何圖形,例如點(diǎn)、線、弧、多邊形添加描述性的文字5.1ArcGISEngine簡(jiǎn)介ArcGISEn沿著線選擇或者選擇矩形、某一范圍內(nèi)、多邊形等內(nèi)部的要素選擇距離在某一范圍內(nèi)的要素利用SQL語(yǔ)言來(lái)尋找和選擇要素利用專題地圖來(lái)渲染要素,如唯一值法、分級(jí)法和點(diǎn)狀密度法動(dòng)態(tài)顯示實(shí)時(shí)地圖或者時(shí)序數(shù)據(jù)根據(jù)地理編碼來(lái)尋找位置轉(zhuǎn)換您地圖的坐標(biāo)系根據(jù)幾何操作來(lái)生成緩沖區(qū)、計(jì)算差值,或者進(jìn)行求交、求并等運(yùn)算編輯要素形狀或者旋轉(zhuǎn)地圖創(chuàng)建并更新要素的幾何形狀及其屬性沿著線選擇或者選擇矩形、某一范圍內(nèi)、多邊形等內(nèi)部的要素編輯要素(EditingFeatures)ArcGISEngine開(kāi)發(fā)包讓您構(gòu)建出能創(chuàng)建、修改和刪除geodatabase中矢量要素或者shapefile文件的應(yīng)用程序。標(biāo)準(zhǔn)的ArcGISEngineRuntime能夠讓編輯shapefile文件或者personalgeodatabase中簡(jiǎn)單要素的程序運(yùn)行。然而,要構(gòu)建企業(yè)級(jí)geodatabase的全部功能,就需要ArcGISEngineRuntime中的GeodatabaseUpdate選項(xiàng)。編輯要素(EditingFeatures)ArcGISE空間建模和分析空間建模和通過(guò)增加ArcGISEngineRuntime中的Spatial選項(xiàng),您能夠擴(kuò)展ArcGISEngine的功能。這個(gè)選項(xiàng)(Spatial選項(xiàng))能提供一系列強(qiáng)勁的空間建模和分析功能。您能夠創(chuàng)建、查詢、表達(dá)和分析基于象元的柵格數(shù)據(jù),能夠集成柵格和矢量數(shù)據(jù)進(jìn)行分析,能夠從已有數(shù)據(jù)挖掘出新的信息,能夠從多層數(shù)據(jù)中查詢信息,能夠在ArcGISEngine應(yīng)用程序中完美集成基于象元的柵格數(shù)據(jù)和矢量數(shù)據(jù)??臻g建模和分析空間建模和通過(guò)增加ArcGISEngine三維可視化等ArcGISEngineRuntime中的3D選項(xiàng)讓您通過(guò)使用Scene和Globe控件來(lái)有效的表達(dá)和分析區(qū)域及全球數(shù)據(jù)。例如,您能夠:顯示Scene和Globe文檔展示交互性的透視圖,包括漫游、縮放、旋轉(zhuǎn)、傾斜、模擬飛行以便于表達(dá)和分析顯示真實(shí)世界的表面要素,例如樓房展示視域和可見(jiàn)范圍分析、場(chǎng)景高度內(nèi)插、剖面分析和最短距離分析三維可視化等ArcGISEngineRuntime中的3這個(gè)例子將引導(dǎo)您創(chuàng)建第一個(gè)簡(jiǎn)單的地圖顯示程序,并添加基本的縮放和漫游功能。如果您之前沒(méi)有接觸過(guò)ArcGISEngine的開(kāi)發(fā),那么這個(gè)例子是您邁入ArcGISEngine二次開(kāi)發(fā)大門(mén)的極好例子,如果您之前沒(méi)有接觸C#.NET,也無(wú)需擔(dān)心,這個(gè)例子將從零開(kāi)始引導(dǎo)您一步一步完成任務(wù)。5.2ArcGISEngine開(kāi)發(fā)起步——第一個(gè)簡(jiǎn)單的地圖顯示程序這個(gè)例子將引導(dǎo)您創(chuàng)建第一個(gè)簡(jiǎn)單的地圖顯示程序,并添加基本的縮首先打開(kāi)MicrosoftVisualStudio2005,點(diǎn)擊菜單欄中的“文件”—>“新建項(xiàng)目”,在彈出的對(duì)話框中選擇新建一個(gè)C#的Windows應(yīng)用程序,之后更改項(xiàng)目名稱為“MapView”,更改文件的路徑為個(gè)人實(shí)習(xí)文件夾,點(diǎn)擊“確定”即可。創(chuàng)建一個(gè)新的工程圖23新建項(xiàng)目對(duì)話框首先打開(kāi)MicrosoftVisualStudio20點(diǎn)擊編譯器最左側(cè)的“工具箱”,在彈出的選擇項(xiàng)中找到“ArcGISWindowsForms”項(xiàng),單擊其中的MapControl,之后在Form1的空白處單擊鼠標(biāo)左鍵不放并拖拽鼠標(biāo),直到調(diào)整MapControl到合適的大小再松開(kāi)鼠標(biāo)(您也可以直接在工具箱中雙擊MapControl,該控件則會(huì)自動(dòng)加入到Form1中)。用同樣的方法,再將LicenseControl添加到Form1中。添加控件及引用圖24工具箱點(diǎn)擊編譯器最左側(cè)的“工具箱”,在彈出的選擇項(xiàng)中找到“ArcG如果您在工具箱中找不到MapControl,則請(qǐng)依次嘗試以下兩種解決方案。首先單擊工具欄,待工具箱彈出之后,在工具箱的任意位置上單擊鼠標(biāo)右鍵,從彈出菜單中選擇“重置工具箱”。如果這一步操作之后仍然無(wú)法看到MapControl,則請(qǐng)滑動(dòng)工具欄右側(cè)的滾動(dòng)條至最底部,找到“常規(guī)”選項(xiàng)卡,然后在“常規(guī)”選項(xiàng)卡上單擊鼠標(biāo)右鍵,在彈出菜單中單擊“選擇項(xiàng)(I)…”,在彈出的對(duì)話框中找到“AxLicenseControl”和“AxMapControl”,將這兩項(xiàng)前的復(fù)選框打上勾,最后點(diǎn)擊確定即可(如果在“.NETFramework組件”這個(gè)面板中找不到這兩項(xiàng),則選擇“COM組件”面板,在“ESRILicenseControl”和“ESRIMapControl”前面打勾)。圖25重置工具箱如果您在工具箱中找不到MapControl,則請(qǐng)依次嘗試以下圖26選擇項(xiàng)…圖27選擇工具箱項(xiàng)圖26選擇項(xiàng)…圖27選擇工具箱項(xiàng)圖28選擇工具箱項(xiàng)圖28選擇工具箱項(xiàng)添加好MapControl和LicenseControl之后,調(diào)整Form1和MapControl的位置與大小,如下圖所示:圖29窗體布局添加好MapControl和LicenseControl之后在MapControl上單擊鼠標(biāo)右鍵,選擇“屬性”,則會(huì)彈出MapControl的屬性設(shè)置面板,在之前也介紹過(guò),通過(guò)這個(gè)面板可以完成許多簡(jiǎn)單的工作。如圖所示,點(diǎn)擊“Map”面板,之后點(diǎn)擊按鈕,在彈出的對(duì)話框中選擇下圖所示的路徑(注:筆者的ArcGIS安裝在D盤(pán),若您的ArcGIS裝在別的盤(pán)符,請(qǐng)做相應(yīng)修改),再在此路徑下選擇“States”,點(diǎn)擊“Open”。之后在MapControl的屬性頁(yè)上點(diǎn)擊“確定”即可。添加地圖圖30文件添加路徑在MapControl上單擊鼠標(biāo)右鍵,選擇“屬性”,則會(huì)彈出至此,我們已經(jīng)完成了一個(gè)最簡(jiǎn)單的地圖顯示程序,下面一起來(lái)看一下成果吧。點(diǎn)擊“啟動(dòng)調(diào)試”按鈕(或者在“調(diào)試”菜單下選擇相應(yīng)命令,或者按鍵盤(pán)的F5鍵),可以得到如下的運(yùn)行結(jié)果。圖31“啟動(dòng)調(diào)試”按鈕至此,我們已經(jīng)完成了一個(gè)最簡(jiǎn)單的地圖顯示程序,下面一起來(lái)看一圖32初次運(yùn)行結(jié)果圖32初次運(yùn)行結(jié)果我們沒(méi)有書(shū)寫(xiě)任何代碼,就得到了一個(gè)最簡(jiǎn)單的地圖顯示程序。但這個(gè)程序還不能與用戶交互,下一步我們需要添加一些代碼,讓程序能響應(yīng)用戶的鼠標(biāo),完成放大和全圖顯示的功能。添加基本的代碼圖33MapControl控件支持的所有方法我們沒(méi)有書(shū)寫(xiě)任何代碼,就得到了一個(gè)最簡(jiǎn)單的地圖顯示程序。但這雙擊MapControl控件,可以進(jìn)入代碼編輯界面。從窗口上方的下拉列表框中,我們能夠看到MapControl能夠響應(yīng)的所有事件(關(guān)于每個(gè)事件的詳細(xì)使用方法等請(qǐng)參見(jiàn)幫助系統(tǒng),第六章對(duì)幫助系統(tǒng)有更加詳細(xì)的介紹)。雙擊MapControl進(jìn)入代碼編輯界面的時(shí)候,默認(rèn)的是“OnMouseDown”事件,下一步就需要在這個(gè)事件中添加響應(yīng)鼠標(biāo)的相關(guān)代碼。請(qǐng)您在PrivateSubAxMapControl1_OnMouseDown函數(shù)中添加如下代碼:
if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;雙擊MapControl控件,可以進(jìn)入代碼編輯界面。從窗口上再次運(yùn)行程序,鼠標(biāo)左鍵在地圖上拉框可以實(shí)現(xiàn)地圖的放大功能,而右鍵單擊地圖則會(huì)還原地圖的全圖顯示。圖34任意比例尺放大功能再次運(yùn)行程序,鼠標(biāo)左鍵在地圖上拉框可以實(shí)現(xiàn)地圖的放大功能,而如果將代碼替換如下,則能實(shí)現(xiàn)左鍵放大,右鍵漫游的功能。if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Pan();如果將代碼替換如下,則能實(shí)現(xiàn)左鍵放大,右鍵漫游的功能。下面我們依次來(lái)看看這些代碼都代表什么意思。首先看來(lái)第一段:if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;這個(gè)代碼是一個(gè)IfElse條件語(yǔ)句,關(guān)于“e”的詳細(xì)定義及其中包含的各參數(shù),請(qǐng)參考幫助中與“IMapControlEvents2,OnMouseDownEventHandlerdelegate”關(guān)鍵字相關(guān)的內(nèi)容。代碼解釋下面我們依次來(lái)看看這些代碼都代表什么意思。首先看來(lái)第一段:代可以根據(jù)e中包含的“button”值來(lái)判斷鼠標(biāo)的單擊操作是來(lái)自何處,若button值為1,則為鼠標(biāo)左鍵,2代表鼠標(biāo)右鍵,4代表鼠標(biāo)中鍵。當(dāng)判斷得到是鼠標(biāo)左鍵單擊時(shí),執(zhí)行“AxMapControl1.Extent=AxMapControl1.TrackRectangle”這條語(yǔ)句,其中,等號(hào)右側(cè)是調(diào)用了“TrackRectangle”方法,這個(gè)方法是在地圖上拖拽出一個(gè)矩形,之后將這個(gè)矩形賦值給當(dāng)前地圖的顯示區(qū)域(Extent),這樣就實(shí)現(xiàn)了地圖的放大功能。類似的,若鼠標(biāo)右鍵單擊,則將全圖范圍賦值給當(dāng)前的顯示范圍,實(shí)現(xiàn)了地圖的全圖顯示功能。第二段代碼與第一段結(jié)構(gòu)一樣,只是在右鍵的相應(yīng)事件上略有不同,這是調(diào)用了“Pan”方法,實(shí)現(xiàn)了地圖的漫游功能??梢愿鶕?jù)e中包含的“button”值來(lái)判斷鼠標(biāo)的單擊操作是來(lái)通過(guò)這個(gè)例子,我們制作出了一個(gè)最簡(jiǎn)單的地圖瀏覽程序MapView,并能響應(yīng)一些基本的鼠標(biāo)操作。在MapControl的屬性頁(yè)中,其實(shí)還有許多內(nèi)容您可以嘗試,例如在“General”面板中可以直接加入地圖文件(*.mxd或者*.mxt),您也可以利用剛才的方式一次性多加入一些圖層而不僅僅加入“States”一個(gè),同時(shí)可以更改各圖層的疊放次序,也可以在“Data”面板中設(shè)置地圖的旋轉(zhuǎn)角度(Rotation)等,您還可以設(shè)置MapControl的顯示方式,是否支持地圖的預(yù)覽功能,邊框樣式等等。您可以做一些嘗試,看看能得到哪些有趣的結(jié)果,這些嘗試對(duì)您今后熟悉ArcGISEngine的開(kāi)發(fā)是有一定幫助的。如果需要重置MapControl,只需要點(diǎn)擊“Data”面板中的“Reset”按鈕。當(dāng)您完成了這個(gè)例子,并做了一些積極的嘗試之后,您就可以接著學(xué)習(xí)下一個(gè)小節(jié)的內(nèi)容了。小結(jié)通過(guò)這個(gè)例子,我們制作出了一個(gè)最簡(jiǎn)單的地圖瀏覽程序MapVi查詢是GIS中非常重要的一個(gè)功能,下面將分別介紹屬性查詢和空間查詢的制作方法。5.3屬性查詢添加控件如果上一小節(jié)的工程已經(jīng)關(guān)閉,則將其打開(kāi),如果您之后又在MapControl中添加了一些別的數(shù)據(jù),請(qǐng)將其刪除,只保留一個(gè)“states”圖層,請(qǐng)務(wù)必注意這一步,這直接關(guān)系到您下面的工作能否順利進(jìn)行。用之前講過(guò)的方式,在窗體中添加一個(gè)Label和一個(gè)TextBox。將Label的“Text”屬性修改為“StateName”,結(jié)果如下:圖35Label控件和TextBox控件查詢是GIS中非常重要的一個(gè)功能,下面將分別介紹屬性查詢和空首先添加引用。點(diǎn)擊菜單欄上的“項(xiàng)目”—>“添加引用”,在彈出的對(duì)話框中同時(shí)選擇“ESRI.ArcGIS.Carto”和“ESRI.ArcGIS.Geodatabase”(選擇的時(shí)候按下Ctrl鍵以同時(shí)選擇多個(gè)),點(diǎn)擊確定。之后雙擊TextBox1控件,進(jìn)入代碼編輯界面。在代碼編輯區(qū)域的最上方輸入以下內(nèi)容:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geodatabase;如下圖所示:添加引用和代碼圖36引用添加位置首先添加引用。點(diǎn)擊菜單欄上的“項(xiàng)目”—>“添加引用”,在彈出圖37添加引用對(duì)話框圖37添加引用對(duì)話框之后在控件TextBox的事件中選擇KeyUp,在KeyUp事件中添加以下代碼:圖38KeyPress方法之后在控件TextBox的事件中選擇KeyUp,在KeyUp
if(e.KeyCode==Keys.Enter){//定義圖層,要素游標(biāo),查詢過(guò)濾器,要素
IFeatureLayerpFeatureLayer;IFeatureCursorpFeatureCursor;IQueryFilterpQueryFilter;IFeaturepFeature;//獲取圖層
pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;//如果圖層名稱不是states,程序退出
if(pFeatureLayer.Name!="states")return;//清除上次查詢結(jié)果
this.axMapControl1.Map.ClearSelection();//pQueryFilter的實(shí)例化
pQueryFilter=newQueryFilterClass();//設(shè)置查詢過(guò)濾條件
pQueryFilter.WhereClause="STATE_NAME='"+txtStateName.Text+"'";
//查詢pFeatureCursor=pFeatureLayer.Search(pQueryFilter,true);//獲取查詢到的要素
pFeature=pFeatureCursor.NextFeature();//判斷是否獲取到要素
if(pFeature!=null){//選擇要素
this.axMapControl1.Map.SelectFeature(pFeatureLayer,pFeature);//放大到要素
this.axMapControl1.Extent=pFeature.Shape.Envelope;}else{//沒(méi)有得到pFeature的提示
MessageBox.Show("沒(méi)有找到名為"+txtStateName.Text+"的州","提示");}}}//查詢運(yùn)行程序,分別向編輯框中輸入“Texas”和“RS”,鍵入回車,如下圖所示:圖39Texas州查詢結(jié)果運(yùn)行程序,分別向編輯框中輸入“Texas”和“RS”,鍵入回圖40RS查詢結(jié)果圖40RS查詢結(jié)果
if(e.KeyCode==Keys.Enter)上述代碼是一個(gè)判斷語(yǔ)句,即當(dāng)用戶輸入回車的時(shí)候,開(kāi)始進(jìn)行查詢。下面兩行代碼是定義查詢的范圍,默認(rèn)為上一小節(jié)中添加的圖層“states”,如果找不到這個(gè)圖層則自動(dòng)退出。//獲取圖層
pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;//如果圖層名稱不是states,程序退出
if(pFeatureLayer.Name!="states")return;//清除上次查詢結(jié)果
this.axMapControl1.Map.ClearSelection();這一部分是生成一個(gè)新的查詢器,選擇條件(WhereClause)就是檢索是否有與用戶輸入相符的州,并將結(jié)果從查詢得到的pCursor中讀取出來(lái)。代碼解釋if(e.KeyCode==Keys.Enter)代碼解//判斷是否獲取到要素
if(pFeature!=null){//選擇要素
this.axMapControl1.Map.SelectFeature(pFeatureLayer,pFeature);//放大到要素
this.axMapControl1.Extent=pFeature.Shape.Envelope;}else{//沒(méi)有得到pFeature的提示
MessageBox.Show("沒(méi)有找到名為"+txtStateName.Text+"的州","提示");}
這一部分是一個(gè)判斷語(yǔ)句,若查詢得到的結(jié)果為空,則刷新地圖,彈出對(duì)話框通知用戶沒(méi)有查詢到結(jié)果,并退出程序。如果查詢得到的結(jié)果不為空,則將這個(gè)結(jié)果加入地圖的選擇集,并將地圖的顯示范圍定為查詢結(jié)果的外輪廓,這樣得到的州將高亮顯示同時(shí)居中放大到屏幕中心。//判斷是否獲取到要素這一部分中,我們接觸到了基本的屬性查詢。但是在這個(gè)例子中,我們不能實(shí)現(xiàn)對(duì)屬性表中任意屬性字段的查詢(在這個(gè)程序中,我們只能查詢州名——STATE_NAME,而不能對(duì)別的字段進(jìn)行查詢),而且這個(gè)查詢不支持模糊查詢。為了使查詢變的更加豐富,更加人性化,請(qǐng)您參考IQueryFilter接口中WhereClause屬性的設(shè)置方法,拓展WhereClause可以得到許多有趣的結(jié)果。在書(shū)寫(xiě)代碼的過(guò)程中,對(duì)任何有疑問(wèn)的地方,或者您想要拓展的位置,都可以在幫助系統(tǒng)中查詢相關(guān)的接口和屬性,查看最原始的定義,幫助系統(tǒng)中的解釋和定義對(duì)于您熟悉ArcObjects,熟悉ArcGISEngine的二次開(kāi)發(fā)以及后續(xù)的工作都是十分重要的,請(qǐng)一定不要忽視這個(gè)環(huán)節(jié)。如果您已經(jīng)嘗試了一些變化,或者對(duì)本小節(jié)的內(nèi)容比較熟悉了,則可以進(jìn)入下一小節(jié)的學(xué)習(xí)。小結(jié)這一部分中,我們接觸到了基本的屬性查詢。但是在這個(gè)例子中,我上一小節(jié)我們已經(jīng)學(xué)習(xí)了如何進(jìn)行屬性查詢,在這一小節(jié)中,我們將繼續(xù)學(xué)習(xí)GIS中的另一種查詢方式——空間查詢。如果上一小節(jié)的工程已經(jīng)關(guān)閉,則將其打開(kāi),如果您之后又在MapControl中添加了一些別的數(shù)據(jù),請(qǐng)將其刪除,只保留一個(gè)“states”圖層,請(qǐng)務(wù)必注意這一步,這直接關(guān)系到您下面的工作能否順利進(jìn)行。我們接著上一小節(jié)的內(nèi)容繼續(xù)完善。在窗體中添加一個(gè)Button,將其Text屬性修改為“點(diǎn)查詢”。5.4空間查詢添加控件圖41添加“點(diǎn)查詢”按鈕上一小節(jié)我們已經(jīng)學(xué)習(xí)了如何進(jìn)行屬性查詢,在這一小節(jié)中,我們將利用上一小節(jié)講的方式,添加引用“ESRI.ArcGIS.Geometry”,并在類中添加一個(gè)全局變量nMouseFlag,如下圖所示:添加引用和代碼圖42添加引用“ESRI.ArcGIS.Geometry”利用上一小節(jié)講的方式,添加引用“ESRI.ArcGIS.Ge之后在類中添加一個(gè)公共函數(shù),用來(lái)根據(jù)屏幕像素計(jì)算實(shí)際的地理距離privatedoubleConvertPixelToMapUnits(IActiveViewactiveView,doublepixelUnits){doublerealWorldDiaplayExtent;intpixelExtent;
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《家庭親情圖片》課件
- 單位管理制度集合大合集職員管理十篇
- 單位管理制度匯編大合集人員管理篇十篇
- 《孔子世家原文》課件
- 單位管理制度范例合集職工管理篇十篇
- 單位管理制度呈現(xiàn)合集【人事管理篇】十篇
- 九年級(jí)政治東西南北課件
- 七年級(jí)英語(yǔ)單詞課件
- 《生活中的規(guī)則》課件
- 第2單元 社會(huì)主義制度的建立與社會(huì)主義建設(shè)的探索 (B卷·能力提升練)(解析版)
- 2024年《論教育》全文課件
- 生命安全與救援學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 大一中國(guó)近代史綱要期末考試試題及答案
- 文創(chuàng)園項(xiàng)目可行性方案
- 馬工程版《中國(guó)經(jīng)濟(jì)史》各章思考題答題要點(diǎn)及詳解
- OBE理念下的一流專業(yè)和課程建設(shè)
- 一年級(jí)口算天天練(可直接打印)
- 繪本brown bear教案及反思
- 川中干法脫硫
- 船舶PSC檢查表(全船)
- 檳榔黃化病的診斷及防控
評(píng)論
0/150
提交評(píng)論