ArcGIS-Engine二次開發(fā)入門1教學(xué)課件_第1頁
ArcGIS-Engine二次開發(fā)入門1教學(xué)課件_第2頁
ArcGIS-Engine二次開發(fā)入門1教學(xué)課件_第3頁
ArcGIS-Engine二次開發(fā)入門1教學(xué)課件_第4頁
ArcGIS-Engine二次開發(fā)入門1教學(xué)課件_第5頁
已閱讀5頁,還剩123頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

GIS工程設(shè)計開發(fā)綜合實習(xí)張文、黃長青武漢大學(xué)遙感信息工程學(xué)院——基于C#.NET和AO/AE的GIS設(shè)計與開發(fā)12022年11月21日GIS工程設(shè)計開發(fā)綜合實習(xí)張文、黃長青——基于C#.NET和2Part5:ArcGISEngine二次開發(fā)入門2022年11月21日2Part5:ArcGISEngine二次開發(fā)入門2ArcGISEngine二次開發(fā)入門35.1ArcGISEngine簡介5.2ArcGISEngine開發(fā)起步

5.3屬性查詢5.4空間查詢5.5BaseCommand開發(fā)實例5.6BaseTool開發(fā)實例5.7通過代碼添加圖層5.8構(gòu)建一個簡單的GIS應(yīng)用5.9問題解決方法及幫助文檔的使用2022年11月21日ArcGISEngine二次開發(fā)入門35.1Arc5.1ArcGISEngine簡介ArcGISEngine的功能十分強大。作為ArcGISEngine開發(fā)者,您可以實現(xiàn)以下列出的和其他更多的功能,這包括:用多個圖層來顯示地圖,例如道路、水系、邊界等地圖的漫游和縮放地圖上要素的確認(rèn)地圖上要素的查詢和定位根據(jù)屬性值顯示注記根據(jù)航片或者衛(wèi)片顯示圖像繪制幾何圖形,例如點、線、弧、多邊形添加描述性的文字42022年11月21日5.1ArcGISEngine簡介ArcGISEn沿著線選擇或者選擇矩形、某一范圍內(nèi)、多邊形等內(nèi)部的要素選擇距離在某一范圍內(nèi)的要素利用SQL語言來尋找和選擇要素利用專題地圖來渲染要素,如唯一值法、分級法和點狀密度法動態(tài)顯示實時地圖或者時序數(shù)據(jù)根據(jù)地理編碼來尋找位置轉(zhuǎn)換您地圖的坐標(biāo)系根據(jù)幾何操作來生成緩沖區(qū)、計算差值,或者進行求交、求并等運算編輯要素形狀或者旋轉(zhuǎn)地圖創(chuàng)建并更新要素的幾何形狀及其屬性52022年11月21日沿著線選擇或者選擇矩形、某一范圍內(nèi)、多邊形等內(nèi)部的要素520編輯要素(EditingFeatures)ArcGISEngine開發(fā)包讓您構(gòu)建出能創(chuàng)建、修改和刪除geodatabase中矢量要素或者shapefile文件的應(yīng)用程序。標(biāo)準(zhǔn)的ArcGISEngineRuntime能夠讓編輯shapefile文件或者personalgeodatabase中簡單要素的程序運行。然而,要構(gòu)建企業(yè)級geodatabase的全部功能,就需要ArcGISEngineRuntime中的GeodatabaseUpdate選項。62022年11月21日編輯要素(EditingFeatures)ArcGISE空間建模和分析空間建模和通過增加ArcGISEngineRuntime中的Spatial選項,您能夠擴展ArcGISEngine的功能。這個選項(Spatial選項)能提供一系列強勁的空間建模和分析功能。您能夠創(chuàng)建、查詢、表達(dá)和分析基于象元的柵格數(shù)據(jù),能夠集成柵格和矢量數(shù)據(jù)進行分析,能夠從已有數(shù)據(jù)挖掘出新的信息,能夠從多層數(shù)據(jù)中查詢信息,能夠在ArcGISEngine應(yīng)用程序中完美集成基于象元的柵格數(shù)據(jù)和矢量數(shù)據(jù)。72022年11月21日空間建模和分析空間建模和通過增加ArcGISEngine三維可視化等ArcGISEngineRuntime中的3D選項讓您通過使用Scene和Globe控件來有效的表達(dá)和分析區(qū)域及全球數(shù)據(jù)。例如,您能夠:顯示Scene和Globe文檔展示交互性的透視圖,包括漫游、縮放、旋轉(zhuǎn)、傾斜、模擬飛行以便于表達(dá)和分析顯示真實世界的表面要素,例如樓房展示視域和可見范圍分析、場景高度內(nèi)插、剖面分析和最短距離分析82022年11月21日三維可視化等ArcGISEngineRuntime中的3這個例子將引導(dǎo)您創(chuàng)建第一個簡單的地圖顯示程序,并添加基本的縮放和漫游功能。如果您之前沒有接觸過ArcGISEngine的開發(fā),那么這個例子是您邁入ArcGISEngine二次開發(fā)大門的極好例子,如果您之前沒有接觸C#.NET,也無需擔(dān)心,這個例子將從零開始引導(dǎo)您一步一步完成任務(wù)。5.2ArcGISEngine開發(fā)起步——第一個簡單的地圖顯示程序92022年11月21日這個例子將引導(dǎo)您創(chuàng)建第一個簡單的地圖顯示程序,并添加基本的縮首先打開MicrosoftVisualStudio2005,點擊菜單欄中的“文件”—>“新建項目”,在彈出的對話框中選擇新建一個C#的Windows應(yīng)用程序,之后更改項目名稱為“MapView”,更改文件的路徑為個人實習(xí)文件夾,點擊“確定”即可。創(chuàng)建一個新的工程圖23新建項目對話框102022年11月21日首先打開MicrosoftVisualStudio20點擊編譯器最左側(cè)的“工具箱”,在彈出的選擇項中找到“ArcGISWindowsForms”項,單擊其中的MapControl,之后在Form1的空白處單擊鼠標(biāo)左鍵不放并拖拽鼠標(biāo),直到調(diào)整MapControl到合適的大小再松開鼠標(biāo)(您也可以直接在工具箱中雙擊MapControl,該控件則會自動加入到Form1中)。用同樣的方法,再將LicenseControl添加到Form1中。添加控件及引用圖24工具箱112022年11月21日點擊編譯器最左側(cè)的“工具箱”,在彈出的選擇項中找到“ArcG如果您在工具箱中找不到MapControl,則請依次嘗試以下兩種解決方案。首先單擊工具欄,待工具箱彈出之后,在工具箱的任意位置上單擊鼠標(biāo)右鍵,從彈出菜單中選擇“重置工具箱”。如果這一步操作之后仍然無法看到MapControl,則請滑動工具欄右側(cè)的滾動條至最底部,找到“常規(guī)”選項卡,然后在“常規(guī)”選項卡上單擊鼠標(biāo)右鍵,在彈出菜單中單擊“選擇項(I)…”,在彈出的對話框中找到“AxLicenseControl”和“AxMapControl”,將這兩項前的復(fù)選框打上勾,最后點擊確定即可(如果在“.NETFramework組件”這個面板中找不到這兩項,則選擇“COM組件”面板,在“ESRILicenseControl”和“ESRIMapControl”前面打勾)。圖25重置工具箱122022年11月21日如果您在工具箱中找不到MapControl,則請依次嘗試以下圖26選擇項…圖27選擇工具箱項132022年11月21日圖26選擇項…圖27選擇工具箱項132022年11月2圖28選擇工具箱項142022年11月21日圖28選擇工具箱項142022年11月21日添加好MapControl和LicenseControl之后,調(diào)整Form1和MapControl的位置與大小,如下圖所示:圖29窗體布局152022年11月21日添加好MapControl和LicenseControl之后在MapControl上單擊鼠標(biāo)右鍵,選擇“屬性”,則會彈出MapControl的屬性設(shè)置面板,在之前也介紹過,通過這個面板可以完成許多簡單的工作。如圖所示,點擊“Map”面板,之后點擊按鈕,在彈出的對話框中選擇下圖所示的路徑(注:筆者的ArcGIS安裝在D盤,若您的ArcGIS裝在別的盤符,請做相應(yīng)修改),再在此路徑下選擇“States”,點擊“Open”。之后在MapControl的屬性頁上點擊“確定”即可。添加地圖圖30文件添加路徑162022年11月21日在MapControl上單擊鼠標(biāo)右鍵,選擇“屬性”,則會彈出至此,我們已經(jīng)完成了一個最簡單的地圖顯示程序,下面一起來看一下成果吧。點擊“啟動調(diào)試”按鈕(或者在“調(diào)試”菜單下選擇相應(yīng)命令,或者按鍵盤的F5鍵),可以得到如下的運行結(jié)果。圖31“啟動調(diào)試”按鈕172022年11月21日至此,我們已經(jīng)完成了一個最簡單的地圖顯示程序,下面一起來看一圖32初次運行結(jié)果182022年11月21日圖32初次運行結(jié)果182022年11月21日我們沒有書寫任何代碼,就得到了一個最簡單的地圖顯示程序。但這個程序還不能與用戶交互,下一步我們需要添加一些代碼,讓程序能響應(yīng)用戶的鼠標(biāo),完成放大和全圖顯示的功能。添加基本的代碼圖33MapControl控件支持的所有方法192022年11月21日我們沒有書寫任何代碼,就得到了一個最簡單的地圖顯示程序。但這雙擊MapControl控件,可以進入代碼編輯界面。從窗口上方的下拉列表框中,我們能夠看到MapControl能夠響應(yīng)的所有事件(關(guān)于每個事件的詳細(xì)使用方法等請參見幫助系統(tǒng),第六章對幫助系統(tǒng)有更加詳細(xì)的介紹)。雙擊MapControl進入代碼編輯界面的時候,默認(rèn)的是“OnMouseDown”事件,下一步就需要在這個事件中添加響應(yīng)鼠標(biāo)的相關(guān)代碼。請您在PrivateSubAxMapControl1_OnMouseDown函數(shù)中添加如下代碼:

if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;202022年11月21日雙擊MapControl控件,可以進入代碼編輯界面。從窗口上再次運行程序,鼠標(biāo)左鍵在地圖上拉框可以實現(xiàn)地圖的放大功能,而右鍵單擊地圖則會還原地圖的全圖顯示。圖34任意比例尺放大功能212022年11月21日再次運行程序,鼠標(biāo)左鍵在地圖上拉框可以實現(xiàn)地圖的放大功能,而如果將代碼替換如下,則能實現(xiàn)左鍵放大,右鍵漫游的功能。if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Pan();222022年11月21日如果將代碼替換如下,則能實現(xiàn)左鍵放大,右鍵漫游的功能。222下面我們依次來看看這些代碼都代表什么意思。首先看來第一段:if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;這個代碼是一個IfElse條件語句,關(guān)于“e”的詳細(xì)定義及其中包含的各參數(shù),請參考幫助中與“IMapControlEvents2,OnMouseDownEventHandlerdelegate”關(guān)鍵字相關(guān)的內(nèi)容。代碼解釋232022年11月21日下面我們依次來看看這些代碼都代表什么意思。首先看來第一段:代可以根據(jù)e中包含的“button”值來判斷鼠標(biāo)的單擊操作是來自何處,若button值為1,則為鼠標(biāo)左鍵,2代表鼠標(biāo)右鍵,4代表鼠標(biāo)中鍵。當(dāng)判斷得到是鼠標(biāo)左鍵單擊時,執(zhí)行“AxMapControl1.Extent=AxMapControl1.TrackRectangle”這條語句,其中,等號右側(cè)是調(diào)用了“TrackRectangle”方法,這個方法是在地圖上拖拽出一個矩形,之后將這個矩形賦值給當(dāng)前地圖的顯示區(qū)域(Extent),這樣就實現(xiàn)了地圖的放大功能。類似的,若鼠標(biāo)右鍵單擊,則將全圖范圍賦值給當(dāng)前的顯示范圍,實現(xiàn)了地圖的全圖顯示功能。第二段代碼與第一段結(jié)構(gòu)一樣,只是在右鍵的相應(yīng)事件上略有不同,這是調(diào)用了“Pan”方法,實現(xiàn)了地圖的漫游功能。242022年11月21日可以根據(jù)e中包含的“button”值來判斷鼠標(biāo)的單擊操作是來通過這個例子,我們制作出了一個最簡單的地圖瀏覽程序MapView,并能響應(yīng)一些基本的鼠標(biāo)操作。在MapControl的屬性頁中,其實還有許多內(nèi)容您可以嘗試,例如在“General”面板中可以直接加入地圖文件(*.mxd或者*.mxt),您也可以利用剛才的方式一次性多加入一些圖層而不僅僅加入“States”一個,同時可以更改各圖層的疊放次序,也可以在“Data”面板中設(shè)置地圖的旋轉(zhuǎn)角度(Rotation)等,您還可以設(shè)置MapControl的顯示方式,是否支持地圖的預(yù)覽功能,邊框樣式等等。您可以做一些嘗試,看看能得到哪些有趣的結(jié)果,這些嘗試對您今后熟悉ArcGISEngine的開發(fā)是有一定幫助的。如果需要重置MapControl,只需要點擊“Data”面板中的“Reset”按鈕。當(dāng)您完成了這個例子,并做了一些積極的嘗試之后,您就可以接著學(xué)習(xí)下一個小節(jié)的內(nèi)容了。小結(jié)252022年11月21日通過這個例子,我們制作出了一個最簡單的地圖瀏覽程序MapVi查詢是GIS中非常重要的一個功能,下面將分別介紹屬性查詢和空間查詢的制作方法。5.3屬性查詢添加控件如果上一小節(jié)的工程已經(jīng)關(guān)閉,則將其打開,如果您之后又在MapControl中添加了一些別的數(shù)據(jù),請將其刪除,只保留一個“states”圖層,請務(wù)必注意這一步,這直接關(guān)系到您下面的工作能否順利進行。用之前講過的方式,在窗體中添加一個Label和一個TextBox。將Label的“Text”屬性修改為“StateName”,結(jié)果如下:圖35Label控件和TextBox控件262022年11月21日查詢是GIS中非常重要的一個功能,下面將分別介紹屬性查詢和空首先添加引用。點擊菜單欄上的“項目”—>“添加引用”,在彈出的對話框中同時選擇“ESRI.ArcGIS.Carto”和“ESRI.ArcGIS.Geodatabase”(選擇的時候按下Ctrl鍵以同時選擇多個),點擊確定。之后雙擊TextBox1控件,進入代碼編輯界面。在代碼編輯區(qū)域的最上方輸入以下內(nèi)容:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geodatabase;如下圖所示:添加引用和代碼圖36引用添加位置272022年11月21日首先添加引用。點擊菜單欄上的“項目”—>“添加引用”,在彈出圖37添加引用對話框282022年11月21日圖37添加引用對話框282022年11月21日之后在控件TextBox的事件中選擇KeyUp,在KeyUp事件中添加以下代碼:圖38KeyPress方法292022年11月21日之后在控件TextBox的事件中選擇KeyUp,在KeyUp

if(e.KeyCode==Keys.Enter){//定義圖層,要素游標(biāo),查詢過濾器,要素

IFeatureLayerpFeatureLayer;IFeatureCursorpFeatureCursor;IQueryFilterpQueryFilter;IFeaturepFeature;//獲取圖層

pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;//如果圖層名稱不是states,程序退出

if(pFeatureLayer.Name!="states")return;//清除上次查詢結(jié)果

this.axMapControl1.Map.ClearSelection();//pQueryFilter的實例化

pQueryFilter=newQueryFilterClass();//設(shè)置查詢過濾條件

pQueryFilter.WhereClause="STATE_NAME='"+txtStateName.Text+"'";302022年11月21日302022年11月21日//查詢pFeatureCursor=pFeatureLayer.Search(pQueryFilter,true);//獲取查詢到的要素

pFeature=pFeatureCursor.NextFeature();//判斷是否獲取到要素

if(pFeature!=null){//選擇要素

this.axMapControl1.Map.SelectFeature(pFeatureLayer,pFeature);//放大到要素

this.axMapControl1.Extent=pFeature.Shape.Envelope;}else{//沒有得到pFeature的提示

MessageBox.Show("沒有找到名為"+txtStateName.Text+"的州","提示");}}}312022年11月21日//查詢312022年11月21日運行程序,分別向編輯框中輸入“Texas”和“RS”,鍵入回車,如下圖所示:圖39Texas州查詢結(jié)果322022年11月21日運行程序,分別向編輯框中輸入“Texas”和“RS”,鍵入回圖40RS查詢結(jié)果332022年11月21日圖40RS查詢結(jié)果332022年11月21日

if(e.KeyCode==Keys.Enter)上述代碼是一個判斷語句,即當(dāng)用戶輸入回車的時候,開始進行查詢。下面兩行代碼是定義查詢的范圍,默認(rèn)為上一小節(jié)中添加的圖層“states”,如果找不到這個圖層則自動退出。//獲取圖層

pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;//如果圖層名稱不是states,程序退出

if(pFeatureLayer.Name!="states")return;//清除上次查詢結(jié)果

this.axMapControl1.Map.ClearSelection();這一部分是生成一個新的查詢器,選擇條件(WhereClause)就是檢索是否有與用戶輸入相符的州,并將結(jié)果從查詢得到的pCursor中讀取出來。代碼解釋342022年11月21日if(e.KeyCode==Keys.Enter)代碼解//判斷是否獲取到要素

if(pFeature!=null){//選擇要素

this.axMapControl1.Map.SelectFeature(pFeatureLayer,pFeature);//放大到要素

this.axMapControl1.Extent=pFeature.Shape.Envelope;}else{//沒有得到pFeature的提示

MessageBox.Show("沒有找到名為"+txtStateName.Text+"的州","提示");}

這一部分是一個判斷語句,若查詢得到的結(jié)果為空,則刷新地圖,彈出對話框通知用戶沒有查詢到結(jié)果,并退出程序。如果查詢得到的結(jié)果不為空,則將這個結(jié)果加入地圖的選擇集,并將地圖的顯示范圍定為查詢結(jié)果的外輪廓,這樣得到的州將高亮顯示同時居中放大到屏幕中心。352022年11月21日//判斷是否獲取到要素352022年11月21日這一部分中,我們接觸到了基本的屬性查詢。但是在這個例子中,我們不能實現(xiàn)對屬性表中任意屬性字段的查詢(在這個程序中,我們只能查詢州名——STATE_NAME,而不能對別的字段進行查詢),而且這個查詢不支持模糊查詢。為了使查詢變的更加豐富,更加人性化,請您參考IQueryFilter接口中WhereClause屬性的設(shè)置方法,拓展WhereClause可以得到許多有趣的結(jié)果。在書寫代碼的過程中,對任何有疑問的地方,或者您想要拓展的位置,都可以在幫助系統(tǒng)中查詢相關(guān)的接口和屬性,查看最原始的定義,幫助系統(tǒng)中的解釋和定義對于您熟悉ArcObjects,熟悉ArcGISEngine的二次開發(fā)以及后續(xù)的工作都是十分重要的,請一定不要忽視這個環(huán)節(jié)。如果您已經(jīng)嘗試了一些變化,或者對本小節(jié)的內(nèi)容比較熟悉了,則可以進入下一小節(jié)的學(xué)習(xí)。小結(jié)362022年11月21日這一部分中,我們接觸到了基本的屬性查詢。但是在這個例子中,我上一小節(jié)我們已經(jīng)學(xué)習(xí)了如何進行屬性查詢,在這一小節(jié)中,我們將繼續(xù)學(xué)習(xí)GIS中的另一種查詢方式——空間查詢。如果上一小節(jié)的工程已經(jīng)關(guān)閉,則將其打開,如果您之后又在MapControl中添加了一些別的數(shù)據(jù),請將其刪除,只保留一個“states”圖層,請務(wù)必注意這一步,這直接關(guān)系到您下面的工作能否順利進行。我們接著上一小節(jié)的內(nèi)容繼續(xù)完善。在窗體中添加一個Button,將其Text屬性修改為“點查詢”。5.4空間查詢添加控件圖41添加“點查詢”按鈕372022年11月21日上一小節(jié)我們已經(jīng)學(xué)習(xí)了如何進行屬性查詢,在這一小節(jié)中,我們將利用上一小節(jié)講的方式,添加引用“ESRI.ArcGIS.Geometry”,并在類中添加一個全局變量nMouseFlag,如下圖所示:添加引用和代碼圖42添加引用“ESRI.ArcGIS.Geometry”382022年11月21日利用上一小節(jié)講的方式,添加引用“ESRI.ArcGIS.Ge之后在類中添加一個公共函數(shù),用來根據(jù)屏幕像素計算實際的地理距離privatedoubleConvertPixelToMapUnits(IActiveViewactiveView,doublepixelUnits){doublerealWorldDiaplayExtent;intpixelExtent;doublesizeOfOnePixel;doublemapUnits;//獲取設(shè)備中視圖顯示寬度,即像素個數(shù)pixelExtent=activeView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().right-activeView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().left;//獲取地圖坐標(biāo)系中地圖顯示范圍

realWorldDiaplayExtent=activeView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;//每個像素大小代表的實際距離

sizeOfOnePixel=realWorldDiaplayExtent/pixelExtent;//地理距離

mapUnits=pixelUnits*sizeOfOnePixel;returnmapUnits;}392022年11月21日之后在類中添加一個公共函數(shù),用來根據(jù)屏幕像素計算實際的地理距此后,雙擊Button1,進入Button的Click事件,向其中添加如下代碼://標(biāo)記點查詢

mMouseFlag=1;//設(shè)置鼠標(biāo)形狀

this.axMapControl1.MousePointer=ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerCrosshair;(注:上兩行代碼應(yīng)該書寫在一行,由于空間有限,這里寫為兩行)最后將MapControl控件的OnMouseDown事件中已有的代碼清除,替換為以下代碼:if(mMouseFlag==1){IFeatureLayerpFeatureLayer;IFeatureClasspFeatureClass;//獲取圖層和要素類,為空時返回

pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;if(pFeatureLayer.Name!="states")return;pFeatureClass=pFeatureLayer.FeatureClass;if(pFeatureClass==null)return;IActiveViewpActiveView;IPointpPoint;doublelength;

402022年11月21日此后,雙擊Button1,進入Button的Click事件,//獲取視圖范圍

pActiveView=this.axMapControl1.ActiveView;//獲取鼠標(biāo)點擊屏幕坐標(biāo)

pPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y);//2個像素大小的屏幕距離轉(zhuǎn)換為地圖距離

length=ConvertPixelToMapUnits(pActiveView,2);ITopologicalOperatorpTopoOperator;IGeometrypGeoBuffer;ISpatialFilterpSpatialFilter;//根據(jù)緩沖半徑生成空間過濾器

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;}

412022年11月21日//獲取視圖范圍412022年11月21日//定義空間過濾器的空間字段

pSpatialFilter.GeometryField=pFeatureClass.ShapeFieldName;IQueryFilterpQueryFilter;IFeatureCursorpFeatureCursor;IFeaturepFeature;//利用要素過濾器查詢要素

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)+"”","提示");}}422022年11月21日422022年11月21日運行程序,結(jié)果如右圖所示:

圖43空間查詢運行結(jié)果432022年11月21日圖43空間查詢運行結(jié)果432022年11月21日距離轉(zhuǎn)換函數(shù)請您自行參看幫助系統(tǒng)中對相關(guān)接口的具體定義和解釋。Button1的Click事件中是將nMouseFlag設(shè)置為1,并將鼠標(biāo)在MapControl上的形狀改變?yōu)槭纸z狀。//獲取視圖范圍

pActiveView=this.axMapControl1.ActiveView;//獲取鼠標(biāo)點擊屏幕坐標(biāo)pPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y);//屏幕距離轉(zhuǎn)換為地圖距離

length=ConvertPixelToMapUnits(pActiveView,2);上述代碼是在MapControl的OnMouseDown事件中,當(dāng)您單擊鼠標(biāo)左鍵的時候,將屏幕上的點轉(zhuǎn)換成地圖上的點(關(guān)鍵在于坐標(biāo)值的轉(zhuǎn)換),方便后續(xù)操作。//根據(jù)緩沖半徑生成空間過濾器

pTopoOperator=pPointasITopologicalOperator;pGeoBuffer=pTopoOperator.Buffer(length);pSpatialFilter=newSpatialFilterClass();pSpatialFilter.Geometry=pGeoBuffer;代碼解釋442022年11月21日距離轉(zhuǎn)換函數(shù)請您自行參看幫助系統(tǒng)中對相關(guān)接口的具體定義和解釋這一部分是將2個像素的距離轉(zhuǎn)換成實際的地理距離,并以這個距離為半徑,上一步生成的點為中心,生成一個緩沖區(qū)。452022年11月21日這一部分是將2個像素的距離轉(zhuǎn)換成實際的地理距離,并以這個距離上述代碼是設(shè)置pSpatialFilter的各項參數(shù),供后續(xù)查詢,包括空間查詢的幾何形狀(之前生成的緩沖區(qū)),空間查詢的方式(相交,包含等)以及Shape字段。這兩句代碼是找出“STATE_NAME”所在的列數(shù),并將其顯示出來。462022年11月21日上述代碼是設(shè)置pSpatialFilter的各項參數(shù),供后續(xù)在本節(jié)中我們完成更多的空間查詢功能,其中有點查詢、線查詢、矩形查詢、圓查詢新建一個C#.Net工程,向工程中添加控件,如下圖所示:其中包括MapControl,4個Button,一個TextBox進一步完善空間查詢472022年11月21日在本節(jié)中我們完成更多的空間查詢功能,其中有點查詢、線查詢、矩通過在控件屬性中添加地圖的方法,向Mapcontrol中添加例子數(shù)據(jù)。(例子數(shù)據(jù)是位于World文件夾下的Continents.lyr)如下圖所示:

下面我們在MainForm的代碼頁添加空間查詢的函數(shù)。本例中我們需要添加ESRI.ArcGIS.Carto、ESRI.ArcGIS.Geometry、ESRI.ArcGIS.Geodatabase、ESRI.ArcGIS.Controls四個個命名空間,并且我們?nèi)匀恍枰瞎?jié)中的ConvertPixelToMapUnits(IActiveViewactiveView,doublepixelUnits)函數(shù),請自行添加??臻g查詢函數(shù)代碼如下:

///<summary>///空間查詢///</summary>///<paramname="mapControl">MapControl</param>///<paramname="geometry">空間查詢方式</param>///<paramname="fieldName">字段名稱</param>///<returns>查詢得到的要素名稱</returns>482022年11月21日通過在控件屬性中添加地圖的方法,向Mapcontrol中添加privatestringQuerySpatial(AxMapControlmapControl,IGeometrygeometry,stringfieldName){

}{492022年11月21日privatestringQuerySpatial(Ax502022年11月21日502022年11月21日512022年11月21日512022年11月21日在設(shè)計頁面雙擊點查詢按鈕,進入點擊按鈕響應(yīng)事件填寫如下代碼。相應(yīng)的線查詢、矩形查詢、圓查詢添加同樣的代碼,但nMouseFlag得值要有所改變。線查詢:nMouseFlag=2矩形查詢:nMouseFlag=3圓查詢:nMouseFlag=4為MapControl控件添加OnMouseDown事件,填入以下代碼522022年11月21日在設(shè)計頁面雙擊點查詢按鈕,進入點擊按鈕響應(yīng)事件填寫如下代碼。532022年11月21日532022年11月21日542022年11月21日542022年11月21日點擊運行,運行效果如下圖所示:552022年11月21日點擊運行,運行效果如下圖所示:552022年11月21日仔細(xì)研讀代碼,您會發(fā)現(xiàn),在這部分中我們并沒有用到什么新的知識,只是在結(jié)構(gòu)上做了調(diào)整,應(yīng)為空間查詢都是需要使用一個IGeometry對象進行空間求交進行查詢的。所以我們將公共的代碼放在公共的模塊中進行調(diào)用。有心的同學(xué)可能發(fā)現(xiàn),我們?yōu)榱伺袛嘤脩粼贛apControl上的操作,我們引入了一個全局變量nMouseFlag,程序中多一個全局變量,對程序的結(jié)構(gòu)的封閉性就有所破壞,能不能去掉這個全局變量而是Mapcontrol自主判斷是哪個功能進行操作呢?答案是肯定的,我們可以使用BaseCommand和BaseTool來完成這個工作,詳細(xì)的用法在3.4和3.5小節(jié)將會介紹。562022年11月21日仔細(xì)研讀代碼,您會發(fā)現(xiàn),在這部分中我們并沒有用到什么新的知識小結(jié)

在這一小節(jié)中,我們學(xué)習(xí)了如何進行簡單的空間查詢??臻g查詢不僅包括點查詢,還包括線查詢,矩形查詢,多邊形查詢等(為了實現(xiàn)這些功能,可以參考MapControl中的TrackRectangle等方法)。對于這一小節(jié)的代碼,強烈建議您參看幫助系統(tǒng)中對相關(guān)接口的解釋和定義,以進一步熟悉接口的使用,這對后面的學(xué)習(xí)以及掌握ArcGISEngine二次開發(fā)是極有好處的。如果您對這一部分比較熟悉了,可以進入下一小節(jié)。在第四章中,我們介紹了控件命令(ControlCommands),并提到ArcGISEngine允許用戶自定義開發(fā)一些控件命令,在下兩小節(jié)中,我們將具體學(xué)習(xí)如何開發(fā)。572022年11月21日小結(jié)

在這一小節(jié)中,我們學(xué)習(xí)了如何進行簡單的空間查詢??臻g查5.5BaseCommand開發(fā)實例在這一小節(jié)中,我們將學(xué)習(xí)BaseCommand的開發(fā)步驟。BaseCommand的功能與Button的功能類似,是當(dāng)鼠標(biāo)點擊按鈕的時候,MapControl控件會對其中的命令做出相應(yīng)而無需額外的操作。在這一小節(jié)中,我們將制作一個“定比例尺放大”的按鈕,當(dāng)鼠標(biāo)單擊按鈕時,地圖將居中放大一倍。添加控件如果上一小節(jié)的程序已經(jīng)關(guān)閉,則重新打開,同時保證MapControl控件中加載了至少一個圖層。在主窗體(frmMain)中添加一個Button,將其Text屬性更改為“居中放大”。3.3.5小結(jié)582022年11月21日5.5BaseCommand開發(fā)實例3.3.5小結(jié)582添加BaseCommand592022年11月21日添加BaseCommand592022年11月21日602022年11月21日602022年11月21日添加代碼612022年11月21日添加代碼612022年11月21日622022年11月21日622022年11月21日632022年11月21日632022年11月21日小結(jié)642022年11月21日小結(jié)642022年11月21日End,Thanks!652022年11月21日End,652022年11月21日GIS工程設(shè)計開發(fā)綜合實習(xí)張文、黃長青武漢大學(xué)遙感信息工程學(xué)院——基于C#.NET和AO/AE的GIS設(shè)計與開發(fā)662022年11月21日GIS工程設(shè)計開發(fā)綜合實習(xí)張文、黃長青——基于C#.NET和67Part5:ArcGISEngine二次開發(fā)入門2022年11月21日2Part5:ArcGISEngine二次開發(fā)入門2ArcGISEngine二次開發(fā)入門685.1ArcGISEngine簡介5.2ArcGISEngine開發(fā)起步

5.3屬性查詢5.4空間查詢5.5BaseCommand開發(fā)實例5.6BaseTool開發(fā)實例5.7通過代碼添加圖層5.8構(gòu)建一個簡單的GIS應(yīng)用5.9問題解決方法及幫助文檔的使用2022年11月21日ArcGISEngine二次開發(fā)入門35.1Arc5.1ArcGISEngine簡介ArcGISEngine的功能十分強大。作為ArcGISEngine開發(fā)者,您可以實現(xiàn)以下列出的和其他更多的功能,這包括:用多個圖層來顯示地圖,例如道路、水系、邊界等地圖的漫游和縮放地圖上要素的確認(rèn)地圖上要素的查詢和定位根據(jù)屬性值顯示注記根據(jù)航片或者衛(wèi)片顯示圖像繪制幾何圖形,例如點、線、弧、多邊形添加描述性的文字692022年11月21日5.1ArcGISEngine簡介ArcGISEn沿著線選擇或者選擇矩形、某一范圍內(nèi)、多邊形等內(nèi)部的要素選擇距離在某一范圍內(nèi)的要素利用SQL語言來尋找和選擇要素利用專題地圖來渲染要素,如唯一值法、分級法和點狀密度法動態(tài)顯示實時地圖或者時序數(shù)據(jù)根據(jù)地理編碼來尋找位置轉(zhuǎn)換您地圖的坐標(biāo)系根據(jù)幾何操作來生成緩沖區(qū)、計算差值,或者進行求交、求并等運算編輯要素形狀或者旋轉(zhuǎn)地圖創(chuàng)建并更新要素的幾何形狀及其屬性702022年11月21日沿著線選擇或者選擇矩形、某一范圍內(nèi)、多邊形等內(nèi)部的要素520編輯要素(EditingFeatures)ArcGISEngine開發(fā)包讓您構(gòu)建出能創(chuàng)建、修改和刪除geodatabase中矢量要素或者shapefile文件的應(yīng)用程序。標(biāo)準(zhǔn)的ArcGISEngineRuntime能夠讓編輯shapefile文件或者personalgeodatabase中簡單要素的程序運行。然而,要構(gòu)建企業(yè)級geodatabase的全部功能,就需要ArcGISEngineRuntime中的GeodatabaseUpdate選項。712022年11月21日編輯要素(EditingFeatures)ArcGISE空間建模和分析空間建模和通過增加ArcGISEngineRuntime中的Spatial選項,您能夠擴展ArcGISEngine的功能。這個選項(Spatial選項)能提供一系列強勁的空間建模和分析功能。您能夠創(chuàng)建、查詢、表達(dá)和分析基于象元的柵格數(shù)據(jù),能夠集成柵格和矢量數(shù)據(jù)進行分析,能夠從已有數(shù)據(jù)挖掘出新的信息,能夠從多層數(shù)據(jù)中查詢信息,能夠在ArcGISEngine應(yīng)用程序中完美集成基于象元的柵格數(shù)據(jù)和矢量數(shù)據(jù)。722022年11月21日空間建模和分析空間建模和通過增加ArcGISEngine三維可視化等ArcGISEngineRuntime中的3D選項讓您通過使用Scene和Globe控件來有效的表達(dá)和分析區(qū)域及全球數(shù)據(jù)。例如,您能夠:顯示Scene和Globe文檔展示交互性的透視圖,包括漫游、縮放、旋轉(zhuǎn)、傾斜、模擬飛行以便于表達(dá)和分析顯示真實世界的表面要素,例如樓房展示視域和可見范圍分析、場景高度內(nèi)插、剖面分析和最短距離分析732022年11月21日三維可視化等ArcGISEngineRuntime中的3這個例子將引導(dǎo)您創(chuàng)建第一個簡單的地圖顯示程序,并添加基本的縮放和漫游功能。如果您之前沒有接觸過ArcGISEngine的開發(fā),那么這個例子是您邁入ArcGISEngine二次開發(fā)大門的極好例子,如果您之前沒有接觸C#.NET,也無需擔(dān)心,這個例子將從零開始引導(dǎo)您一步一步完成任務(wù)。5.2ArcGISEngine開發(fā)起步——第一個簡單的地圖顯示程序742022年11月21日這個例子將引導(dǎo)您創(chuàng)建第一個簡單的地圖顯示程序,并添加基本的縮首先打開MicrosoftVisualStudio2005,點擊菜單欄中的“文件”—>“新建項目”,在彈出的對話框中選擇新建一個C#的Windows應(yīng)用程序,之后更改項目名稱為“MapView”,更改文件的路徑為個人實習(xí)文件夾,點擊“確定”即可。創(chuàng)建一個新的工程圖23新建項目對話框752022年11月21日首先打開MicrosoftVisualStudio20點擊編譯器最左側(cè)的“工具箱”,在彈出的選擇項中找到“ArcGISWindowsForms”項,單擊其中的MapControl,之后在Form1的空白處單擊鼠標(biāo)左鍵不放并拖拽鼠標(biāo),直到調(diào)整MapControl到合適的大小再松開鼠標(biāo)(您也可以直接在工具箱中雙擊MapControl,該控件則會自動加入到Form1中)。用同樣的方法,再將LicenseControl添加到Form1中。添加控件及引用圖24工具箱762022年11月21日點擊編譯器最左側(cè)的“工具箱”,在彈出的選擇項中找到“ArcG如果您在工具箱中找不到MapControl,則請依次嘗試以下兩種解決方案。首先單擊工具欄,待工具箱彈出之后,在工具箱的任意位置上單擊鼠標(biāo)右鍵,從彈出菜單中選擇“重置工具箱”。如果這一步操作之后仍然無法看到MapControl,則請滑動工具欄右側(cè)的滾動條至最底部,找到“常規(guī)”選項卡,然后在“常規(guī)”選項卡上單擊鼠標(biāo)右鍵,在彈出菜單中單擊“選擇項(I)…”,在彈出的對話框中找到“AxLicenseControl”和“AxMapControl”,將這兩項前的復(fù)選框打上勾,最后點擊確定即可(如果在“.NETFramework組件”這個面板中找不到這兩項,則選擇“COM組件”面板,在“ESRILicenseControl”和“ESRIMapControl”前面打勾)。圖25重置工具箱772022年11月21日如果您在工具箱中找不到MapControl,則請依次嘗試以下圖26選擇項…圖27選擇工具箱項782022年11月21日圖26選擇項…圖27選擇工具箱項132022年11月2圖28選擇工具箱項792022年11月21日圖28選擇工具箱項142022年11月21日添加好MapControl和LicenseControl之后,調(diào)整Form1和MapControl的位置與大小,如下圖所示:圖29窗體布局802022年11月21日添加好MapControl和LicenseControl之后在MapControl上單擊鼠標(biāo)右鍵,選擇“屬性”,則會彈出MapControl的屬性設(shè)置面板,在之前也介紹過,通過這個面板可以完成許多簡單的工作。如圖所示,點擊“Map”面板,之后點擊按鈕,在彈出的對話框中選擇下圖所示的路徑(注:筆者的ArcGIS安裝在D盤,若您的ArcGIS裝在別的盤符,請做相應(yīng)修改),再在此路徑下選擇“States”,點擊“Open”。之后在MapControl的屬性頁上點擊“確定”即可。添加地圖圖30文件添加路徑812022年11月21日在MapControl上單擊鼠標(biāo)右鍵,選擇“屬性”,則會彈出至此,我們已經(jīng)完成了一個最簡單的地圖顯示程序,下面一起來看一下成果吧。點擊“啟動調(diào)試”按鈕(或者在“調(diào)試”菜單下選擇相應(yīng)命令,或者按鍵盤的F5鍵),可以得到如下的運行結(jié)果。圖31“啟動調(diào)試”按鈕822022年11月21日至此,我們已經(jīng)完成了一個最簡單的地圖顯示程序,下面一起來看一圖32初次運行結(jié)果832022年11月21日圖32初次運行結(jié)果182022年11月21日我們沒有書寫任何代碼,就得到了一個最簡單的地圖顯示程序。但這個程序還不能與用戶交互,下一步我們需要添加一些代碼,讓程序能響應(yīng)用戶的鼠標(biāo),完成放大和全圖顯示的功能。添加基本的代碼圖33MapControl控件支持的所有方法842022年11月21日我們沒有書寫任何代碼,就得到了一個最簡單的地圖顯示程序。但這雙擊MapControl控件,可以進入代碼編輯界面。從窗口上方的下拉列表框中,我們能夠看到MapControl能夠響應(yīng)的所有事件(關(guān)于每個事件的詳細(xì)使用方法等請參見幫助系統(tǒng),第六章對幫助系統(tǒng)有更加詳細(xì)的介紹)。雙擊MapControl進入代碼編輯界面的時候,默認(rèn)的是“OnMouseDown”事件,下一步就需要在這個事件中添加響應(yīng)鼠標(biāo)的相關(guān)代碼。請您在PrivateSubAxMapControl1_OnMouseDown函數(shù)中添加如下代碼:

if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;852022年11月21日雙擊MapControl控件,可以進入代碼編輯界面。從窗口上再次運行程序,鼠標(biāo)左鍵在地圖上拉框可以實現(xiàn)地圖的放大功能,而右鍵單擊地圖則會還原地圖的全圖顯示。圖34任意比例尺放大功能862022年11月21日再次運行程序,鼠標(biāo)左鍵在地圖上拉框可以實現(xiàn)地圖的放大功能,而如果將代碼替換如下,則能實現(xiàn)左鍵放大,右鍵漫游的功能。if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Pan();872022年11月21日如果將代碼替換如下,則能實現(xiàn)左鍵放大,右鍵漫游的功能。222下面我們依次來看看這些代碼都代表什么意思。首先看來第一段:if(e.button==1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button==2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;這個代碼是一個IfElse條件語句,關(guān)于“e”的詳細(xì)定義及其中包含的各參數(shù),請參考幫助中與“IMapControlEvents2,OnMouseDownEventHandlerdelegate”關(guān)鍵字相關(guān)的內(nèi)容。代碼解釋882022年11月21日下面我們依次來看看這些代碼都代表什么意思。首先看來第一段:代可以根據(jù)e中包含的“button”值來判斷鼠標(biāo)的單擊操作是來自何處,若button值為1,則為鼠標(biāo)左鍵,2代表鼠標(biāo)右鍵,4代表鼠標(biāo)中鍵。當(dāng)判斷得到是鼠標(biāo)左鍵單擊時,執(zhí)行“AxMapControl1.Extent=AxMapControl1.TrackRectangle”這條語句,其中,等號右側(cè)是調(diào)用了“TrackRectangle”方法,這個方法是在地圖上拖拽出一個矩形,之后將這個矩形賦值給當(dāng)前地圖的顯示區(qū)域(Extent),這樣就實現(xiàn)了地圖的放大功能。類似的,若鼠標(biāo)右鍵單擊,則將全圖范圍賦值給當(dāng)前的顯示范圍,實現(xiàn)了地圖的全圖顯示功能。第二段代碼與第一段結(jié)構(gòu)一樣,只是在右鍵的相應(yīng)事件上略有不同,這是調(diào)用了“Pan”方法,實現(xiàn)了地圖的漫游功能。892022年11月21日可以根據(jù)e中包含的“button”值來判斷鼠標(biāo)的單擊操作是來通過這個例子,我們制作出了一個最簡單的地圖瀏覽程序MapView,并能響應(yīng)一些基本的鼠標(biāo)操作。在MapControl的屬性頁中,其實還有許多內(nèi)容您可以嘗試,例如在“General”面板中可以直接加入地圖文件(*.mxd或者*.mxt),您也可以利用剛才的方式一次性多加入一些圖層而不僅僅加入“States”一個,同時可以更改各圖層的疊放次序,也可以在“Data”面板中設(shè)置地圖的旋轉(zhuǎn)角度(Rotation)等,您還可以設(shè)置MapControl的顯示方式,是否支持地圖的預(yù)覽功能,邊框樣式等等。您可以做一些嘗試,看看能得到哪些有趣的結(jié)果,這些嘗試對您今后熟悉ArcGISEngine的開發(fā)是有一定幫助的。如果需要重置MapControl,只需要點擊“Data”面板中的“Reset”按鈕。當(dāng)您完成了這個例子,并做了一些積極的嘗試之后,您就可以接著學(xué)習(xí)下一個小節(jié)的內(nèi)容了。小結(jié)902022年11月21日通過這個例子,我們制作出了一個最簡單的地圖瀏覽程序MapVi查詢是GIS中非常重要的一個功能,下面將分別介紹屬性查詢和空間查詢的制作方法。5.3屬性查詢添加控件如果上一小節(jié)的工程已經(jīng)關(guān)閉,則將其打開,如果您之后又在MapControl中添加了一些別的數(shù)據(jù),請將其刪除,只保留一個“states”圖層,請務(wù)必注意這一步,這直接關(guān)系到您下面的工作能否順利進行。用之前講過的方式,在窗體中添加一個Label和一個TextBox。將Label的“Text”屬性修改為“StateName”,結(jié)果如下:圖35Label控件和TextBox控件912022年11月21日查詢是GIS中非常重要的一個功能,下面將分別介紹屬性查詢和空首先添加引用。點擊菜單欄上的“項目”—>“添加引用”,在彈出的對話框中同時選擇“ESRI.ArcGIS.Carto”和“ESRI.ArcGIS.Geodatabase”(選擇的時候按下Ctrl鍵以同時選擇多個),點擊確定。之后雙擊TextBox1控件,進入代碼編輯界面。在代碼編輯區(qū)域的最上方輸入以下內(nèi)容:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geodatabase;如下圖所示:添加引用和代碼圖36引用添加位置922022年11月21日首先添加引用。點擊菜單欄上的“項目”—>“添加引用”,在彈出圖37添加引用對話框932022年11月21日圖37添加引用對話框282022年11月21日之后在控件TextBox的事件中選擇KeyUp,在KeyUp事件中添加以下代碼:圖38KeyPress方法942022年11月21日之后在控件TextBox的事件中選擇KeyUp,在KeyUp

if(e.KeyCode==Keys.Enter){//定義圖層,要素游標(biāo),查詢過濾器,要素

IFeatureLayerpFeatureLayer;IFeatureCursorpFeatureCursor;IQueryFilterpQueryFilter;IFeaturepFeature;//獲取圖層

pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;//如果圖層名稱不是states,程序退出

if(pFeatureLayer.Name!="states")return;//清除上次查詢結(jié)果

this.axMapControl1.Map.ClearSelection();//pQueryFilter的實例化

pQueryFilter=newQueryFilterClass();//設(shè)置查詢過濾條件

pQueryFilter.WhereClause="STATE_NAME='"+txtStateName.Text+"'";952022年11月21日302022年11月21日//查詢pFeatureCursor=pFeatureLayer.Search(pQueryFilter,true);//獲取查詢到的要素

pFeature=pFeatureCursor.NextFeature();//判斷是否獲取到要素

if(pFeature!=null){//選擇要素

this.axMapControl1.Map.SelectFeature(pFeatureLayer,pFeature);//放大到要素

this.axMapControl1.Extent=pFeature.Shape.Envelope;}else{//沒有得到pFeature的提示

MessageBox.Show("沒有找到名為"+txtStateName.Text+"的州","提示");}}}962022年11月21日//查詢312022年11月21日運行程序,分別向編輯框中輸入“Texas”和“RS”,鍵入回車,如下圖所示:圖39Texas州查詢結(jié)果972022年11月21日運行程序,分別向編輯框中輸入“Texas”和“RS”,鍵入回圖40RS查詢結(jié)果982022年11月21日圖40RS查詢結(jié)果332022年11月21日

if(e.KeyCode==Keys.Enter)上述代碼是一個判斷語句,即當(dāng)用戶輸入回車的時候,開始進行查詢。下面兩行代碼是定義查詢的范圍,默認(rèn)為上一小節(jié)中添加的圖層“states”,如果找不到這個圖層則自動退出。//獲取圖層

pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;//如果圖層名稱不是states,程序退出

if(pFeatureLayer.Name!="states")return;//清除上次查詢結(jié)果

this.axMapControl1.Map.ClearSelection();這一部分是生成一個新的查詢器,選擇條件(WhereClause)就是檢索是否有與用戶輸

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論