ARCGISENGINE10開發(fā)手冊word版_第1頁
ARCGISENGINE10開發(fā)手冊word版_第2頁
ARCGISENGINE10開發(fā)手冊word版_第3頁
ARCGISENGINE10開發(fā)手冊word版_第4頁
ARCGISENGINE10開發(fā)手冊word版_第5頁
已閱讀5頁,還剩321頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一 ArcGIS 介紹 ArcGIS 軟件架構(gòu) ArcGIS 是 ESRI 在全面整合了 GIS 與數(shù)據(jù)庫、軟件工程、人工智能、網(wǎng)絡(luò)技術(shù)及其它多方面的計算機主流 技術(shù)之后,成功地推出了代表 GIS 最高技術(shù)水平的全系列 GIS 產(chǎn)品。ArcGIS 是一個全面的,可伸縮的 GIS 平臺,為用戶構(gòu)建一個完善的 GIS 系統(tǒng)提供完整的解決方案。ArcGIS 的基本體系能夠讓用戶在任何需要的 地方部署 GIS 功能和業(yè)務(wù)邏輯,無論是在桌面、服務(wù)器、還是在野外: 桌面 GIS(ArcGIS Desktop)ArcGIS 桌面 GIS 軟件產(chǎn)品是用來編輯、設(shè)計、共享、管理和發(fā)布地理信息 和概念。ArcGI

2、S 桌面可伸縮的產(chǎn)品結(jié)構(gòu),從 ArcReader,向上擴展到 ArcView、ArcEditor 和 ArcInfo。目 前 ArcInfo 被公認為是功能最強大的 GIS 產(chǎn)品。通過一系列的可選的軟件擴展模塊,ArcGIS Desktop 產(chǎn)品 的能力還可以進一步得到擴展。 嵌入式 GIS(Embedded GIS)ArcGIS Engine 是一個完整的嵌入式 GIS 組件庫和工具包,開發(fā)者能用它創(chuàng) 建一個新的、或擴展原有的可定制的桌面應(yīng)用程序。使用 ArcGIS Engine,開發(fā)者能將 GIS 功能嵌入到已 有的應(yīng)用程序中,如基于工業(yè)標準的產(chǎn)品以及一些商業(yè)應(yīng)用,也可以創(chuàng)建自定義的應(yīng)用程

3、序,為組織機構(gòu) 中的眾多用戶提供 GIS 功能。 服務(wù)器 GIS(Server GIS)ArcGIS Server、ArcIMS 和 ArcSDE 用于創(chuàng)建和管理基于服務(wù)的 GIS 應(yīng)用程序, 在大型機構(gòu)和互聯(lián)網(wǎng)上眾多用戶之間共享地理信息。ArcGIS Server 是一個中心應(yīng)用服務(wù)器,它包含一個 可共享的 GIS 軟件對象庫,能在企業(yè)和 Web 計算框架中建立服務(wù)器端的 GIS 應(yīng)用。ArcIMS 是通過開放的 I nternet 協(xié)議發(fā)布地圖、數(shù)據(jù)和元數(shù)據(jù)的可伸縮的網(wǎng)絡(luò)地圖服務(wù)器。ArcSDE 是在各種關(guān)系型數(shù)據(jù)庫管理系 統(tǒng)中管理地理信息的高級空間數(shù)據(jù)服務(wù)器。 移動 GIS(Mobile

4、 GIS)ArcPad,支持 GPS 的無線移動設(shè)備,越來越多地應(yīng)用在野外數(shù)據(jù)采集和信息訪 問中。ArcGIS 桌面和 ArcGIS Engine 可以運行在便攜式電腦或平板電腦上,用戶可以在野外進行數(shù)據(jù)采集、 分析和乃至制定決策。 ArcGIS Engine 介紹 ArcGIS Engine 是一組完備的并且打包的嵌入式 GIS 組件庫和工具庫,開發(fā)人員可用來創(chuàng)建新的或擴展已 有的桌面應(yīng)用程序。使用 ArcGIS Engine,開發(fā)人員可以將 GIS 功能嵌入到已有的應(yīng)用軟件中,如自定義 行業(yè)專用產(chǎn)品;或嵌入到商業(yè)生產(chǎn)應(yīng)用軟件中,如 Mirosoftf Word 和 Excel;還可以創(chuàng)建集

5、中式自定義 應(yīng)用軟件,并將其發(fā)送給機構(gòu)內(nèi)的多個用戶。 ArcGIS Engine 由兩個產(chǎn)品組成:構(gòu)建軟件所用的開發(fā)工具包以及使已完成的應(yīng)用程序能夠運行的可再發(fā) 布的 Runtime(運行時環(huán)境)。ArcGIS Engine 開發(fā)工具包是一個基于組件的軟件開發(fā)產(chǎn)品,可用于構(gòu)建 自定義 GIS 和制圖應(yīng)用軟件。它并不是一個終端用戶產(chǎn)品,而是軟件開發(fā)人員的工具包,適于為 Windows、 UNIX 或 Linux 用戶構(gòu)建基礎(chǔ)制圖和綜合動態(tài) GIS 應(yīng)用軟件。ArcGIS Engine Runtime 是一個使終端用戶 軟件能夠運行的核心 ArcObjects 組件產(chǎn)品,并且將被安裝在每一臺運行

6、ArcGISEngine 應(yīng)用程序的計算機 上。 ArcGIS Engine 是基于 COM 技術(shù)的可嵌入的組件庫和工具包,ArcGIS Engine 可以幫助我們很輕松的構(gòu) 建自定義應(yīng)用程序. 使用 ArcGIS Engine,開發(fā)人員可以將 GIS 功能嵌入到已有的應(yīng)用軟件中,如自定義行業(yè)專用產(chǎn)品; 或嵌入到商業(yè)生產(chǎn)應(yīng)用軟件中,如 Mirosoftf Word 和 Excel;還可以創(chuàng)建集中式自定義應(yīng)用軟件,并 將其發(fā)送給機構(gòu)內(nèi)的多個用戶。 ArcGIS Engine 由兩個產(chǎn)品組成: 面向開發(fā)人員的軟件開發(fā)包(ArcGIS Engine Developer kit) 面向最終用戶的運行時

7、(ArcGIS Engine Runtime) ArcGIS Engine 開發(fā)工具包是一個基于組件的軟件開發(fā)產(chǎn)品,可用于構(gòu)建自定義 GIS 和制圖應(yīng)用軟件。它 并不是一個終端用戶產(chǎn)品,而是軟件開發(fā)人員的工具包,支持四種開發(fā)環(huán)境(C, COM, .NET,以及 Java),適于為 Windows、UNIX 或 Linux 用戶構(gòu)建基礎(chǔ)制圖和綜合動態(tài) GIS 應(yīng)用軟件。 ArcGIS Engine Runtime 是一個使終端用戶軟件能夠運行的核心 ArcObjects 組件產(chǎn)品,并且將被安裝在 每一臺運行 ArcGIS Engine 應(yīng)用程序的計算機上。 ArcGIS Engine 的邏輯體系

8、結(jié)構(gòu) : Base Services 包含了 ArcEngine 中最核心的 ArcObjects 組件,幾乎所有的 GIS 組件需要調(diào)用它們,如 Ge ometry 和 Display 等。 Data Access 包含了訪問矢量或柵格數(shù)據(jù)的 GeoDatabase 所有的接口和類組件。 Map Presentation 包含了 GIS 應(yīng)用程序用于數(shù)據(jù)顯示、數(shù)據(jù)符號化、要素標注和專題圖制作等需要的接口和類 組件。 Develper Components 包含了進行快速開發(fā)所需要的全部可視化控件,如 MapControl、PageLayoutControl、SceneControl、Glo

9、beControl、TOCControl、ToolbarControl、SymbologyControl 和 LicensenControl 控件等,除了這些, 該庫還包括大量可以有 ToolbarControl 調(diào)用的內(nèi)置 commands、tools、Menus,它們可以極大地簡化二次 開發(fā)工作。 Extensions 在圖中我們可看出,ArcEngine 的開發(fā)體系是一條縱線,功能豐富,層次清晰。最上層的 Extensions 包含 了許多高級開發(fā)功能,如 GeoDatabase Update、空間分析、三維分析、網(wǎng)絡(luò)分析、Schematics 邏輯示意圖 以及數(shù)據(jù)互操作等。ArcEng

10、ine 標準版并不包含這些 ArcObjects 許可,他們只能作為擴展存在,需要特定 的 License 才能運行。 ArcGIS Engine 中的類庫 ArcGIS Engine 開發(fā)中,為了更好的管理這些 COM 對象,ESRI 將這些 COM 對象放在不同的組件庫中,而他 們被物理的防盜 bin 目錄下的 dll 中,而邏輯上被分散到不同的命名空間中 System System 庫是ArcGIS 架構(gòu)中最底層的庫。該庫包含了暴露組成ArcGIS 的其它庫所使用的服務(wù)的組件。 System 庫中定義了許多接口,它們可以由開發(fā)者來實現(xiàn)。AoInitializer 對象在System 中定

11、義;所有開 發(fā)者必須使用該對象在使用Engine 功能的應(yīng)用程序中初始化和uninitialize ArcGIS Engine。開發(fā)者不擴 展該庫,但可以通過實現(xiàn)其中的接口來擴展ArcGIS系統(tǒng)。 SystemUI SystemUI 庫中包含了可在ArcGIS Engine 中擴展的用戶界面組件的接口定義,包括ICommand、ITool 和 IToolControl 接口。開發(fā)者使用這些接口來擴展UI 組件。該庫所包含的對象是utility 對象,開發(fā)者可 用于簡化某些用戶界面的開發(fā)。開發(fā)者不擴展該庫,但可以通過實現(xiàn)其中的接口來擴展ArcGIS 系統(tǒng)。 Geometry Geometry 庫

12、處理存儲在特征類(feature classes)或其它圖形要素(graphical elements)中的特征的 geometry 或shape。大多數(shù)用戶交互的基本幾何對象有Point 、MultiPoint 、Polyline和Polygon 。除了 這些頂層的實體,還有作為Polylines 和Polygons 構(gòu)建模塊的幾何體(geometries)。這些是組成幾何體的 基元(primitives)。它們是Segments、Paths 和Rings。Polylines和Polygons 由形成一條Path 的依次相 連的Segments 組成。一個Segment 包含兩個不同的點,

13、起點和終點,和一個定義從起點到終點的曲線的要素類型。這種segments 有CircularArc、Line、 EllipticArc 和BezierCurve。所有的幾何對象都可以有與它們頂點相關(guān)的Z、M 和IDs?;镜膸缀螌ο蠖?支持幾何操作,如Buffer 和Clip。開發(fā)者不可以擴展幾何基元。GIS 中的實體是指現(xiàn)實世界中的特征;這 些現(xiàn)實世界中的特征的位置由具有空間參考的幾何體來定義。投影和地理坐標系統(tǒng)的空間參考對象都包含 在Geometry 庫中。開發(fā)者可以通過在空間參考間添加新的空間參考和投影來擴展空間參考系統(tǒng)。 Display Display 庫包含了用于GIS 數(shù)據(jù)顯示的對

14、象。除了負責(zé)實際圖像輸出的主要顯示對象,該庫中還包含了表 示顏色和符號的對象,這些顏色和符號用于控制顯示上所繪制實體的屬性。庫中也包含了為用戶在與顯示 交互時提供可視化反饋的對象。開發(fā)者大都通過類似于Map 或PageLayout 對象提供的視圖與顯示交互。該 庫的所有部分都可以被擴展,常被擴展的有符號、顏色和顯示反饋(display feedbacks)。 Output Output 庫被用于創(chuàng)建圖形輸出到設(shè)備,如打印機、繪圖儀和硬拷貝格式,如增強型圖元文件(enhanced metafiles)和柵格影像格式(JPG、BMP 等)。開發(fā)者使用該庫和ArcGIS 系統(tǒng)其它部分中的對象來創(chuàng)建圖

15、形 輸出。通常這些是Display 和Carto 庫中的對象。開發(fā)者可以擴展output 庫用于定制的設(shè)備和輸出格式 。 GeoDatabase GeoDatabase 庫提供了用于geodatabase 的編程API。Geodatabase 是一個構(gòu)建在標準工業(yè)關(guān)系和對象數(shù)據(jù) 庫技術(shù)基礎(chǔ)上的地理數(shù)據(jù)儲存庫。庫中的對象為ArcGIS 支持的所有數(shù)據(jù)源提供了統(tǒng)一的編程模型。 GeoDatabase 庫定義了許多由架構(gòu)中較高層次數(shù)據(jù)源提供者實現(xiàn)的接口。開發(fā)者可以擴展geodatabase 來 支持特殊的數(shù)據(jù)對象(Features、Classes 等)類型。此外,還可以使用PlugInDataSou

16、rce 對象添加自定義 的矢量數(shù)據(jù)源。geodatabase 支持的native 數(shù)據(jù)類型不可以被擴展。 DataSourcesFile DataSourcesFile 庫包含用于基于文件數(shù)據(jù)源的GeoDatabase API 的實現(xiàn)。這些基于文件的數(shù)據(jù)源包括 shapefile、coverage、TIN、CAD、SDC、ArcGIS StreetMap和VPF。開發(fā)者不能擴展DataSourcesFile 庫。 DataSourcesGDB DataSourcesGDB 庫包含了用于數(shù)據(jù)庫數(shù)據(jù)源的GeoDatabase API 的實現(xiàn)。這些數(shù)據(jù)源包括Microsoft Access 和SDE

17、甛u-28817?件支持的RDBMSs。開發(fā)者不能擴展DataSourcesGDB庫。 DataSourceOleDB DataSourcesOleDB 庫包含用于Microsoft OLE DB 數(shù)據(jù)源的GeoDatabase API 的實現(xiàn)。該庫只有在 Microsoft Windows 操作系統(tǒng)上才可以使用。這些數(shù)據(jù)源包括任何OLE DB 支持的數(shù)據(jù)提供者和文本文件工 作空間。開發(fā)者不能擴展DataSourcesOleDB庫。 DataSourceRaster DataSourcesRaster 庫包含了用于Raster 數(shù)據(jù)源的GeoDatabase API 的實現(xiàn)。這些數(shù)據(jù)源包括SD

18、E 軟件支 持的RDBMSs,和所有支持的RDO柵格文件格式。當需要支持新的柵格 格式時,開發(fā)者不擴展該庫,而是擴展RDO。開發(fā)者不擴展DataSourcesRaste 庫。 GeoDatabaseDistributed GeoDatabaseDistributed 庫通過提供數(shù)據(jù)導(dǎo)入、導(dǎo)出geodatabase 的工具來支持到企業(yè)geodatabase 的分 布式訪問。開發(fā)者不擴展GeoDatabaseDistributed 庫。 Carto Carto 庫支持地圖的創(chuàng)建和顯示;這些地圖可以包含一幅地圖或具有多幅地圖和相關(guān)旁注的頁中的數(shù)據(jù)。 PageLayout 對象是宿主一幅或多幅地圖和相

19、關(guān)旁注(指北針、圖例、比例尺條等)的容器。Map 對象是圖層 的容器。Map 對象有操作地圖中所有圖層的屬性:空間參考、地圖比例尺等,還有操作地圖圖層的方法。 有多種不同類型的圖層可以被加載到地圖中。不同數(shù)據(jù)源通常有一個相關(guān)圖層負責(zé)在地圖上顯示數(shù)據(jù);矢 量特征由FeatureLayer 對象處理,柵格數(shù)據(jù)由RasterLayer 對象處理,TIN 數(shù)據(jù)由TinLayer 對象處理等。 若需要,圖層可以為它們的相關(guān)數(shù)據(jù)處理所有的繪制操作。但更常見的是圖層擁有一個相關(guān)的Renderer 對 象。Renderer 對象的屬性控制數(shù)據(jù)在地圖中怎樣顯示。Renderers 一般使用Display 庫中的

20、symbols 進行 實際繪圖;renderer 只是匹配指定的符號與要繪制的實體的屬性。一個Map 和一個PageLayout 可以包含 要素(elements)。要素利用幾何體來定義它在地圖或頁面上的位置,以及控制要素顯示的行為。有用于基 本形狀、文本標注、復(fù)雜旁注等的要素。Carto 庫也包含對地圖注記和動態(tài)標注的支持。 Location Location 庫包含支持地理編碼和與route 事件一起工作的對象??赏ㄟ^full 控件的finegrained對象訪問 地理編碼功能,或GeocodeServer 對象提供了一個簡化的API。開發(fā)者可以創(chuàng)建他們自己的地理編碼對象 。 線性參考功能

21、提供了添加事件到線性特征的對象,并使用多種繪制方法渲染這些事件。開發(fā)者可以擴展線 性參考功能。 NetworkAnalysis NetworkAnalysis 庫提供的對象在網(wǎng)絡(luò)加載到geodatabase 中時,使用網(wǎng)絡(luò)數(shù)據(jù)和對象populating a geodatabase 來分析網(wǎng)絡(luò)。開發(fā)者可以擴展該庫來支持定制的網(wǎng)絡(luò)跟蹤。該庫是用于utility 網(wǎng)絡(luò)的 gas lines、electricity supply lines 等。 Controls 開發(fā)者使用Controls 庫來構(gòu)建或擴展具有ArcGIS 功能的應(yīng)用程序。ArcGIS Controls 通過封裝 ArcObjects

22、 和提供一個coarser-grained API,簡化了開發(fā)過程。盡管控件封裝了fine grained ArcObjects, 但它們并不限制訪問這些ArcObjects。MapControl 和PageLayoutControl分別封裝了Carto 庫中的Map 和 PageLayout 對象。ReaderControl 封裝了Map 和PageLayout對象,并在使用該控件時提供了簡化的API。 如果地圖出版商擁有授權(quán)許可,那么開發(fā)者可 以訪問Map 和PageLayout 控件的類似方式訪問內(nèi)部對象。該庫也包含實現(xiàn)內(nèi)容列表的TOCControl 和宿主 與一個合適控件一起工作的命令

23、和工具的ToolbarControl GeoAnalyst GeoAnalyst 庫包含支持核心空間分析功能的對象。這些功能在ArcGIS Spatial Analyst和ArcGIS 3D Analyst庫中使用。開發(fā)者可以通過創(chuàng)建一個新的柵格操作類型來擴展該庫。要求有ArcGIS Spatial Analyst 或3D Analyst 許可才能使用該庫中的對象。 3DAnalyst 3DAnalyst 庫包含在三維場景中使用的對象,它們的工作方式類似于Carto 庫中包含的對象在二維地圖中 工作。Scene 對象是庫中的主要對象之一,因為它與Map 對象類似,是數(shù)據(jù)的容器。Camera 和

24、Target 對 象根據(jù)特征相對于觀察者的位置,指定場景的視圖。一個場景(scene)包含一個或多個圖層;這些圖層指定 了場景中的數(shù)據(jù)和數(shù)據(jù)怎樣繪制。 3DAnalyst 庫擁有一個開發(fā)控件和一組和該控件協(xié)同工作的命令和工具。該控件可以與Controls 庫中的對 象聯(lián)合使用。除了創(chuàng)建命令和工具,開發(fā)者對該庫的擴展較少。使用該庫中的對象需要3D Analyst 許可 。 GlobeCore GlobeCore 庫包含與globe 數(shù)據(jù)一起工作的對象,工作方式類似于Carto 庫中包含的對象在二維地圖中工 作。Globe 對象是庫中的主要對象之一,因為它與Map 對象類似,是數(shù)據(jù)的容器。Glob

25、eCamera 對象根據(jù) globe 相對于觀察者的位置,指定了Globe 視圖。Globe 可以有一個或多個圖層;這些圖層指定了Globe 上 的數(shù)據(jù)和數(shù)據(jù)怎樣繪制。 介紹完這些,讓我們有個感性上的認識,在以后找某個對象的時候,知道去哪個 dll 中找。 二和 ArcGIS Engine 開發(fā)相關(guān)的 C#知識 接口編程 使用 ArcGIS Engine,也就意味著使用里面的接口,那么什么是接口呢?在面向?qū)ο蟮木幊讨?,我們都?接觸到這個玩意兒,我們知道面向?qū)ο笥腥筇匦?封裝,繼承,多態(tài),相信很多人在學(xué)習(xí)多態(tài)的時候, 會接觸接口。 接口可以用這樣一句話來描述“接口就是包含一系列不被實現(xiàn)的方法

26、.而把這些方法的實現(xiàn)交給繼承它的 類.”,這句話看起來很晦澀,沒關(guān)系,我們通過下面一個例子說明 我定義了一個接口 IPeople using System; using System.Collections.Generic; using System.Text; namespace InterfaceTest interface IPeople void gender(); 這個接口里面有一個性別的方法,這個只對方法進行了定義,而方法內(nèi)卻沒有內(nèi)容,也就是說,通過這個 接口的這個 gender 方法,我們不能知道它到底干什么,但是要知道這個 gender 到底是干什么用的,那么 就要看實現(xiàn)了這個

27、方法的類。同理我定義兩個類,分別實現(xiàn)這個接口。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceTest class Boy:IPeople public void gender() Console.WriteLine(Im a boy.);using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace In

28、terfaceTest class Girl:IPeople public void gender() Console.WriteLine(Im a girl.); 通過上面的兩個類,我們就很清楚的看到這個方法的作用了,我們也可以看到一個接口可以被多個類實現(xiàn)。 我們運行一下這個,看一下效果 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceTest class Program static void Main(string args)

29、IPeople Person; / 聲明接口變量 Person = new Boy(); / 實例化,接口變量中存放對象的引用 Person.gender(); / 這個調(diào)用的是 Boy 中的 gender 方法 Person = new Girl(); / 實例化,接口變量中存放對象的引用 Person.gender(); / 這個調(diào)用的是 Gril 中的 gender 方法 Console.ReadLine(); 運行結(jié)果如下: C#接口的例子 快速掌握 OMD 我們已經(jīng)知道使用 ArcGIS Engine 開發(fā),也就意味著我們要和接口打交道,ArcGIS Engine 中提供的接口 和類

30、加起來估計上萬,但是用過 ArcGIS Engine 的人,知道這個數(shù)字不為過。ArcGIS Engine 為了幫助我 們方便的使用這些,將這些分散在不同的類庫中,為了便于我們閱讀,ArcGIS Engine 提供了一系列的對 象模型圖,也就是 OMD (Object model diagrams) 對象模型圖表。 下面圖示中,便是貫穿本節(jié)的對象模型圖的鑰匙。 這些符號是基于 UML 畫圖工具創(chuàng)建的,UML 符號是面向?qū)ο蠓治龊驮O(shè)計的工業(yè)圖樣標準。 對象模型圖中提供的信息非常多,是對象瀏覽器中信息的重要補充。Visual Basic,或者其它的開發(fā)環(huán)境, 都會列出所有的類和成員,但不會指明這些

31、類之間的關(guān)系。所以,對象模型圖是非常有利于讀者對 ArcInfo 組件的理解的! 本書使用 UML 來描述 ArcInfo 組件,即 ArcObjects,并描述你能夠創(chuàng)建的數(shù)據(jù)模型。 以下詳細說明。 1. 類和對象 在 UML 圖中有三種類型的類:抽象類(abstract class)、組件類(CO class)與普通類(instantiable class)。 抽象類:不能創(chuàng)建或?qū)嵗瑥膩頉]有一個抽象類的實例用于定義子類的公共接口,創(chuàng)建實例的任務(wù)由其 子類完成。子類繼承其定義的接口。 OMD 符號為:二維的內(nèi)部有陰影的矩形。 普通類:不能創(chuàng)建,從別的對象獲得實例。 OMD 符號為:3D

32、矩形內(nèi)部沒有陰影。 組件類:可以直接創(chuàng)建實例的類,在 C#中,用 New 關(guān)鍵字。 OMD 符號為:帶陰影的 3D 矩形符號。 2. 關(guān)聯(lián) 在抽象類、可創(chuàng)建類和可實例化類之間,有幾種存在的關(guān)聯(lián)(或稱關(guān)系)。 聯(lián)系(association)便描述了類之間的關(guān)聯(lián)。在兩端的類中可以定義多重性( Multiplicity)關(guān)聯(lián)。 在這張圖上,一個業(yè)主能有擁有一塊或多塊宗地;同樣地,一塊宗地可以被一個 或多個業(yè)主所共有。 多重性關(guān)聯(lián)就是限制對象類與其它對象關(guān)聯(lián)的數(shù)目關(guān)系。以下是用于多重性關(guān)聯(lián) 的符號: 1 一個并且只有一個,這種多樣性是可選的;如果不標明,則默認為“1” 0.1 零個或一個 M.N 從

33、M 到 N(正整數(shù)) *或者 0 * 從零到任意正整數(shù) 1 * 從一到任意正整數(shù) 多個聯(lián)系 在這張圖上,我們可以得知有不 類繼承(type inheritance)定義了專門的類,它們擁有超類的屬性和方法,并且同時也有自身的屬性和方 法。 上圖說明 primary line 和 secondary line 是 line 的一種類型。 實例化(Instantiation)指定一個類的對象有這樣的方法,它能夠創(chuàng)建另外一個類的對象。 pole 對象有一個方法能夠創(chuàng)建 transformer 對象。 聚合(Aggregation)是一種不對稱的關(guān)聯(lián)方式,在這種方式下一個類的對象被認為是一個“整體”,

34、而另一 個類的對象被認為是“部件”。 一個 transformer bank 正好有 3 個 transformer 。在這個圖中 transformer 能和一個 transformer bank 相關(guān)聯(lián),但當 transformer bank 移除以后,transformer 依然能夠存在。 組成(Composition)是一種更為強壯的聚合方式,此種方式下,“整體”對象控制著“部分”對象的生存時間。 一個 Pole 包含一個或多個 Crossarm。在這個圖中當 pole 被移除后,Crossarm 就不能再使用了。因為 Pole 控制著 Crossarm 的生存時間。 在 OMD 圖中

35、,我們不僅僅能看到類之間的相互關(guān)系,還可以得到屬性的一些信息,如下圖: 屬性和方法: 屬性:啞鈴狀的圖標,Read(左側(cè)的實心啞鈴)和 write(右側(cè)的實心啞鈴) 屬性除了我們常說的類型,還有一種屬性,這個屬性本身就是一個對象,符號,空心的啞鈴 方法:指向左側(cè)的箭頭。 抽象類(AbstractClass)defines how it is done.79 頁 Explroing ArcObjects V9.0)ArcEngline 組件庫的每一個組件中定義有不同的類,類下面定義了不同接口,接口中包含不同的屬性和方 法。類之間有類型繼承(Typelnheritance)關(guān)系,接口之間有互相調(diào)用

36、(Querylnterface)及相互繼承 (Interfacelnheritance)關(guān)系。 1.1 類與對象在面向?qū)ο缶幊讨?,類和對象是兩個非常重要的概念,可以這么說類就是創(chuàng)建對象的藍本,而 對象是指具有屬性和動作的實體,它封裝了一個客觀實體的屬性與行為。ArcObjcets 中有三類 class,分別是 、組件類(CoClass)和普通類(Class)。抽象類的主要目的是為它的子類定義公共 接口,一個抽象類將把它的部分或全部實現(xiàn)延遲到子類中,因此,一個抽象類不能被實例化。一個組件類 對象可以被直接創(chuàng)建,普通類對象雖然不能直接創(chuàng)建,但它可以可以作為其它類的一個屬性或者從其它類 的實例化來創(chuàng)

37、建。 1.2 接口和類接口定義了一組方法和屬性,在 ArcObjects 中接口名稱都以”I”開始,如 IMap , Ilayer 等。類 實現(xiàn)了接口中的方法。一個類可以有多個接口,如 FeatureLayerClass 類有 IFeatureLayer,IFeatureSelection 等不同接口,而一個接口也可被多個類所擁有,如 CadFeatureLayer 類和 FeatureLayer 類都有 IFeatureLayer 接口。接口定義了能做什么,而定義了該怎么做(The interfacedefines what an object can do, and the class ,

38、在 AO 開發(fā)的時候,和對象間的通信是通過接口完 成的,而不是我們在一些其他面向?qū)ο笳Z言如(Java)中和對象的通信是通過對象完成的. 1.3 接口查詢(QueryInterface) 一個類可以有多個接口,聲明了接口變量并且指向一個對象的時候,這個變 量只能使用該接口內(nèi)的方法和屬性,而不能訪問其他接口中的方法和屬性,如: Dim pMap as IMap Set pMap = New Map pMap.Clear 這里會產(chǎn)生錯誤此時的 pMap 只能使用 IMap 接口中定義的方法和屬性,比如獲取 圖層的個數(shù),添加圖層等,但是不能清空視圖上的內(nèi)容(因為這個方法是在 IActiveView 中

39、定義的) QueryInterface(QI)很方便的讓我們在一個類的不同接口間進行切換: Dim pView as IActiveView set pView= pMap QI 現(xiàn)在 mView 就可以使用 IActiveView 中定義的方法了. 1.4 類類型繼承類型繼承是指類之間的接口類型的繼承,而不是繼承其實現(xiàn)。繼承過來的接口只是名稱相 同,具體的實現(xiàn)則不同。比如 ShpfileWorkspaceFactry 和 AccessWorkspaceFactry 都繼承 WorkspaceFactry , 而他們的打開(OpenFromFile)方法卻不一樣,ShpfileWorkspac

40、eFactry 的(OpenFromFile)方法需要一個 文件目錄位置作為參數(shù),而 AccessWorkspaceFactry 的(OpenFromFile)方法需要一個數(shù)據(jù)庫(mdb)位置 作為參數(shù)。1.5 接口繼承如 ImapFrame 接口和 IMapSurroundFrame 接口繼承于 IFrameElement 接口,則父類 接口 IFrameElement 所具有的方法和屬性對派生接口 ImapFrame 和 IMapSurroundFrame 都有效。 快速理解 QI C#+QI 的例子 COM 中,和我們打交道的是接口,也就是說類對我們是隱形的,那么我們要做開發(fā),要使用這些

41、功能,我 們只能通過接口,通過接口暴露出來的方法,COM 是一種服務(wù)器端/客戶端架構(gòu),服務(wù)器端定義了操作的方 法,客戶端通過接口調(diào)用這些方法。下面的這幅圖很能說明 COM 的結(jié)構(gòu): 言歸正傳,說這篇博文的主題 QI,還記得上一篇我強調(diào)的,一個接口可以被多個類實現(xiàn),而 QI 要解決的 就是一個類實現(xiàn)多個接口的問題。在 COM 中,接口定義了方法,類實現(xiàn)了接口中定義的方法,而一個接口 只能使用自己內(nèi)部定義的方法,而不能越界,就好比一個班級一樣,這個班級內(nèi)有班長,有學(xué)習(xí)委員,有 體育委員,每位干部各司其職,每一位干部負責(zé)自己職權(quán)范圍之內(nèi)的事情,各位干部相互協(xié)作,解決班級 內(nèi)的事情,這班級內(nèi)的每一位干

42、部就相當于一個接口,而這個班級就相當于實現(xiàn)了這些接口的類。當這個 班級的一些事情需要班長處理的時候,我們就執(zhí)行班長這個接口中定義的方法,當需要學(xué)習(xí)委員處理的話, 我們再將執(zhí)行權(quán)交給學(xué)習(xí)委員這個接口,這也就是接口之間的互相訪問(Query Interface),通過這個我 們大體上對 QI 有了感性上的認識,下面我們通過實例演示一下。 我定義了兩個接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace QITest interface IFavoriteF

43、ood void Food(); using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace QITest interface IVoice void Voice(); 然后定義了一個Cat的類實現(xiàn)這里面的方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace QITest class Cat:IFavoriteFood ,

44、IVoice public void Food() Console.WriteLine(我喜歡的食物是老鼠.);public void Voice() Console.WriteLine(喵,喵,喵.); 這個Cat類的功能就是實現(xiàn)兩個接口的方法,貓最喜歡的事物是老鼠,而他的聲音是“喵,喵, 喵”。 運行下 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace QITest class Program static void Main(string args

45、) IVoice pVoice = new Cat(); pVoice.Voice();/只能調(diào)用IVoice中定義的方法 / pVoice.Food();這個就會報錯,因為 IVoice 接口中沒有這個方法的定義 IFavoriteFood pFavoriteFood = pVoice as IFavoriteFood; pFavoriteFood.Food();/只能調(diào)用IFavoriteFood定義的方法 Console.ReadLine(); 效果如下: 三使用控件創(chuàng)建第一個桌面應(yīng)用程序 1) 新建一個 Windows 窗體應(yīng)用程序(文件-新建-項目-Windos 窗體應(yīng)用程序) 2)

46、在點了確定之后,在 VS 的工具箱中找到到和 ArcEngine 相關(guān)的控件 其中,AxMapControl 就是 Map 地圖控件,AxPageLayouControl 是布局地圖控件, AxTOCControl 是目錄控件,AxToolbarControl 是 GIS 工具欄控件, AxSceneControl 是 Scene 三維場景控件,axGlobeControl 是 Globe 控件, AxLicenseControl 是許可控件,AxSymbologyControl 是符號選擇器控件, AxArcReaderControl 是 ArcReader 控件,AxArcReaderGl

47、obeControl 是 ArcReaderGlobe 控件。AxLicenseControl 是許可控件,一般 GIS 系統(tǒng)中都必須 添加,否則無法使用。將剛才的窗體的名稱改為 Engine 3)然后添加 Toc, Map, Toolbar 控件。許可控件是首選的,否則無法使用 添加完這幾個控件后,VS 會自動為我們添加一些引用 4)添加地圖文檔(Map 控件-右鍵-屬性) 5)Toolbar 控件和 Toc 控件與 Map 控件的關(guān)聯(lián)(設(shè)置 Buddy 屬性) 6)在 Toolbar 中進行設(shè)置(Toolbar 控件-右鍵-屬性-Itmes 選項) 7)添加工具命令 在 Toolbar c

48、ontrol 上右鍵屬性在 items 選項卡中添加幾個工具命令 8)運行我們的應(yīng)用程序,發(fā)現(xiàn)下面的錯誤 出現(xiàn)這個問題的原因是因為 ArcGIS 10 發(fā)生了變化,將下面的語句添加到使用 AO 對象的前面: ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine); 如我放在 Main 函數(shù)中 利用剛才添加的打開文檔的命令打開一個新的文檔 也可利用上面的放大,縮小工具進行簡單的操作了。 在上面,當我們將這些空間拖到窗體中的時候,會自動加載一些 dll,我們知道 ArcGIS Engine 編程,也就意味著和 COM 對象接觸

49、。 代碼加載 Mxd 文檔 用代碼添加 Mxd 文檔,用到 AxMapControl.LoadMxFile(sFilePath),我們只要將 Mxd 文檔的路 徑傳給這個方法即可。我們添加一個按鈕: 在這個按鈕的單擊事件中填寫如下代碼: OpenFileDialog OpenMXD = new OpenFileDialog(); OpenMXD.Title = 打開地圖; OpenMXD.InitialDirectory = E:; OpenMXD.Filter =Map Documents (*.mxd)|*.mxd; if (OpenMXD.ShowDialog() = DialogRes

50、ult.OK) string MxdPath = OpenMXD.FileName; axMapControl1.LoadMxFile(MxdPath);控件的 LoadMxFile 是用來加載地圖文檔的 我們將剛才寫的代碼封裝成一個函數(shù) public string OpenMxd() string MxdPath = ; OpenFileDialog OpenMXD = new OpenFileDialog(); OpenMXD.Title = 打開地圖; OpenMXD.InitialDirectory = E:; OpenMXD.Filter = Map Documents (*.mxd

51、)|*.mxd; if (OpenMXD.ShowDialog() = DialogResult.OK) MxdPath = OpenMXD.FileName;return MxdPath;添加 Shape 文件 AxMapControl 還包含下面三個方法用來添加不同類型的數(shù)據(jù) 這些方法的使用和上面的相似,方法中的參數(shù)可能不同,對于 AddShapeFile 來說,它需要兩個參數(shù),第一 個參數(shù)是 shp 文件名所在的目錄,第二個是文件名,因為打開 shp 文件要兩個參數(shù),所以構(gòu)造一個數(shù)組, 用來返回相應(yīng)的參數(shù) 代碼如下: public string OpenShapeFile() strin

52、g ShpFile = new string2; OpenFileDialog OpenShpFile = new OpenFileDialog(); OpenShpFile.Title = 打開Shape文件; OpenShpFile.InitialDirectory = E:; OpenShpFile.Filter = Shape文件(*.shp)|*.shp; if (OpenShpFile.ShowDialog() = DialogResult.OK) string ShapPath = OpenShpFile.FileName; /利用將文件路徑分成兩部分 int Position

53、= ShapPath.LastIndexOf(); string FilePath = ShapPath.Substring(0,Position); string ShpName = ShapPath.Substring(Position+1); ShpFile0 = FilePath; ShpFile1 = ShpName;return ShpFile;庖丁解牛識控件 ArcGIS Engine 中提供了很多的控件,這些控件和 ArcMap 中的一些東西有對應(yīng)關(guān)系的: ArcGIS Engine 中的 MapControl 控件和 PageLayoutControl 控件分別對應(yīng)于 Arc

54、Map 中的數(shù)據(jù) 視圖和布局視圖,MapControl 控件主要用于空間數(shù)據(jù)的顯示和分析,它封裝了地圖對象, 而 PageLayoutControl 控件是用于地圖的修飾和整理,可以用來生成專題圖等,它封裝了 PageLayout 對象。 TOCControl 控件和 ToolbarControl 控件分別對應(yīng) ArcMap 中的 Table of Contents 控件和工具條 控件,這兩個控件都有一個 buddy 屬性,這兩個控件需要和一個伙伴空間協(xié)同工作,伙伴 控件可以是 MapControl,PageLayoutContro,SceneControl 或者 globeControl 控

55、件。 IMapDocument pMapDocument = new MapDocumentClass(); if (pMapDocument.get_IsMapDocument(path) pMapDocument.Open(path, null); IMap pMap; for (int i = 0; i 0) axMapControl2.Map = new MapClass(); for (int i = 0; i 0) if (e.button = 1) IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY)

56、; axMapControl1.CenterAt(pPoint); axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); else if (e.button = 2) IEnvelope pEnv = axMapControl2.TrackRectangle(); axMapControl1.Extent = pEnv; axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography

57、, null, null); 運行后的效果如下: TOCContro 控件 TOCControl 控件使用的是用伙伴控件中的數(shù)據(jù)地圖,它控制圖層是否在伙伴控件空顯示以及 和伙伴控件在符號上保持一致,TOCControl 為用戶提供了一個交互式的環(huán)境,如果 TOCControl 控件的伙伴控件是 MapControl 控件,當我們將 TOCControl 控件中圖層刪掉是, MapControl 控件中相應(yīng)的圖層也會被刪掉。 顯示屬性表的信息 我們知道 ArcMap 中的 Table of Contents 有很多功能,如下圖: 而 ArcGIS Engine 提供的 TOCControl 控件

58、幾乎沒有提供,那么這些都是需要自己開發(fā)的,在 這里我做一個顯示屬性表的功能。 分析:要顯示某一個圖層的屬性表,首先要將這個圖層選中,然后在另外一個 Form 中將選 中的這個圖層的屬性信息進行顯示。 添加一個上下文菜單,添加一個新的 Form 窗體,在這個新的窗體上添加 GridView 控件,并 在 TOCControl 控件的 OnMouseDown 事件下添加如下代碼(pGlobalFeatureLayer 是我定義的一個全局變量): private void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IT

59、OCControlEvents_OnMouseDownEvent e) if (axMapControl1.LayerCount 0) esriTOCControlItem pItem = new esriTOCControlItem(); pGlobalFeatureLayer = new FeatureLayerClass(); IBasicMap pBasicMap = new MapClass(); object pOther = new object(); object pIndex = new object(); axTOCControl1.HitTest(e.x, e.y, re

60、f pItem, ref pBasicMap, ref pGlobalFeatureLayer, ref pOther, ref pIndex); if (e.button = 2) context.Show(axTOCControl1, e.x, e.y); 在上下文菜單的打開屬性表的 Click 事件中添加如下代碼: private void 打開屬性表ToolStripMenuItem_Click(object sender, EventArgs e) FormTable Ft = new FormTable(pGlobalFeatureLayer as IFeatureLayer);

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論