本書基于ArcGIS Engine 10,以C#.NET 2010為開發(fā)語言進行講解。內容包括ArcGIS Engine編程基礎、GIS應用軟件的開發(fā)方式、地圖基本操作、查詢統(tǒng)計、地圖制圖、數據編輯、空間分析、管網幾何網絡分析、交通網絡分析、三維分析等。本書配有大量具有實際背景的編程案例,并給出實現(xiàn)思路和代碼詳解,隨書光盤中包含所有實例的源代碼和數據,供讀者對照練習。
本書強調實用性、全面性和實戰(zhàn)性,案例豐富、由易及難、便于自學,可作為高等學校GIS、測繪工程、RS等測繪類專業(yè)本科生和研究生的教材。
本書*后提供了一個Esri大賽一等獎的獲獎作品,供在校本科研究生學生參考,特別是對于將要參加大賽的同學來講是一個難得的實例。對于剛剛踏入測繪地信行業(yè)的工作者來講,很多工程項目都可以基于本實例進行修改和補充來完成自己的實際工程項目。
前 言
桌面GIS、WebGIS和移動GIS是GIS軟件開發(fā)的三種模式。桌面GIS的功能更為豐富,軟件設計更加靈活,加之歷史溯源,GIS軟件開發(fā)的初學者往往都是從桌面GIS的開發(fā)入門,這也符合軟件開發(fā)的一般學習規(guī)律。具體到ArcGIS的開發(fā),就需要學習者從ArcGISEngine入手。由于ArcGIS的桌面、服務器和移動端是采用一套ArcObjects構建的,因此在掌握了ArcGISEngine的開發(fā)思路和開發(fā)接口以后,就會很容易地過渡到WebGIS和移動GIS的開發(fā)上來。同時,由于基于ArcGISEngine進行二次開發(fā)已經成為業(yè)界桌面GIS開發(fā)的事實上的標準,因此GIS行業(yè)的開發(fā)者大都是從學習ArcGISEngine開始的。
地理信息科學專業(yè)學生的專業(yè)技能往往被簡單描述為,掌握GIS的基礎理論(可以理解為本科所學的理論課程),掌握一門GIS軟件(往往特指ArcGIS),學會使用一種語言進行GIS軟件開發(fā)(基于ArcGISEngine使用C#語言開發(fā)是最常見的方式)。以作者多年的教學經驗來看,絕大多數學生經過四年的學習能夠基本掌握GIS的理論知識,大部分學生能夠熟悉ArcGIS軟件的操作,但是只有少數學生能夠掌握ArcGIS軟件的開發(fā)。這是因為,一個專業(yè)的所有理論課程是一個前后銜接、互相支持的體系,當所有課程學完這個體系也就比較容易建立起來。ArcGIS軟件盡管體系龐大,學習有一定難度,但它是專業(yè)理論知識的體現(xiàn)和印證,經過多次練習也是能夠掌握其操作過程的。軟件開發(fā)不僅需要熟悉編程語言,熟悉ArcGISEngine紛繁蕪雜的接口,還要熟悉軟件架構與軟件設計的有關知識,而且軟件開發(fā)具有一定的靈活性和創(chuàng)造性,使得學習難度加大,導致學生普遍存在畏難心理。由此,盡管存在強烈的學習愿望,實踐上卻往往停留在語言的語法學習和ArcGISEngine的接口學習層面上,一遍遍翻閱書本卻不去寫下一行代碼,導致眼高手低、心有余而力不足。當然缺少一本合適的參考書也是一個重要的因素。
本書站在學生的角度,面向工程的實際應用,充分兼顧不同層次讀者的知識結構和知識水平來設計。具有權威性、全面性和實戰(zhàn)性,由易及難、由淺入深、循循善誘、內容豐富,既使基礎比較薄弱而又有強烈的ArcGISEngine開發(fā)欲望的讀者容易入門,又使具有一定基礎的讀者有提高水平的余地。
全書分為4篇12章。第1篇是入門篇,包括第1~2章,在總體上介紹了ArcGISEngine編程的基本概念和開發(fā)桌面GIS應用軟件的幾種不同的方式。第2篇是數據篇,包括第3~6章,主要講解地圖的基本操作、空間查詢與統(tǒng)計、地圖制圖和數據編輯等。這一部分內容是任何一個GIS系統(tǒng)都必須具備的功能。第3篇是分析篇,包括第7~11章,主要講解矢量和柵格數據空間分析、幾何網絡分析、交通網絡分析和三維分析等內容。第4篇是實例篇,包括第12章,介紹了Esri杯全國軟件開發(fā)大賽總決賽一等獎的獲獎作品,并提供了全套的源代碼,供讀者學習參考。
在學習過程中,建議所有讀者都讀一下第1章和第2章,從總體上了解ArcGISEngine編程的概念和方法。第2章介紹的ArcGIS二次開發(fā)的歷史有助于讀者了解ArcGISEngine的由來,便于更好地理解ArcGISEngine的程序設計與架構。第3章是地圖的基本操作,包括數據加載、地圖瀏覽、量測、書簽、數據視圖和布局視圖、鷹眼和圖層控制等內容。這一章是初學者必須認真學習的章節(jié)。一是該章內容是所有GIS軟件必備的,二是該章接口較少、相對簡單,便于自學。從未進行過編程的讀者,建議將這一章的代碼按照光盤逐字逐句地重新敲一遍,以體會軟件編譯與簡單調試的技巧。第4章查詢與統(tǒng)計對應于ArcGIS的選擇菜單,包括屬性查詢、空間查詢和圖形查詢,還包括選擇集的設置和統(tǒng)計分析等功能。第5章介紹地圖的樣式與符號化、專題制圖、地圖整飾等內容。第6章數據編輯以一個編輯流程的操作順序為主線進行空間數據編輯的詳細講解。這幾部分內容是一個GIS軟件的功能框架,如果讀者特別是在校學生熟練掌握這些內容,也就能算一個基本合格的GIS程序員了?臻g分析篇的內容有一定的深度,讀者可以根據需要有選擇地學習。第7章矢量分析介紹了空間拓撲和空間關系、疊加分析、數據格式轉換、添加XY 數據和使用GP工具進行分析等內容。第8章柵格分析的內容對應于ArcGIS的空間分析,可實現(xiàn)空間插值、填挖方的計算、密度分析等工程中常用的功能。鑒于廣大讀者對網絡分析很感興趣,而現(xiàn)有的教材和參考書對這一部分往往語焉不詳,或者概念不甚清楚。本書特意安排了第9章幾何網絡分析和第10章交通網絡分析兩章供讀者甄別學習,幾何網絡分析主要解決城市管線的網絡分析,對應于ArcGIS的UtilityNetworkAnalyst工具條;交通網絡分析用于模擬現(xiàn)實世界的交通網絡,對應于NetworkAnalyst工具條。第11 章三維分析介紹了MultiPatch 和TIN 的各種分析,還給出了SceneControl和GlobeControl進行三維可視化的方法,并給出了一個三維數字校園的綜合實例,貼近學生生活,激發(fā)學習興趣。第12章是Esri大賽全國總決賽一等獎的獲獎作品,全部由在校本科生完成。讀者特別是在校學生可以此為對照,看看自己的編程水平處在一個什么樣的位置。在你認真學習完本書并掌握了本書的內容后,相信你的編程水平定會超過獲獎作品的水平。
本書讀者應該特別注意光盤代碼和數據的配合使用。本書代碼都經過嚴格測試,確保都能正確運行,如果在使用中發(fā)現(xiàn)不能正常運行的情況,首先應該檢查自己的軟件配置和數據情況,然后再去考慮代碼是否存在錯誤。本書的代碼來源于作者的長期積累,包括很多實際工程的代碼,其中必然有來自于ArcGISEngine幫助和網上的代碼,但是這些代碼經過了多次加工,已無法溯源,也就無法一一標引。由此,盡管本書的代碼大多來源于工程實踐且具有很強的工程價值,但作者并不授權讀者將這些代碼應用于商業(yè)活動。同時在編入本書的過程中,為了方便讀者的學習,減弱了很多代碼的封裝力度,但是考慮工程上往往具有較強的封裝性,在本書的后幾章中對代碼進行了適度封裝,讀者要注意哪些函數是自己編寫的,哪些函數是系統(tǒng)提供的。還有,不同章節(jié)在實現(xiàn)類似功能的時候,代碼也不完全一樣,作者刻意保留了這些差別,目的是使讀者認識到同一個功能可以具有不同的實現(xiàn)方法,便于開闊視野、打開思路。
除了第3章建議從未編過程序的讀者一個個字母敲入之外,當掌握了代碼輸入的基本技巧和熟悉了基本的調試方法后,其他章節(jié)的代碼建議直接拷貝到自己的工程中,或者直接運行光盤的代碼,在你體會到程序正確運行的喜悅的同時,也進一步激發(fā)了你學習編程的興趣和克服困難的信心,這對于快速入門是大有裨益的。因為很多初學者都是在學習了較長一段時間后,發(fā)現(xiàn)自己的代碼總是不能運行而慢慢地磨掉了學習的信心和樂趣,從而放棄學習編程的。
此外讀者在學習ArcGISEngine編程的時候,要注意編程實現(xiàn)的功能和ArcGIS已有功能的聯(lián)系。實際上,大多工程項目的功能如果不編寫程序,僅僅使用ArcGIS也基本上可以滿足要求,之所以還要編程,目的無非是更便捷化、智能化、個性化一些。在某種程度上來講,編程序不就是把軟件多次點擊實現(xiàn)的功能合并成一次點擊而實現(xiàn)嗎? 在這種意義上說,讀者要想學好編程,首先應該熟悉ArcGIS軟件,在實現(xiàn)一些功能的時候,建議先在ArcGIS中操作一遍,看看它是如何設計和操作的,這將有助于優(yōu)化代碼編寫和功能實現(xiàn)的流程。
為使本書博采眾長,特意邀請了多個高校的教師和企事業(yè)單位的一線程序員參加編寫。本書架構由山東科技大學的牟乃夏、戴洪磊,青島市勘察測繪研究院的王海銀,南陽師范學院的李丹,河南城建學院的高松峰、武漢理工大學的詹云軍和濟南大學的馮群等多次討論確定并各負責了一部分內容的編寫。參加本書編寫的人員還有山東科技大學的張靈先、楊騰飛、王普樂、祝帥兵、張園園,青島積成電子有限公司的李乃林,北京洛斯達科技發(fā)展有限公司的劉永濤,福建省地質測繪院廈門分院的洪平衛(wèi)等。研究生駱川、楊佰義、張昌景、郭俏琳、趙雨琪、張娟、朱海川、徐玉靜、趙明月等,對各章節(jié)的文稿和代碼進行了反復的檢查和測試。為了驗證初學者,特別是在校本科生對本書的需求與期望,本科生林尚緯等人也對部分文稿進行了學習和編程,他們從一個初學者的角度提出了中肯的意見。測繪出版社的編輯為本書的出版付出了大量心血,在此一并表示衷心感謝!
本書從2012年開始規(guī)劃和編寫,由于體系龐大,參與人員眾多,著實遇到了不少困難,加之我個人工作的羈絆、中途個別參編人員的更換,也曾有過放棄的念頭。但此時我以山東省高級訪問學者和博士后身份來到中科院地理所陸鋒研究員的團隊進行學習和科研,這個團隊奮發(fā)向上的激情、精益求精的理念、團結務實的態(tài)度和孜孜以求的精神使我在各種困難中學會了堅持和堅強,也促使了本書的出版,再次特別向這個團隊表示感謝和敬意!
盡管本書近90萬字,但是依然不能全面闡述ArcGISEngine編程的所有內容。ArcGISEngine的幫助才是最全面、最豐富的編程知識庫,讀者在熟悉了ArcGISEngine的編程后,要學習和習慣使用它的幫助來完成本書沒有覆蓋的功能。
雖然本書編寫用了兩年半的時間,所有章節(jié)多次易稿,但由于我們水平所限,錯誤與不妥之處在所難免,敬請讀者批評指正。讀者的批評和建議請致信mounaixia@163.com,或者訪問作者的新浪博客和微博@山東科大牟乃夏老師GISer,作者將不定期發(fā)布本書的勘誤,讀者的建議、意見和學習指導等。
牟乃夏(1973-),男,博士、博士后,山東科技大學測繪學院副教授,山東省基礎地理與數字化技術重點實驗室副主任。已主持和參與國家863項目、國家自然科學基金、國家科技支撐計劃、國家重大科技專項以及中國博士后科學基金、山東省自然科學基金等國家和省部級科研項目及橫向項目數十項。發(fā)表文章40余篇,出版教材2部,申請專利2項,獲得軟件著作權40余項。目前主要從事基于大數據的空間數據挖掘、智慧城市等方向的理論與應用研究以及GIS行業(yè)應用軟件(城市管線GIS、環(huán)保GIS和應急決策GIS等)的研發(fā)工作。
目錄
第1章 ArcGIS Engine編程基礎
1.1 ArcGIS Engine概述
1.1.1 ArcGIS Engine簡介
1.1.2 ArcGIS Engine功能
1.1.3 ArcGIS Engine與ArcObjects
1.1.4 ArcGIS Engine類庫
1.1.5 ArcGIS Engine控件
1.2 ArcGIS Engine開發(fā)資源
1.2.1 幫助文檔
1.2.2 自帶示例
1.2.3 在線幫助
1.2.4 網上資源
1.3 Esri開發(fā)方式簡介
1.3.1 AML語言開發(fā)方式
1.3.2 Avenue語言開發(fā)方式
1.3.3 MapObjects開發(fā)方式
1.3.4 VBA開發(fā)方式
1.3.5 ArcObjects開發(fā)方式
1.4 對象模型圖
1.4.1 對象模型圖中的類與接口
1.4.2 查看OMD圖
1.5 ArcGIS Engine的安裝
1.5.1 ArcGIS License Manager的安裝
1.5.2 ArcGIS Engine Runtime for Windows的安裝
1.5.3 ArcObjects SDK for the Microsoft.NET Framework的安裝
1.6 本章小節(jié)
第2章 桌面GIS應用軟件的開發(fā)方式
2.1 使用VBA進行桌面軟件開發(fā)
2.1.1 VBA開發(fā)方式
2.1.2 VBA代碼的安全性
2.2 使用DLL進行桌面軟件開發(fā)
2.2.1 DLL開發(fā)方式
2.2.2 DLL功能的應用部署
2.3 使用Addin進行桌面軟件開發(fā)
2.3.1 Addin開發(fā)方式
2.3.2 Addin的安裝部署
2.4 使用ArcGIS Engine構建獨立應用程序
2.5 不同開發(fā)方式的比較
2.6 本章小結
第3章 地圖基本操作
3.1 空間數據與工作空間
3.1.1 空間數據
3.1.2 工作空間
3.2 MapControl控件接口
3.2.1 IMapControlDefault接口
3.2.2 IMapControl2接口
3.2.3 IMapControl3接口
3.2.4 IMapControl4接口
3.2.5 IMapControlEvents2接口
3.3 數據加載
3.3.1 加載地圖文檔
3.3.2 加載Shapefile數據
3.3.3 加載柵格數據
3.3.4 加載CAD數據
3.3.5 加載個人地理數據庫數據
3.3.6 加載文件地理數據庫數據
3.3.7 加載ArcSDE空間數據庫數據
3.3.8 加載文本文件數據
3.4 地圖文檔保存
3.4.1 地圖文檔保存
3.4.2 地圖文檔另存為
3.5 地圖瀏覽
3.5.1 放大與縮小
3.5.2 拉框放大與縮小
3.5.3 漫游
3.5.4 全圖顯示
3.5.5 歷史視圖切換
3.6 書 簽
3.6.1 添加書簽
3.6.2 書簽管理
3.7 ICommand和ITool命令操作地圖
3.8 量 測
3.8.1 狀態(tài)欄坐標顯示
3.8.2 距離測量
3.8.3 面積測量
3.9 要素選擇操作
3.9.1 要素選擇
3.9.2 縮放至選擇
3.9.3 清除選擇
3.10 地圖導出
3.11 視圖同步
3.11.1 鷹眼窗口
3.11.2 數據視圖與布局視圖的同步
3.12 TOCControl控件
3.12.1 TOCControl與數據視圖的關聯(lián)
3.12.2 圖層顯示順序調整
3.12.3 TOCControl的右鍵菜單
3.13 本章小結
第4章 查詢統(tǒng)計
4.1 屬性查詢
4.1.1 相關類與接口
4.1.2 實例詳解
4.2 空間查詢
4.2.1 相關類與接口
4.2.2 實例詳解
4.3 圖形查詢
4.3.1 相關類與接口
4.3.2 實例詳解
4.4 選擇集
4.4.1 相關類與接口
4.4.2 實例詳解
4.5 查詢選項設置
4.5.1 相關類和接口
4.5.2 實例詳解
4.6 統(tǒng)計分析
4.6.1 相關的類和接口
4.6.2 實例詳解
4.7 本章小結
第5章 地圖制圖
5.1 顏色模型
5.1.1 顏色模型分類
5.1.2 顏色對象
5.2 地圖符號化
5.2.1 點要素符號化
5.2.2 線要素符號化
5.2.3 面要素符號化
5.2.4 文本符號化
5.2.5 符號選擇器
5.2.6 樣式管理器
5.3 地圖標注
5.3.1 TextElement標注
5.3.2 Annotation注記
5.3.3 MapTips顯示
5.4 專題地圖制圖
5.4.1 單一符號化
5.4.2 唯一值符號化
5.4.3 唯一值多字段符號化
5.4.4 分級色彩符號化
5.4.5 分級符號化
5.4.6 比例符號化
5.4.7 點密度符號化
5.4.8 統(tǒng)計圖表符號化
5.4.9 雙值符號化
5.4.10 多比例尺符號化
5.5 地圖整飾
5.5.1 添加圖例
5.5.2 添加指北針
5.5.3 添加比例尺
5.5.4 添加地圖格網
5.6 制圖模板
5.7 空間參考
5.7.1 創(chuàng)建空間參考
5.7.2 同一基準面的坐標轉換
5.7.3 不同基準面的坐標轉換
5.8 打印輸出
5.8.1 打印設置
5.8.2 打印預覽
5.8.3 打印
5.8.4 地圖輸出
5.9 本章小結
第6章 空間數據編輯
6.1 簡 介
6.1.1 操作步驟
6.1.2 實現(xiàn)思路
6.1.3 代碼說明
6.2 編輯對象
6.2.1 幾何對象
6.2.2 DisplayFeedback對象
6.3 開始編輯
6.3.1 IEngineEditor接口介紹
6.3.2 功能實現(xiàn)
6.4 設置編輯圖層
6.4.1 IEngineEditLayers接口介紹
6.4.2 功能實現(xiàn)
6.5 設置編輯任務
6.5.1 IEngineEditTask接口介紹
6.5.2 功能實現(xiàn)
6.6 編輯操作
6.6.1 選擇要素
6.6.2 移動要素
6.6.3 添加要素
6.6.4 刪除要素
6.6.5 撤銷操作
6.6.6 恢復操作
6.7 節(jié)點編輯
6.7.1 移動節(jié)點
6.7.2 添加節(jié)點
6.7.3 刪除節(jié)點
6.8 屬性編輯
6.9 保存編輯
6.10 結束編輯
6.11 本章小結
第7章 矢量數據空間分析
7.1 空間拓撲分析
7.1.1 相關類與接口
7.1.2 實例詳解——緩沖區(qū)分析
7.1.3 實例詳解——獲取多邊形要素邊界
7.2 空間關系運算
7.2.1 相關類與接口
7.2.2 實例詳解——查找一多邊形要素的所有鄰接要素
7.3 疊加分析
7.3.1 相關類與接口
7.3.2 實例詳解——兩相交面圖層的裁剪分析
7.4 數據格式轉換
7.4.1 相關類與接口
7.4.2 實例詳解——將Shapefile數據導入File Geodatabase中
7.4.3 實例詳解——通過數據解析方式實現(xiàn)Shapefile數據轉CAD
格式數據
7.5 添加X、Y數據
7.5.1 相關類與接口
7.5.2 實例詳解——將帶有X、Y字段的Excel數據表轉化為點數據
7.6 使用GP工具進行空間分析
7.6.1 相關類與接口
7.6.2 實例詳解——利用GP工具實現(xiàn)緩沖區(qū)分析
7.6.3 實例詳解——利用GP工具實現(xiàn)Shapefile數據轉CAD數據
7.7 本章小結
第8章 柵格數據空間分析
8.1 環(huán)境設置
8.2 空間插值
8.2.1 反距離權重法
8.2.2 克里金法
8.2.3 樣條函數法
8.2.4 趨勢面法
8.2.5 自然鄰域法
8.3 柵格表面分析
8.3.1 坡度計算
8.3.2 坡向計算
8.3.3 等值線計算
8.3.4 填挖方計算
8.3.5 山體陰影
8.3.6 曲率計算
8.3.7 可見性分析
8.4 柵格計算
8.4.1 IMathOp接口
8.4.2 ITrigOp接口
8.4.3 ILogicalOp接口
8.4.4 IBitwiseOp接口
8.5 柵格統(tǒng)計
8.6 密度分析
8.6.1 核密度分析
8.6.2 線密度分析
8.6.3 點密度分析
8.7 提取分析
8.7.1 按屬性提取
8.7.2 按掩模提取
8.7.3 按形狀提取
8.8 距離分析
8.8.1 歐氏距離
8.8.2 成本距離
8.8.3 成本路徑
8.8.4 廊道分析
8.9 重分類
8.9.1 使用表重分類
8.9.2 使用ASCII文件重分類
8.9.3 分割
8.10 條件分析
8.11 本章小結
第9章 管網幾何網絡分析
9.1 幾何網絡
9.1.1 幾何網絡要素
9.1.2 邏輯網絡
9.1.3 幾何網絡屬性
9.2 顯示網絡流向
9.2.1 相關類與接口
9.2.2 實例詳解
9.3 網絡追蹤分析
9.3.1 相關類與接口
9.3.2 實例詳解
9.4 爆管分析
9.4.1 實例程序操作步驟
9.4.2 實例程序