




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