本書是一本系統(tǒng)介紹一個地理信息系統(tǒng)底層開發(fā)的完整教程,講授如何通過程序語言實(shí)現(xiàn)地理信息系統(tǒng)的基本功能,包括空間數(shù)據(jù)與屬性數(shù)據(jù)的管理、分析及可視化等。全書內(nèi)容均為底層開發(fā),不依賴于任何商業(yè)地理信息系統(tǒng)軟件,各種算法或數(shù)據(jù)操作方法均有詳細(xì)介紹,且深入淺出。通過閱讀本書,希望提高讀者的原始創(chuàng)新能力。
第1章介紹了如何實(shí)現(xiàn)一個最小化的地理信息系統(tǒng),第2章搭建了一個底層開發(fā)的基本框架,第3至5章講述了地理信息可視化的基本要點(diǎn),第6章介紹了矢量圖層,第7章講述鼠標(biāo)在地理信息瀏覽中的作用,第8至11章介紹Shapefile文件的讀取以及如何自定義地理信息系統(tǒng)數(shù)據(jù)文件格式,第12至14章介紹空間及屬性信息的選擇方法,第15章介紹柵格圖層,第16章介紹多圖層管理,第17章實(shí)現(xiàn)了一個基本的地理信息系統(tǒng)集成控件,第18及19章介紹了地理信息的可視化技術(shù),第20及21章講述了網(wǎng)絡(luò)分析方法的實(shí)現(xiàn),第22及23章介紹了空間索引的構(gòu)建及應(yīng)用,第24章介紹了空間參考系統(tǒng),第25及26章講述了空間及屬性數(shù)據(jù)的編輯方法,第27章介紹了地理信息系統(tǒng)開發(fā)的幾種優(yōu)化方法。
為便于讀者高效學(xué)習(xí),快速掌握地理信息系統(tǒng)底層開發(fā)知識,本書作者精心制作了電子書、完整的源代碼以及通過電子郵件或微信公眾平臺的答疑服務(wù)等內(nèi)容。
本書適合作為廣大高校地理信息系統(tǒng)或地理信息科學(xué)專業(yè)的課程教材,也可以作為地理信息系統(tǒng)技術(shù)開發(fā)者或愛好者的自學(xué)參考用書。
什么是地理信息系統(tǒng)底層開發(fā)
首先,我們需要定義什么是地理信息系統(tǒng)(GIS)。根據(jù)作者的理解,地理信息系統(tǒng)就是一個能夠處理、分析和應(yīng)用各類空間數(shù)據(jù)的軟件系統(tǒng)。目前,工業(yè)界已經(jīng)有不少成熟的商業(yè)或非商業(yè)的地理信息系統(tǒng)軟件產(chǎn)品,比如ArcGIS。針對這些軟件的應(yīng)用通?煞譃閮蓚層次,即應(yīng)用和開發(fā),前者即利用軟件的現(xiàn)有功能,通過非程序化的方式,達(dá)到應(yīng)用的目的; 而后者則是在這些軟件平臺提供的二次開發(fā)工具的基礎(chǔ)之上,開發(fā)一個新的軟件產(chǎn)品,這通常被稱為基于某某軟件的地理信息系統(tǒng)二次開發(fā),比如ArcGIS的二次開發(fā)工具ArcGIS Engine。對于一個非常成熟的地理信息系統(tǒng)軟件產(chǎn)品來說,作者建議二次開發(fā)者閱讀或?qū)W習(xí)其官方用戶手冊或開發(fā)教程,通常更加完備且準(zhǔn)確。
本書要講授的內(nèi)容不是二次開發(fā),而是底層開發(fā)。簡單來說,我們的底層開發(fā)不是基于ArcGIS Engine開發(fā)一個軟件,而是希望開發(fā)一個類似ArcGIS或ArcGIS Engine的軟件。當(dāng)然,我們說的底層開發(fā)也是有底的,或者說是相對的,它不是從機(jī)器語言或匯編語言開始,而是基于高級程序設(shè)計語言的,在本書中選擇的是Windows平臺下的C#編程語言,同時也建議讀者能夠基于本書的思想,嘗試?yán)闷渌Z言實(shí)現(xiàn)底層開發(fā),在本書之前的讀者群中,就曾經(jīng)有過讀者利用Java或Python語言在不同的操作系統(tǒng)下完成了本書的大部分學(xué)習(xí)內(nèi)容,而且看起來非常棒!
為什么要學(xué)習(xí)地理信息系統(tǒng)底層開發(fā)
作者認(rèn)為有如下三個理由。
第一,在開源共享的大環(huán)境下,越來越多的地理信息系統(tǒng)相關(guān)研發(fā)人員覺得底層開發(fā)是沒有必要的,因?yàn)槲覀兺ǔ?梢院芸斓貜木W(wǎng)上找到別人做好的東西,快速整合到自己的系統(tǒng)中。作者非常贊同這樣的做法,站在別人的肩膀上,讓步伐更快些。同時,作者也在深深地思考,提供資源的人總是有限和少數(shù)的,如果每個人都只做成果的使用者或集成者,那么誰去創(chuàng)造成果?從這個意義上講,作者不期待本書有多大的銷量,但作者相信本書的讀者將有可能成為社會的關(guān)鍵少數(shù)。
第二,持懷疑態(tài)度的批評者可能會認(rèn)為,本書介紹的內(nèi)容過于基礎(chǔ),其中絕大多數(shù)內(nèi)容都是現(xiàn)有商業(yè)軟件已經(jīng)完全實(shí)現(xiàn)了的,讀者即便學(xué)會了,也似乎沒有用武之地。關(guān)于這一點(diǎn),作者的觀點(diǎn)是,如果希望超越,首先需要學(xué)會跟跑。不曾踏過前人經(jīng)歷的坑坑洼洼,就必將會跌入未來某一個大坑里。當(dāng)然,如果只希望跟跑,那應(yīng)該問題不大,總會有強(qiáng)者把你從坑里拉出來。但是,針對承擔(dān)著原始創(chuàng)新重任的關(guān)鍵少數(shù)來說,要學(xué)會自己站起來才行。這就好比,蘋果手機(jī)已經(jīng)很不錯了,我們?yōu)槭裁催需要華為。所以,這也是寫作本書的重要目的之一,提高讀者的原始創(chuàng)新能力。
第三,從讀者個人來講,如果希望成為一個在未來工作中有能力、有擔(dān)當(dāng)?shù)年P(guān)鍵少數(shù),需要有強(qiáng)大的分析問題、解決問題的能力。本書并不是一本專門講授如何提高這些能力的心靈雞湯,但確實(shí)希望在攻克一個個底層開發(fā)堡壘的過程中,鍛煉讀者抽絲剝繭的能力,提高讀者的獲得感,增強(qiáng)讀者的自信心。顯然,并不是每一位讀者今后都會去從事底層開發(fā)工作,去創(chuàng)造一個屬于自己的ArcGIS、SuperMap等。而且,閱讀完本書,也不能保證讀者就已經(jīng)可以開發(fā)一套GIS軟件了,如果真如此,那只能說是江湖騙術(shù)。更多的實(shí)際情況是,讀者可能加入某個GIS相關(guān)的行業(yè),因?yàn)榱私獾讓拥拿孛,而成為關(guān)鍵少數(shù)的中流砥柱。畢竟,僅僅了解GIS成熟軟件二次開發(fā)的門檻太低了。因此,從這個意義上講,寫作本書的另一個重要目的就是提高讀者的行業(yè)競爭能力。
閱讀本書會得到什么
通過前一小節(jié)的說明,我們希望讀者經(jīng)由閱讀此書,提高兩個能力:
■原始創(chuàng)新能力。
■行業(yè)競爭能力。
在知識點(diǎn)方面,我們會介紹如何利用程序設(shè)計語言實(shí)現(xiàn)GIS的三大功能,包括:
■空間數(shù)據(jù)管理。
■空間數(shù)據(jù)分析。
■空間數(shù)據(jù)可視化。
除了書本身,我們還提供:
■對每一位認(rèn)真的讀者來說都很需要的程序源碼。
■一些示例空間數(shù)據(jù)及相關(guān)參考文檔。
■作為教材講授時所需要的教學(xué)課件。
上述資料可通過以下方式獲得:
■搜索并關(guān)注微信公眾號大數(shù)據(jù)攻城獅,輸入XGIS,獲得下載地址。
閱讀本書前的準(zhǔn)備
本書在Windows操作系統(tǒng)下,以C#語言為開發(fā)語言進(jìn)行講解。在閱讀本書之前,讀者需要對GIS的基本概念及C#語言有一定了解。此外,面向?qū)ο缶幊趟枷胍苍诒緯休^好的應(yīng)用,因?yàn)檫@是編寫一個較為復(fù)雜的軟件平臺所必需的,讀者可事先尋找相關(guān)資料,對這一思想加以學(xué)習(xí)和領(lǐng)會。相信通過閱讀本書,會進(jìn)一步加深讀者對C#語言及面向?qū)ο缶幊趟枷氲睦斫狻?/p>
學(xué)習(xí)本書內(nèi)容,讀者唯一需要特別安裝的軟件就是Visual Studio集成開發(fā)環(huán)境(IDE),該軟件是Microsoft公司的一個產(chǎn)品,如果是出于學(xué)習(xí)的目的,讀者可以從該公司網(wǎng)站上免費(fèi)下載并安裝這個產(chǎn)品,在試用一段時間后,通過電子郵件注冊的方式,讀者就可以永久使用這一開發(fā)工具。本書就是利用這一開發(fā)工具編寫代碼的。Visual Studio是一個存在已久的軟件產(chǎn)品,已經(jīng)發(fā)布了多個版本,而本書內(nèi)容并不針對其中的特定版本,讀者可以按照以下步驟下載并安裝最新的Visual Studio軟件。
1. 在網(wǎng)絡(luò)瀏覽器中輸入或者通過網(wǎng)絡(luò)搜索引擎,搜索關(guān)鍵字Visual Studio IDE,通常在搜索結(jié)果中的第一項就是上述網(wǎng)址。
2. 在打開的網(wǎng)頁中,找到當(dāng)前適用于讀者Windows操作系統(tǒng)的最新版本,根據(jù)網(wǎng)頁提示完成下載和安裝。
在編寫本書時,我們選擇的版本是Visual Studio Community 2019。當(dāng)安裝結(jié)束后,在所有程序中,讀者會發(fā)現(xiàn)一個新的程序,名為Visual Studio 2019,單擊它,就可以開始學(xué)習(xí)本書的第1章了; 否則,請重新安裝上述軟件工具。在本書中,我們將Visual Studio Community 2019簡稱為VS。
關(guān)于書中的程序源碼
本書附帶的程序源碼可以直接在VS中打開閱讀。本書附錄包含所有類及新定義數(shù)據(jù)類型的屬性成員和函數(shù)的定義及說明。此外,文中所有源碼都會被清楚地標(biāo)明其所屬的文件或類,例如,如下信息表示所列出的代碼屬于代碼文件BasicClasses.cs,它定義了一個類,叫作XVertex。
BasicClasses.cs
public class XVertex
{
public double X;
public double Y;
public XVertex(double _X, double _Y)
{
X = _X;
Y = _Y;
}
public double Distance(XVertex _AnotherVertex)
{
return Math.Sqrt((X - _AnotherVertex.X) * (X - _AnotherVertex.X)
(Y - _AnotherVertex.Y) * (Y - _AnotherVertex.Y));
}
public void CopyFrom(XVertex _V)
{
X = _V.X;
Y = _V.Y;
}
}
而如下信息表明為代碼文件BasicClasses.cs中的類XTools定義了一個函數(shù)CalculateLength。
BasicClasses.cs/XTools
public static double CalculateLength(ListXVertex _Vertexes)
{
double length = 0;
for (int i = 0; i _Vertexes.Count - 1; i )
length = _Vertexes[i].Distance(_Vertexes[i 1]);
return length;
}
同時,基于本書講解的內(nèi)容開發(fā)的多個實(shí)用工具可以通過微信公眾號大數(shù)據(jù)攻城獅獲得,歡迎讀者關(guān)注。
至此,我們已經(jīng)完成了準(zhǔn)備工作,現(xiàn)在開始正式的學(xué)習(xí)內(nèi)容。
第1章一切從●開始
1.1最簡單的空間對象
1.2讓空間對象變成程序代碼
1.3第一個迷你GIS
1.4總結(jié)
第2章更完整的類庫
2.1空間對象體系
2.2迷你GIS的重新實(shí)現(xiàn)
2.3空間對象的隨機(jī)生成
2.4總結(jié)
第3章屏幕坐標(biāo)與實(shí)際坐標(biāo)
3.1坐標(biāo)系統(tǒng)
3.2兩種坐標(biāo)之間的轉(zhuǎn)換
3.3迷你GIS的再次更新
3.4總結(jié)
第4章瀏覽功能的初步實(shí)現(xiàn)
4.1縮放
4.2平移
4.3歸一化的瀏覽操作
4.4更豐富的迷你GIS
4.5總結(jié)
第5章更有效的顯示方法
5.1閃爍的原因
5.2用雙緩沖解決閃爍問題
5.3解決顯示內(nèi)容消失的問題
5.4解決顯示內(nèi)容變形的問題
5.5提高顯示效率
5.6總結(jié)
第6章矢量圖層
6.1建立屬性數(shù)據(jù)的字段結(jié)構(gòu)
6.2空間對象類型
6.3矢量圖層類定義
6.4矢量圖層類的應(yīng)用
6.5總結(jié)
第7章用鼠標(biāo)實(shí)現(xiàn)瀏覽
7.1定義鼠標(biāo)的功能
7.2鼠標(biāo)按鍵事件
7.3鼠標(biāo)滾輪事件
7.4總結(jié)
第8章讀取Shapefile中的點(diǎn)實(shí)體
8.1Shapefile文件結(jié)構(gòu)概覽
8.2讀取shp文件頭
8.3讀取shp記錄
8.4更新的迷你GIS
8.5總結(jié)
第9章讀取Shapefile中的線和面實(shí)體
9.1更完善的XLine及XPolygon
9.2線與面shp文件的讀取
9.3功能更加完善的GIS
9.4總結(jié)
第10章讀取Shapefile中的屬性數(shù)據(jù)
10.1dbf文件結(jié)構(gòu)及文件頭
10.2字段描述區(qū)
10.3讀取數(shù)據(jù)區(qū)
10.4完整的Shapefile讀取函數(shù)
10.5GIS的再次完善
10.6總結(jié)
第11章空間數(shù)據(jù)文件的讀寫
11.1數(shù)據(jù)類型與文件結(jié)構(gòu)
11.2文件頭與圖層名的寫入
11.3字段信息的寫入
11.4空間和屬性數(shù)據(jù)值的寫入
11.5自定義文件的讀取
11.6讀寫過程測試
11.7總結(jié)
第12章點(diǎn)選空間對象
12.1點(diǎn)選框架的建立
12.2點(diǎn)到線實(shí)體的距離
12.3點(diǎn)到面實(shí)體的距離
12.4實(shí)現(xiàn)屏幕點(diǎn)選
12.5總結(jié)
第13章框選空間對象及選擇集操作
13.1框選算法
13.2實(shí)現(xiàn)屏幕框選
13.3定義選擇集
13.4選擇集的高亮顯示
13.5操作選擇集
13.6總結(jié)
第14章基于屬性特征的對象選擇
14.1基于查詢條件的對象選擇
14.2屬性查詢功能的實(shí)現(xiàn)
14.3基于屬性窗口的空間對象選擇
14.4總結(jié)
第15章柵格圖層
15.1柵格描述文件結(jié)構(gòu)
15.2擴(kuò)充的圖層類定義
15.3構(gòu)建柵格圖層
15.4柵格圖層的打開與顯示
15.5總結(jié)
第16章多圖層管理
16.1定義圖層文檔類XDocument
16.2實(shí)現(xiàn)圖層管理函數(shù)
16.3實(shí)現(xiàn)圖層選擇函數(shù)
16.4實(shí)現(xiàn)圖層文檔的讀寫
16.5實(shí)現(xiàn)支持圖層文檔的窗體
16.6總結(jié)
第17章控件化功能組織
17.1添加一個XPanel控件
17.2瀏覽功能
17.3圖層文檔菜單項處理
17.4圖層菜單項處理
17.5基于控件開發(fā)的GIS
17.6總結(jié)
第18章完善的自動標(biāo)注功能
18.1字體與顏色
18.2錨點(diǎn)與位置
18.3方向與角度
18.4寫入與讀取
18.5考慮各種屬性特征的標(biāo)注繪制
18.6人機(jī)交互式定制標(biāo)注屬性
18.7總結(jié)
第19章專題地圖
19.1XSymbology及唯一值專題地圖
19.2獨(dú)立值專題地圖
19.3分級設(shè)色專題地圖
19.4集成化實(shí)現(xiàn)專題地圖定制
19.5總結(jié)
第20章網(wǎng)絡(luò)模型基礎(chǔ)
20.1基本的網(wǎng)絡(luò)要素
20.2建立拓?fù)潢P(guān)系
20.3網(wǎng)絡(luò)模型讀寫
20.4最短路徑分析
20.5展示分析結(jié)果
20.6總結(jié)
第21章網(wǎng)絡(luò)模型應(yīng)用
21.1FormNetwork的功能分析
21.2構(gòu)建網(wǎng)絡(luò)模型
21.3實(shí)現(xiàn)最短路徑分析
21.4總結(jié)
第22章空間索引的構(gòu)建
22.1空間索引基礎(chǔ)
22.2定義結(jié)點(diǎn)
22.3種樹準(zhǔn)備
22.4結(jié)點(diǎn)的插入
22.5結(jié)點(diǎn)的分裂
22.6樹的調(diào)整
22.7總結(jié)
第23章空間索引的應(yīng)用
23.1RTree在圖層中的引入
23.2基于樹結(jié)構(gòu)的搜索
23.3樹結(jié)構(gòu)的存儲
23.4總結(jié)
第24章空間參考系統(tǒng)
24.1WGS 1984及UTM
24.2單個點(diǎn)的坐標(biāo)轉(zhuǎn)換
24.3空間實(shí)體坐標(biāo)轉(zhuǎn)換
24.4圖層坐標(biāo)轉(zhuǎn)換
24.5驗(yàn)證轉(zhuǎn)換效果
24.6總結(jié)
第25章圖層新建與編輯欄的添加
25.1交互式新建圖層
25.2添加編輯工具欄
25.3總結(jié)
第26章空間對象編輯
26.1空間實(shí)體繪制
26.2屬性值編輯
26.3空間對象的刪除、修改與保存
26.4總結(jié)
第27章最后的整合
27.1PeekChar的問題
27.2避免無效繪制
27.3屬性窗口的快速打開
27.4總結(jié)
附錄: XGIS類庫說明