版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、牟乃夏牟乃夏 ArcGIS Engine ArcGIS Engine 地理信地理信息系統(tǒng)開發(fā)教程息系統(tǒng)開發(fā)教程配套配套PPT-PPT-第3章 地圖操作基本功能目錄 1. 空間數(shù)據(jù)與工作空間 2. MapControl控件接口 3. 數(shù)據(jù)加載 4. 地圖文檔保存 5. 地圖瀏覽 6. 書簽 7. ICommand和ITool命令操作地圖 8. 量測(cè) 9. 要素選擇操作 10. 視圖同步 11. TOCControl控件1. 空間數(shù)據(jù)與工作空間 1.空間數(shù)據(jù) 在GIS軟件中,空間數(shù)據(jù)有多種不同的存在形式。按照不同的劃分標(biāo)準(zhǔn)可以分為矢量數(shù)據(jù)和柵格數(shù)據(jù)、GIS格式的地理數(shù)據(jù)與非GIS格式的數(shù)據(jù)(如CA
2、D格式等)、空間數(shù)據(jù)庫(kù)數(shù)據(jù)(如個(gè)人數(shù)據(jù)庫(kù)、ArcSDE數(shù)據(jù)庫(kù)等)和文件數(shù)據(jù)(ShapeFile格式、Coverage格式)等。 2.工作空間 工作空間(Workspace)對(duì)象,在物理級(jí)別上相當(dāng)于地理數(shù)據(jù)庫(kù)本身,在邏輯上是一個(gè)包含空間數(shù)據(jù)集和非空間數(shù)據(jù)集的數(shù)據(jù)容器。它包含數(shù)據(jù)集(Dataset)、要素類(FeatureClass)、表(Table)等數(shù)據(jù)。1. 空間數(shù)據(jù)與工作空間工作空間工廠對(duì)象工作空間對(duì)應(yīng)類型描述AccessWorkspaceFactoryesriLocalDatabaseWorkspace 打開Personal GeoDatabaseArcInfoWorkspaceFact
3、oryesriFileSystemWorkspace打開ArcInfo工作空間文件CadWorkspaceFactoryesriFileSystemWorkspace打開CAD文件的工作空間OLEDBWorkspaceFactoryesriRemoteDatabaseWorkspace使用OLEDB打開數(shù)據(jù)庫(kù)的工作空間文件SdeWorkspaceFactoryesriRemoteDatabaseWorkspace打開SDE數(shù)據(jù)庫(kù)的工作空間ShapefileWorkspaceFactoryesriFileSystemWorkspace打開ShapeFile文件的工作空間TinWorkspaceF
4、actoryesriFileSystemWorkspace打開TIN數(shù)據(jù)文件的工作空間TextFileWorkspaceFactoryesriFileSystemWorkspace打開文本文件的工作空間常用的工作空間及工作空間對(duì)象常用的工作空間及工作空間對(duì)象1. 空間數(shù)據(jù)與工作空間 工作空間 數(shù)據(jù)加載需要先打開相對(duì)應(yīng)的工作空間。 IWorkspace接口:IWorkspace接口定義了訪問(wèn)工作空間各種屬性的方法,如工作空間的連接屬性等。通過(guò)IWorkspace接口可實(shí)例化現(xiàn)有數(shù)據(jù)集和創(chuàng)建新數(shù)據(jù)集。由于WorkSpace是一個(gè)普通類,要獲得WorkSpace,需要通過(guò)工作空間工廠(Workspa
5、ceFactory)來(lái)創(chuàng)建。 IWorkspaceFactory接口:IWorkspaceFactory接口定義了創(chuàng)建、打開工作空間的方法和對(duì)工作空間工廠信息成員的訪問(wèn)。用戶可通過(guò)工作空間工廠管理不同類型的工作空間,所有的工作空間對(duì)象都可通過(guò)此接口產(chǎn)生。 IWorkspaceFactory接口的Create方法可產(chǎn)生一個(gè)新的工作空間對(duì)象,不同類型的WorkspaceFactory對(duì)象,其Create方法產(chǎn)生的工作空間對(duì)象是不同的。 IWorkspaceShapefileFactory接口的Open方法和OpenFromFile方法可以用于打開一個(gè)已經(jīng)存在的工作空間,Open方法用于打開一個(gè)SD
6、E數(shù)據(jù)庫(kù),OpenFromFile方法用于打開一個(gè)文件類型的數(shù)據(jù),如*.tif、*.img等。2. MapControl控件接口 1)IMapControlDefault接口IMapControlDefault接口是MapControl控件的缺省接口,是代表當(dāng)前版本的最新接口,開發(fā)環(huán)境自動(dòng)使用這個(gè)接口定義的屬性和方法。 2)IMapControl2接口IMapControl2接口提供了一系列的屬性和方法,如設(shè)置MapControl控件的顯示屬性、控件外觀、添加和管理數(shù)據(jù)圖層和地圖文檔、在控件上繪制圖形和返回幾何對(duì)象等。 3)IMapControl3接口IMapControl3接口在繼承IMap
7、Control2的基礎(chǔ)上,增加了以下屬性和方法:CustomProperty:設(shè)置自定義控件屬性。DocumentFilename:返回MapControl中載入的地圖文檔的文件名。DocumentMap:返回MapControl中最后載入的地圖名稱。KeyIntercept:返回或設(shè)置MapControl控件截取的鍵盤按鍵信息。Object:返回MapControl控件。ShowMapTips:控制是否顯示地圖的Map Tips。TipDelay:設(shè)置Map Tips的延遲時(shí)間。TipStyle:設(shè)置Map Tips的顯示樣式。SuppressResizeDrawing::當(dāng)控件尺寸發(fā)生變化
8、時(shí)阻止數(shù)據(jù)實(shí)時(shí)重繪。2. MapControl控件接口 4)IMapControl4接口 IMapControl4接口在IMapControl3接口的基礎(chǔ)上,增加了兩個(gè)屬性,分別是AutoKeyboardScrolling和AutoMouseWheel。 AutoKeyboardScrolling:確定鍵盤滾動(dòng)輪是否起作用。 AutoMouseWheel:確定鼠標(biāo)滾輪是否起作用。 5)IMapControlEvents2接口 IMapControlEvent2接口為事件接口,它定義了MapControl能夠處理的全部事件,如OnMouseDown、OnMouseMove、OnKeyUp、OnB
9、eforeScreenDraw、OnAfterDraw、OnExtentUpdated等。3.數(shù)據(jù)加載 1)加載地圖文檔的方式有三種:使用IMapControl接口的LoadMxFile方法加載;通過(guò)IMapDocument接口加載;使用ArcGIS Engine中封裝好的類庫(kù)資源ControlsOpenDocCommandClass加載。3.數(shù)據(jù)加載 使用IMapControl接口的LoadMxFile方法加載地圖文檔 實(shí)現(xiàn)思路如下: 通過(guò).NET框架類提供的打開文件對(duì)話框選擇要打開的地圖文檔; 用IMapControl接口提供的CheckMxFile方法檢查是否為有效的地圖文檔,若有效,則
10、調(diào)用IMapControl接口提供的LoadMxFile方法進(jìn)行加載。核心代碼3.數(shù)據(jù)加載 通過(guò)IMapDocument接口加載 IMapDocument接口定義了操作和管理地圖文檔對(duì)象的方法和屬性。使用這個(gè)對(duì)象可以獲取、更新一個(gè)文檔的內(nèi)容,設(shè)置文檔文件的屬性以及讀、寫和保存一個(gè)文檔文件等。IMapDocument接口同時(shí)扮演著數(shù)據(jù)顯示和數(shù)據(jù)容器的雙重身份,可以通過(guò)ActiveView獲得Map數(shù)據(jù)視圖,通過(guò)FocusMap屬性獲得當(dāng)前正在使用的Map對(duì)象的數(shù)據(jù)容器身份。一個(gè)文檔對(duì)象可能擁有多個(gè)Map對(duì)象(相當(dāng)于ArcGIS中的數(shù)據(jù)框Data Frame),但是在同一時(shí)刻內(nèi)只能有一份Map處于
11、使用狀態(tài)。核心代碼3.數(shù)據(jù)加載 使用ControlsOpenDocCommandClass加載地圖 使用ArcGIS Engine中封裝好的類庫(kù)資源ControlsOpenDocCommandClass實(shí)現(xiàn)地圖文檔的加載的核心代碼如下:3.數(shù)據(jù)加載 2)加載ShapeFile數(shù)據(jù) ShapeFile文件是目前主流的一種空間數(shù)據(jù)的文件存儲(chǔ)方式,也是不同GIS軟件進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換常用的中間格式。加載ShapeFile數(shù)據(jù)的方式有兩種:通過(guò)工作空間加載;通過(guò)IMapControl接口的AddShapeFile方法加載。3.數(shù)據(jù)加載 通過(guò)工作空間加載ShapeFile文件 通過(guò)工作空間加載ShapeF
12、ile文件主要用到IMap、ILayer、IFeatureLayer和IFeatureClass四個(gè)接口。 IMap接口是對(duì)地圖進(jìn)行操作的起點(diǎn),主要用于管理Map對(duì)象中的圖層對(duì)象,要素選擇集和空間參考等對(duì)象。 ILayer接口是圖層對(duì)象的通用接口,它提供了操作圖層的屬性和方法,可用于所有的圖層,例如要素圖層(FeatureLayer)、柵格圖層(RasterLayer)和圖形圖層集合(CompositeGraphicsLayer)等。 IFeatureLayer接口繼承自ILayer接口,提供了訪問(wèn)基于矢量數(shù)據(jù)圖層的屬性和方法,圖層的數(shù)據(jù)可以是Geodatabase,ShapeFile或Cov
13、erage數(shù)據(jù)。 IFeatureClass接口是獲取和設(shè)置要素類屬性的主要接口。如:獲取要素類的類型,得到滿足某個(gè)查詢條件的要素個(gè)數(shù),或在要素類中創(chuàng)建一個(gè)新的功能等。Map、Layer、FeatureLayer三者之間的關(guān)系三者之間的關(guān)系:Map是很多圖層的集合,就像ArcMap的mxd文檔一樣,可以包括很多Layer。Layer是圖層對(duì)象,是數(shù)據(jù)的外殼,必須建立在數(shù)據(jù)的基礎(chǔ)上才有意義。FeatureLayer是具體的要素圖層,需要經(jīng)過(guò)Layer添加到Map中進(jìn)行顯示。FeatureLayer、FeatureClass的區(qū)別的區(qū)別:FeaturLayer是加載在地圖文檔中的矢量數(shù)據(jù)層,只是要
14、素類的表現(xiàn)形式。FeatureClass是一組空間實(shí)體的集合,在數(shù)據(jù)表中存儲(chǔ)了統(tǒng)一的屬性和行為,每一個(gè)FeatureClass都有一個(gè)Geometry類型。IFeatureLayer接口繼承自ILayer接口,IFeatureClass接口繼承自IClass接口;FeatureLayer可以創(chuàng)建自己的對(duì)象,而FeatureClass不行。3.數(shù)據(jù)加載 通過(guò)工作空間加載ShapeFile文件的實(shí)現(xiàn)思路 (1)創(chuàng)建ShapefileWorkspaceFactory實(shí)例pWorkspaceFactory,使用IWorkspaceFactory接口的OpenFromFile方法打開pFeatureWo
15、rkspace中存儲(chǔ)的基于ShapeFile的工作區(qū); (2)創(chuàng)建FeatureLayer的實(shí)例pFeatureLayer,并定義數(shù)據(jù)集; (3)使用IMap接口的AddLayer方法加載pFeatureLayer到當(dāng)前地圖。核心代碼3.數(shù)據(jù)加載 通過(guò)MapControl的AddShapeFile方法加載ShapeFile文件 用MapControl控件的AddShapeFile方法同樣可加載ShapeFile文件,這樣省去了建立工作空間、數(shù)據(jù)集等步驟。調(diào)用該方法需要傳入兩個(gè)參數(shù),分別是文件路徑和不帶擴(kuò)展名的文件名,調(diào)用方法如下: mainMapControl.AddShapeFile(str
16、ing Path,string fileName);3.數(shù)據(jù)加載 3)加載柵格數(shù)據(jù) 柵格數(shù)據(jù)是GIS的數(shù)據(jù)源之一,主要有衛(wèi)星影像、航空影像、掃描的地圖、照片等。常見的柵格數(shù)據(jù)格式有*.bmp、*.tif和*.jpg等,這幾種柵格數(shù)據(jù)的工作空間是其所在的文件夾。添加?xùn)鸥駭?shù)據(jù)主要用到IRasterPyramid3、IRasterLayer等接口。 IRasterPyramid3接口提供了對(duì)柵格數(shù)據(jù)集的金字塔屬性的訪問(wèn),Present屬性用于判斷柵格數(shù)據(jù)集是否存在金字塔,Create方法用于為柵格數(shù)據(jù)集創(chuàng)建金字塔。 IRasterLayer接口繼承自ILayer接口,CreateFromDatase
17、t方法用于從已有的柵格數(shù)據(jù)集對(duì)象創(chuàng)建圖層;CreateFromRaster方法用于從已有的柵格對(duì)象創(chuàng)建圖層;Raster屬性用于獲取IRasterLayer接口中的Raster對(duì)象,DisplayResolutionFactor屬性用于設(shè)置柵格數(shù)據(jù)的分辨率。 在加載柵格文件時(shí),需引用ESRI.ArcGIS.DataSourcesRaster命名空間。3.數(shù)據(jù)加載 加載柵格數(shù)據(jù)的實(shí)現(xiàn)思路 (1)用IWorkspaceFactory接口的OpenFromFile方法獲得柵格文件的工作區(qū); (2)用IRasterWorkspace接口的OpenRasterDataset方法獲得柵格文件的數(shù)據(jù)集,實(shí)例
18、化柵格文件對(duì)象,并對(duì)柵格數(shù)據(jù)集是否具有金字塔進(jìn)行判斷(這里柵格文件如果不具有金字塔則創(chuàng)建金字塔,可以提高大數(shù)據(jù)量圖像的顯示效率); (3)創(chuàng)建RasterLayer類的實(shí)例pRasterLayer,并定義其數(shù)據(jù)集; (4)使用MapControl控件的AddLayer方法將pRasterLayer添加至當(dāng)前地圖。核心代碼3.數(shù)據(jù)加載 4)加載CAD數(shù)據(jù) 對(duì)于ArcGIS Engine來(lái)說(shuō),有兩種不同的方式使用CAD數(shù)據(jù): 作為要素圖層,以矢量數(shù)據(jù)來(lái)使用; 作為柵格圖像,作為地圖背景使用。 對(duì)于前者,ArcGIS Engine使用與FeatureLayer一樣的方法來(lái)管理,對(duì)于后者則采用CadL
19、ayer對(duì)象來(lái)管理。3.數(shù)據(jù)加載 4)加載CAD數(shù)據(jù) CAD文件作為矢量圖層加載 CAD作為矢量加載時(shí)有兩種模式:分圖層加載和整幅圖加載分圖層加載和整幅圖加載。 分圖層加載實(shí)現(xiàn)思路:CAD圖可以分為點(diǎn)、線、面、標(biāo)注分別加載到MapControl中。與加載其它數(shù)據(jù)一樣,首先定義一個(gè)工作空間,用CadWorkspaceFactoryClass實(shí)例化工作空間,并打開相應(yīng)的工作空間;然后創(chuàng)建FeatureLayer的實(shí)例,定義數(shù)據(jù)集,使用IMap接口的AddLayer方法將要素圖層添加至當(dāng)前地圖。 整幅圖加載實(shí)現(xiàn)思路:將CAD作為整幅圖加載時(shí),在得到相應(yīng)的工作空間之后對(duì)CAD文件中的要素進(jìn)行遍歷,并判
20、斷是否為注記圖層,如果是注記則需使用CadAnnotationLayer對(duì)象。3.數(shù)據(jù)加載 4)加載CAD數(shù)據(jù) CAD文件作為柵格圖層加載很多情況下CAD數(shù)據(jù)僅僅用作背景顯示而不參與矢量分析,這時(shí)候可以將CAD文件以柵格圖層的方式加載,這時(shí)需使用ICadLayer和ICadDrawingDataset兩個(gè)接口。ICadLayer接口主要提供了對(duì)CAD文件屬性信息的訪問(wèn),如:圖名(Name)、可見性(Visible)等。ICadDrawingDataset接口提供了對(duì)CAD數(shù)據(jù)集成員的訪問(wèn),可以通過(guò)ICadLayer接口的CadDrawingDataset屬性獲取CAD的數(shù)據(jù)集。 實(shí)現(xiàn)思路如下:
21、首先用IWorkspaceFactory接口的OpenFromFile方法獲得CAD文件的工作區(qū);用ICadDrawingWorkspace接口的OpenCadDrawingDataset方法獲得CAD文件的數(shù)據(jù)集,并將其賦值給CadLayerClass類的實(shí)例對(duì)象pCadLayer的CadDrawingDataset屬性;使用IMap接口的AddLayer方法將pCadLayer添加至當(dāng)前地圖。3.數(shù)據(jù)加載 5)加載Personal Geodatabase數(shù)據(jù) 加載個(gè)人數(shù)據(jù)庫(kù)用到的接口有IFeatureDataset和IEnumDataset。 IFeatureDataset接口繼承自IDa
22、taset接口,在其基礎(chǔ)上增加一個(gè)創(chuàng)建要素類的功能CreateFeatureClass。 IEnumDataset接口用于訪問(wèn)個(gè)人數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)集成員,有Reset和Next兩個(gè)方法。Reset方法重置數(shù)據(jù)集序列,使指針位于第一個(gè)數(shù)據(jù)集之前。Next方法獲取枚舉序列的下一個(gè)數(shù)據(jù)集。 實(shí)例程序?qū)崿F(xiàn)思路如下:創(chuàng)建AccessWorkspaceFactory類的實(shí)例;用IWorkspaceFactory接口的OpenFromFile方法打開*.mdb數(shù)據(jù)集的工作空間,對(duì)工作空間里面的數(shù)據(jù)進(jìn)行加載。核心代碼3.數(shù)據(jù)加載 6)加載File GeoDatabase數(shù)據(jù) 文件地理數(shù)據(jù)庫(kù)是以文件夾形式存儲(chǔ)
23、各種類型的GIS數(shù)據(jù)集,可以存儲(chǔ)、查詢和管理空間數(shù)據(jù)和非空間數(shù)據(jù),支持的地理數(shù)據(jù)庫(kù)的大小最大為1TB,在不使用DBMS的情況下能夠擴(kuò)展并存儲(chǔ)大量數(shù)據(jù),是繼個(gè)人數(shù)據(jù)庫(kù)之后Esri推出的新的數(shù)據(jù)管理系統(tǒng)。文件地理數(shù)據(jù)庫(kù)支持單用戶編輯,不支持版本管理。 實(shí)現(xiàn)思路如下: 由于文件地理數(shù)據(jù)庫(kù)是以文件夾的形式存在的,可以使用FolderBrowserDialog選擇文件夾進(jìn)行加載。 首先創(chuàng)建FileGDBWorkspaceFactoryClass類的實(shí)例; 用IWorkspaceFactory接口的OpenFromFile方法打開文件地理數(shù)據(jù)庫(kù)的工作空間,對(duì)工作空間里面的數(shù)據(jù)進(jìn)行加載。 核心代碼3.數(shù)據(jù)加
24、載 7)加載ArcSDE空間數(shù)據(jù)庫(kù)數(shù)據(jù) ArcSDE(Spatial Database Engine,空間數(shù)據(jù)庫(kù)引擎)是在現(xiàn)有的關(guān)系型數(shù)據(jù)庫(kù)上進(jìn)行的空間擴(kuò)展,它使空間數(shù)據(jù)能保存在關(guān)系數(shù)據(jù)庫(kù)中(如Oracle、SQL Server等)。ArcSDE空間數(shù)據(jù)庫(kù)的一個(gè)重要特點(diǎn)是支持多用戶并發(fā)操作,并且可以通過(guò)版本來(lái)表現(xiàn)空間數(shù)據(jù)編輯的狀態(tài)。當(dāng)完成數(shù)據(jù)編輯后,可將多人的編輯狀態(tài)進(jìn)行版本合并,若多個(gè)用戶對(duì)同一個(gè)要素進(jìn)行了編輯,且編輯狀態(tài)不一樣,將出現(xiàn)“版本沖突”,提示用戶采用哪一個(gè)版本的數(shù)據(jù)。對(duì)于版本的最后的確定, SDE數(shù)據(jù)庫(kù)的加載主要用到IPropertySet接口。屬性集合(PropertySet)
25、對(duì)象是一個(gè)專門用于設(shè)置屬性的對(duì)象,它是一種“名稱-值”對(duì)應(yīng)的集合,類似于哈希表或字典。將取決于用戶對(duì)數(shù)據(jù)管理的權(quán)限。3.數(shù)據(jù)加載 7)加載ArcSDE空間數(shù)據(jù)庫(kù)數(shù)據(jù) 實(shí)現(xiàn)思路如下:創(chuàng)建SdeWorkspaceFactoryClass類的實(shí)例;通過(guò)SDE連接的連接屬性打開SDE數(shù)據(jù)庫(kù)的工作空間,對(duì)工作空間里面的數(shù)據(jù)進(jìn)行加載;3.數(shù)據(jù)加載 8)加載文本文件數(shù)據(jù) 野外測(cè)量的數(shù)據(jù)是GIS數(shù)據(jù)的一個(gè)主要來(lái)源,如GPS、全站儀等儀器測(cè)量的數(shù)據(jù)等。這些數(shù)據(jù)通常為含有X、Y字段的Excel文件或者文本文件。 實(shí)現(xiàn)思路如下: 首先根據(jù)Excel或者*.txt文件等獲取點(diǎn)的坐標(biāo)信息; 創(chuàng)建一個(gè)點(diǎn)結(jié)構(gòu),進(jìn)行點(diǎn)信息的
26、存儲(chǔ)。 創(chuàng)建并實(shí)例化一個(gè)CPoint類型的數(shù)組對(duì)所有的點(diǎn)信息進(jìn)行存儲(chǔ)。 然后根據(jù)點(diǎn)的坐標(biāo)創(chuàng)建ShapeFile圖層; 創(chuàng)建表的工作空間,通過(guò)IFields、IFieldsEdit、IField等接口創(chuàng)建屬性字段,添加到要素集中; 根據(jù)獲得的點(diǎn)坐標(biāo)信息為屬性字段賦值,進(jìn)而得到圖層的要素集。 最后加載該ShapeFile圖層;3.數(shù)據(jù)加載 根據(jù)上述ArcGIS Engine加載幾種常用的數(shù)據(jù)源的方法,可以看出ArcGIS Engine加載空間數(shù)據(jù)一般具有如下五個(gè)步驟: 創(chuàng)建數(shù)據(jù)對(duì)應(yīng)的工作空間工廠(WorkspaceFactory); 使用WorkspaceFactory創(chuàng)建要加載數(shù)據(jù)的工作空間(W
27、orkspace); 使用Workspace打開并得到圖層的數(shù)據(jù)集DataSet; 將DataSet賦值給新建圖層的數(shù)據(jù)源; 添加圖層到MapControl中進(jìn)行顯示。4. 地圖文檔保存 實(shí)例實(shí)現(xiàn)思路如下: (1)地圖文檔的保存主要使用IMapDocument接口。首先使用IMxdContents接口讀取已打開地圖文檔的內(nèi)容,并使之替換IMapDocument接口的實(shí)例對(duì)象; (2)保存時(shí)使用IMapDocument接口的Save方法,函數(shù)原型為:public void Save (bool bUseRelativePaths , bool bCreateThumnbail)。參數(shù)描述bUse
28、RelativePaths 是否保存為相對(duì)路徑(區(qū)別于絕對(duì)路徑)bCreateThumnbail表示保存的地圖在ArcCatalog中查看時(shí)是否顯示縮略圖核心代碼5. 地圖瀏覽 數(shù)據(jù)加載到MapControl中以后,便可以對(duì)地圖進(jìn)行瀏覽和操作,如: 放大與縮小 拉框放大與縮小 漫游 全圖顯示 歷史視圖切換5. 地圖瀏覽 1) 放大與縮小 無(wú)論是放大還是縮小,都是通過(guò)改變MapControl中當(dāng)前視圖的范圍即Extent屬性來(lái)實(shí)現(xiàn)的,主要用到Envelope(包絡(luò)線)類。 Envelope是一個(gè)矩形區(qū)域,它是一個(gè)幾何形體的最小包絡(luò)邊框,每一個(gè)Geometry對(duì)象都擁有一個(gè)包絡(luò)線對(duì)象。 IEnve
29、lope接口是包絡(luò)線對(duì)象的接口。IEnvelope接口的Expand方法用于縮放包絡(luò)線的范圍,進(jìn)而產(chǎn)生一個(gè)新的包絡(luò)線對(duì)象,從而實(shí)現(xiàn)放大與縮小。5. 地圖瀏覽 1) 放大與縮小 實(shí)現(xiàn)思路如下: 中心放大是以當(dāng)前視圖的中心點(diǎn)為縮放中心對(duì)地圖進(jìn)行放大。在放大的操作中,先記下MapControl當(dāng)前的Extent; 然后把該范圍縮小; 最后設(shè)置MapControl的Extent屬性為縮小后的范圍,由于MapControl本身的尺寸沒有變化,這樣就產(chǎn)生了放大效果;5. 地圖瀏覽 2)拉框放大與縮小 拉框放大、縮小需要用到TrackRectangle方法。該方法在MapControl的OnMouseDow
30、n事件中觸發(fā),會(huì)在MapControl上生成一個(gè)由用戶鼠標(biāo)軌跡定義的矩形橡皮筋。該方法返回一個(gè)IPolygon接口的幾何對(duì)象。方法執(zhí)行過(guò)程中,MapControl的OnMouseMove事件被觸發(fā),這時(shí)還沒有發(fā)生MapControl的OnMouseUp事件。所以追蹤時(shí)按下Esc鍵可以取消TrackRectangle的操作。拉框放大拉框放大實(shí)現(xiàn)思路如下:使用Envelope獲取鼠標(biāo)拖出的矩形橡皮筋范圍并賦值給當(dāng)前視圖。若矩形范圍為空則返回。拉框縮小拉框縮小拉框縮小是拉框放大的對(duì)應(yīng)操作,它是把全屏區(qū)域縮小到鼠標(biāo)拖出的方塊區(qū)域中。5. 地圖瀏覽 2)拉框放大與縮小拉框放大拉框縮小5. 地圖瀏覽 3)
31、漫游 漫游又稱為移動(dòng),一般直接調(diào)用MapControl的Pan()方法來(lái)實(shí)現(xiàn)。在MapControl的OnMouseDown事件中,添加如下代碼即可實(shí)現(xiàn)地圖的移動(dòng)。 mainMapControl.Pan(); 4)全圖顯示 全圖顯示就是把地理數(shù)據(jù)集中所有的要素顯示在視圖范圍內(nèi),并且當(dāng)前視圖恰好把所有的地理要素囊括進(jìn)來(lái)。全圖顯示可直接調(diào)用MapControl的FullExtent函數(shù): mainMapControl.Extent = mainMapControl.FullExtent;5. 地圖瀏覽 5)歷史視圖切換 實(shí)現(xiàn)該功能需要用到IExtentStack接口,即堆擴(kuò)展接口。該接口提供了訪問(wèn)
32、控制范圍內(nèi)堆棧成員的方法。方法描述CanRedo是否存在一個(gè)能夠重做的視圖CanUndo是否存在一個(gè)能夠撤銷的視圖Redo重做到下一視圖范圍Undo撤消到上一視圖范圍IExtentStack接口的方法接口的方法 實(shí)現(xiàn)思路如下:新建一個(gè)ExtentStack對(duì)象來(lái)存儲(chǔ)歷史視圖,并賦予視圖窗口中的視圖堆;判斷是否能回到前一視圖或后一試圖,如果能,則視圖窗口中視圖返回到上一視圖和下一視圖。前一視圖代碼后一視圖代碼6. 書簽 ArcGIS中的書簽是保存特定視圖范圍的快捷方式。使用書簽保存關(guān)注的視圖范圍,可在需要時(shí)快速定位、查看與瀏覽。書簽功能主要用到IMapBookmarks、ISpatialBook
33、mark和IAOIBookmark三個(gè)接口。 IMapBookmarks接口 通過(guò)IMapBookmarks接口的Bookmarks屬性可得到地圖文檔中已經(jīng)存在的所有書簽對(duì)象,通過(guò)該接口的AddBookmark和RemoveBookmark方法可以對(duì)書簽進(jìn)行添加和刪除。 ISpatialBookmark接口 ISpatialBookmark接口定義所有空間書簽的共同功能,特別是書簽的Name屬性和ZoomTo方法,Name屬性定義了書簽的名字,通過(guò)ZoomTo方法可跳轉(zhuǎn)到書簽位置點(diǎn)。 IAOIBookmark接口 IAOIBookmark接口繼承自ISpatialBookmark接口,新增了L
34、ocation屬性,用于存儲(chǔ)地圖中感興趣的范圍。6. 書簽 添加書簽 實(shí)現(xiàn)思路如下:通過(guò)IAOIBookmark接口創(chuàng)建書簽,設(shè)置其實(shí)例化對(duì)象的位置屬性為當(dāng)前窗口的范圍;然后通過(guò)IMapBookmarks接口訪問(wèn)當(dāng)前地圖書簽集,添加書簽到地圖的書簽集中。6. 書簽 書簽管理 書簽的管理包含書簽的快速定位、書簽的刪除。 實(shí)現(xiàn)思路如下: 新建一個(gè)Dictionary對(duì)象,鍵、值類型為string、ISpatialBookmark,分別存儲(chǔ)地圖中的書簽名字和其對(duì)應(yīng)的空間書簽; 管理書簽窗口打開時(shí),對(duì)地圖中書簽進(jìn)行遍歷并把書簽名添加到目錄樹中; 當(dāng)選中某個(gè)書簽時(shí),根據(jù)書簽名獲取對(duì)應(yīng)的空間書簽,以進(jìn)行書
35、簽的定位和刪除。7. ICommand和ITool命令操作地圖 在ArcGIS Engine中,一些工具對(duì)象是從ICommand繼承來(lái)的,Esri已經(jīng)封裝好供直接調(diào)用,如ControlsMapZoomOutTool、ControlsMapZoomPanTool等,接口名作用ControlsFullScreenCommandClass全屏顯示ControlsMapZoomInFixedCommand固定比例放大ControlsMapZoomOutFixedCommand固定比例縮小ControlsMapZoomToLastExtentBackCommand前一視圖ControlsMapZoomT
36、oLastExtentForwardCommand后一視圖ControlsNudgeDownCommand向下移動(dòng)選定的元素ControlsNudgeLeftCommand向左移動(dòng)選定的元素ControlsNudgeRightCommand向右移動(dòng)選定的元素ControlsNudgeUpCommand向上移動(dòng)選定的元素ControlsOpenDocCommand打開地圖ICommandICommand接口對(duì)照表接口對(duì)照表 同ICommand接口類似,ArcGIS Engine也有很多對(duì)象繼承了ITool接口,如ControlsMapPanTool、ControlsNewCircleTool等,
37、接口名作用ControlsMapPanTool拖動(dòng)地圖ControlsMapRotateTool旋轉(zhuǎn)數(shù)據(jù)框ControlsMapZoomInTool通過(guò)點(diǎn)擊一個(gè)點(diǎn)或拖動(dòng)框放大ControlsMapZoomOutTool通過(guò)點(diǎn)擊一個(gè)點(diǎn)或拖動(dòng)框縮小ControlsMapZoomPanTool向上/向下拖動(dòng)鼠標(biāo)左鍵放大/縮小,或拖動(dòng)鼠標(biāo)右鍵平移。ControlsNewCircleTool繪制圓ControlsNewCurveTool繪制貝塞爾曲線ControlsNewEllipseTool繪制橢圓ControlsNewFreeHandTool繪制徒手線ControlsNewLineTool繪制線Co
38、ntrolsNewPolygonTool繪制多邊形ControlsNewRectangle繪制矩形 ITool接口對(duì)照表接口對(duì)照表8. 量測(cè) 空間量測(cè)是測(cè)量空間坐標(biāo)框架下的線的長(zhǎng)度、多邊形的面積等。如果要獲取地理實(shí)體的長(zhǎng)度或者面積,首先需要獲取該地理實(shí)體,然后通過(guò)shape字段得到其Geometry,從而獲取長(zhǎng)度和面積等。 這里講的量測(cè)是通過(guò)鼠標(biāo)的追蹤畫線、面得到長(zhǎng)度和面積等。 在進(jìn)行量測(cè)時(shí),測(cè)量結(jié)果窗口會(huì)對(duì)實(shí)時(shí)測(cè)量的結(jié)果進(jìn)行顯示。聲明一個(gè)測(cè)量結(jié)果窗口關(guān)閉的委托事件。核心代碼如下:結(jié)束量算功能和清空用于量算的線或面的實(shí)例化對(duì)象8. 量測(cè) 狀態(tài)欄坐標(biāo)顯示 一般情況下,如同ArcGIS Deskt
39、op軟件,需要在狀態(tài)欄顯示鼠標(biāo)的位置??稍跔顟B(tài)欄添加一個(gè)toolStripStatusLabel控件并設(shè)置其Name屬性為barCoorTxt,用來(lái)顯示鼠標(biāo)所在地圖點(diǎn)上的當(dāng)前坐標(biāo)。 在數(shù)據(jù)視圖的OnMouseMove事件觸發(fā)時(shí)讀取地圖的單位,并在狀態(tài)欄顯示鼠標(biāo)在數(shù)據(jù)視圖中的當(dāng)前地圖點(diǎn)坐標(biāo)。esriUnits單位esriCentimeters厘米esriDecimalDegrees十進(jìn)制esriDecimeters分米esriFeet尺esriInches英寸esriKilometers千米esriMeters米esriMiles英里esriMillimeters毫米esriNauticalMi
40、les海里esriPoints點(diǎn)esriUnknownUnits未知單位esriYards碼地圖單位對(duì)地圖單位對(duì)應(yīng)應(yīng)中文中文表表8. 量測(cè) 距離量測(cè) 距離測(cè)量時(shí),片段長(zhǎng)度通過(guò)兩點(diǎn)間距離計(jì)算得到,全部長(zhǎng)度通過(guò)片段長(zhǎng)度的和計(jì)算得到。主要用到INewLineFeedback和IScreenDisplay兩個(gè)接口。INewLineFeedback接接口口的方法的方法方法描述Start從指定點(diǎn)開始追蹤線的繪制MoveTo鼠標(biāo)移動(dòng)到的點(diǎn),并實(shí)時(shí)繪制與上一節(jié)點(diǎn)的連接線AddPoint添加一個(gè)點(diǎn)Stop停止追蹤線的繪制,并返回用戶繪制的幾何對(duì)象IScreenDisplay接接口口MapControl中的每個(gè)視
41、圖都有一個(gè)ScreenDisplay對(duì)象,用于控制視圖中的圖形繪制。ScreenDisplay對(duì)象除了管理窗體屏幕的顯示屬性外,也管理緩存和視圖屏幕的變化等??梢酝ㄟ^(guò)IActiveView接口的ScreenDisplay屬性獲取ScreenDisplay對(duì)象。通過(guò)ScreenDisplay對(duì)象的DisplayTransformation屬性進(jìn)行設(shè)備單位和地圖單位的轉(zhuǎn)換。8. 量測(cè) 距離量測(cè) 實(shí)現(xiàn)思路如下: 鼠標(biāo)點(diǎn)擊時(shí),首先判斷INewLineFeedback接口的實(shí)例化對(duì)象pNewLineFeedback是否為空,如為空,則實(shí)例化,并設(shè)當(dāng)前鼠標(biāo)點(diǎn)為pNewLineFeedback的起始點(diǎn);反之
42、,則把當(dāng)前鼠標(biāo)點(diǎn)添加到pNewLineFeedback中。 鼠標(biāo)進(jìn)行移動(dòng)時(shí),實(shí)時(shí)計(jì)算鼠標(biāo)移動(dòng)點(diǎn)與上一鼠標(biāo)點(diǎn)擊點(diǎn)的距離,以及所畫線的總長(zhǎng)度。 鼠標(biāo)進(jìn)行雙擊時(shí),停止pNewLineFeedback的繪制,并清空pNewLineFeedback對(duì)象。距離量測(cè)實(shí)例代碼8. 量測(cè) 面積量測(cè) 面積測(cè)量通過(guò)INewPolygonFeedback接口來(lái)繪制多邊形來(lái)實(shí)現(xiàn)。使用NewPolygonFeedback和使用NewLineFeedback的方法類似,但其顯示和返回的幾何特征是一個(gè)封閉的多邊形。這意味著畫多邊形停止時(shí),起點(diǎn)將成為終點(diǎn),從而結(jié)束形狀的繪制。該方法至少要有三個(gè)點(diǎn)被添加到幾何對(duì)象中。 實(shí)現(xiàn)思路如
43、下:鼠標(biāo)點(diǎn)擊時(shí),首先判斷INewPolygonFeedback接口的實(shí)例化對(duì)象pNewPolygonFeedback是否為空,如為空,則實(shí)例化,并設(shè)當(dāng)前鼠標(biāo)點(diǎn)為pNewPolygonFeedback的起始點(diǎn);反之,則把當(dāng)前鼠標(biāo)點(diǎn)添加到pNewPolygonFeedback中。鼠標(biāo)進(jìn)行移動(dòng)時(shí),判斷繪制多邊形時(shí)點(diǎn)集中點(diǎn)的個(gè)數(shù)pPointCol是否超過(guò)3個(gè),如若超過(guò)3個(gè),則由點(diǎn)集構(gòu)建IPolygon接口、IArea接口,進(jìn)而計(jì)算出面的總長(zhǎng)度和面積。鼠標(biāo)進(jìn)行雙擊時(shí),停止pNewPolygonFeedback的繪制,并清空pNewPolygonFeedback對(duì)象。面積量測(cè)實(shí)例代碼9. 要素選擇操作 要
44、素選擇可快速拾取地理要素,并進(jìn)行要素的相關(guān)操作,如:縮放至選擇、屬性信息等。這里主要講解以下三個(gè)功能:要素選擇縮放至選擇清除選擇9. 要素選擇操作 要素選擇 以矩形框或者點(diǎn)選的方式對(duì)地圖中的要素進(jìn)行選擇,用到IMap接口的SelectByShape方法,該方法可以查詢到與輸入的形狀相交的圖層中的所有IFeatureLayer接口類型的Features,但有一個(gè)前提是該FeatureLayer圖層的Selectable屬性為true。 實(shí)現(xiàn)思路如下: 使用MapControl的TrackRectangle方法繪制矩形框,當(dāng)矩形框?yàn)榭諘r(shí),則將鼠標(biāo)當(dāng)前點(diǎn)擊點(diǎn)向外擴(kuò)展為矩形框作為選擇區(qū)域; 然后使用I
45、Map接口的SelectByShape方法進(jìn)行要素的選擇;核心代碼9. 要素選擇操作 縮放至選擇 實(shí)現(xiàn)思路如下: 遍歷地圖中選中的要素; 使用IEnvelop接口的的Union方法獲取所有選中要素的外包框范圍,使地圖視圖縮放至該范圍;調(diào)用ArcEngine的類庫(kù)資源ControlsZoomToSelectedComControlsZoomToSelectedCommandmand進(jìn)行實(shí)現(xiàn)9. 要素選擇操作 清除選擇10. 地圖導(dǎo)出 地圖導(dǎo)出是將地圖保存為圖片,方便快速查看瀏覽。地圖導(dǎo)出分為全域?qū)С龊蛥^(qū)域?qū)С鰞煞N。10. 地圖導(dǎo)出 區(qū)域?qū)С?全域?qū)С?1. 視圖同步 在一個(gè)GIS系統(tǒng)中,一般具有
46、鷹眼窗口、數(shù)據(jù)視圖和布局視圖等幾個(gè)視圖,這幾個(gè)視圖往往表示同一個(gè)地理數(shù)據(jù)集,因此需要使這幾個(gè)視圖中的地理范圍保持同步。11. 視圖同步 1)鷹眼窗口 鷹眼是GIS軟件的必備功能之一。它也是一個(gè)MapControl控件,其主要功能是表示數(shù)據(jù)視圖中的地理范圍在全圖中的位置。 完成鷹眼功能分以下三個(gè)步驟: (1)鷹眼中數(shù)據(jù)與數(shù)據(jù)視圖中的數(shù)據(jù)一致,且鷹眼視圖中地圖始終顯示為全圖。 當(dāng)數(shù)據(jù)視圖加載地圖數(shù)據(jù)時(shí),同時(shí)也把數(shù)據(jù)加載到鷹眼控件中,考慮到鷹眼中只添加個(gè)別全局性的圖層,這里對(duì)地圖數(shù)據(jù)中的線和面進(jìn)行過(guò)濾逐一添加到鷹眼中(大多數(shù)情況下,只需要添加個(gè)別圖層即可)。當(dāng)?shù)貓D以*.mxd的形式添加時(shí)觸發(fā)數(shù)據(jù)視圖
47、中的OnMapRelaced事件。 當(dāng)?shù)貓D以單個(gè)圖層的形式逐個(gè)添加時(shí),OnMapRelaced事件并不會(huì)被觸發(fā),對(duì)該種情況這里封裝成一個(gè)專門的方法SynchronizeEagleEye,在數(shù)據(jù)加載完后調(diào)用此方法即可實(shí)現(xiàn)鷹眼視圖與數(shù)據(jù)視圖的同步。 在進(jìn)行地圖的視圖操作時(shí),經(jīng)常需要刷新地圖以使操作的改變顯示出來(lái)。有的時(shí)候需要全部刷新,這時(shí)候用到pActiveView.Refresh(),更多時(shí)候是局部刷新使用PartialRefresh(),以減少閃爍。11. 視圖同步 (2)鷹眼中添加矩形框?qū)崿F(xiàn)與數(shù)據(jù)視圖的范圍聯(lián)動(dòng) 當(dāng)數(shù)據(jù)視圖的顯示范圍發(fā)生變化時(shí),會(huì)觸發(fā)OnExtentUpdata事件,在該事件
48、中繪制鷹眼視圖中的方框。獲取數(shù)據(jù)視圖中的地圖顯示范圍作為矩形框范圍,添加到鷹眼視圖中。 核心代碼如下: /得到當(dāng)前視圖范圍 IEnvelope pEnvelope = (IEnvelope)e.newEnvelope; DrawRectangle(pEnvelope);11. 視圖同步 (3)矩形框的拖動(dòng)與繪制 實(shí)現(xiàn)思路如下: 在鷹眼中進(jìn)行操作時(shí),若是鼠標(biāo)左鍵按下,判斷鼠標(biāo)點(diǎn)擊點(diǎn)是否在矩形框范圍之內(nèi)。若在,則可以進(jìn)行矩形框的拖動(dòng);若不在,則使數(shù)據(jù)視圖以當(dāng)前點(diǎn)擊點(diǎn)為中心進(jìn)行顯示; 當(dāng)鼠標(biāo)右鍵按下時(shí),可以進(jìn)行矩形框的繪制,使數(shù)據(jù)視圖的地圖顯示為矩形框范圍。11. 視圖同步 2)數(shù)據(jù)視圖與布局視圖的
49、同步 數(shù)據(jù)視圖與布局視圖的同步,首先要保證數(shù)據(jù)的一致性,其次是數(shù)據(jù)顯示范圍的一致性。該同步主要涉及到IMapControl接口的OnMapReplaced事件和OnAfterScreenDraw事件。 OnMapReplaced事件發(fā)生在MapControl的地圖被替換后,即在IMapControl接口的Map被另一個(gè)地圖替換時(shí)(如IMapControl接口的LoadMxFile方法被調(diào)用時(shí)或Map屬性被明確替換)觸發(fā)該事件。 OnAfterScreenDraw事件發(fā)生在MapControl內(nèi)的地圖完成繪制之后,即在IDisplayEvents接口的DisplayFinished事件之后被觸發(fā),而IDisplayEvents接口的DisplayFinished事件則在地圖顯示于屏幕時(shí)被觸發(fā)。 實(shí)現(xiàn)思路如下: 當(dāng)數(shù)據(jù)視圖的范圍發(fā)生變化時(shí),獲得此時(shí)數(shù)據(jù)視圖的范圍; 傳到布局視圖控件的視圖中,同時(shí)使用數(shù)據(jù)拷貝的方法保證數(shù)據(jù)
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)衛(wèi)生檢查內(nèi)容及標(biāo)準(zhǔn)
- 地面標(biāo)高定位線
- 第18課《我的白鴿》導(dǎo)學(xué)案
- 二零二五年社會(huì)福利機(jī)構(gòu)護(hù)理人員職業(yè)發(fā)展與福利保障合同3篇
- 一年級(jí)家長(zhǎng)培訓(xùn)會(huì)電子教案
- 執(zhí)業(yè)醫(yī)師考試心得
- 黑豬養(yǎng)殖發(fā)展前景分析
- 2024年浙江國(guó)際海運(yùn)職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 二零二五年酒店客房預(yù)訂系統(tǒng)經(jīng)營(yíng)權(quán)出兌合同3篇
- 2024年閬中市中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 《榜樣9》觀后感心得體會(huì)一
- 虛擬偶像市場(chǎng)分析-洞察分析
- 2025年湖北黃石市大冶市中小企業(yè)融資擔(dān)保有限責(zé)任公司招聘筆試參考題庫(kù)附帶答案詳解
- 2025年神經(jīng)外科護(hù)理工作計(jì)劃
- 2025年包鋼(集團(tuán))公司新員工招聘【941人】高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《義務(wù)教育法解讀》課件
- 山東省濟(jì)南市2023-2024學(xué)年高一上學(xué)期期末考試生物試題(解析版)
- 鋼結(jié)構(gòu)施工管理培訓(xùn)課件
- 2025年工程春節(jié)停工期間安全措施
- 【頭頸】頸動(dòng)脈CTA及MRA評(píng)價(jià)課件
- 寒假安全教育
評(píng)論
0/150
提交評(píng)論