本書是一本系統(tǒng)介紹一個地理信息系統(tǒng)底層開發(fā)的完整教程,講授如何通過程序語言實現(xiàn)地理信息系統(tǒng)的基本功能,包括空間數(shù)據與屬性數(shù)據的管理、分析及可視化等。全書內容均為底層開發(fā),不依賴于任何商業(yè)地理信息系統(tǒng)軟件,各種算法或數(shù)據操作方法均有詳細介紹,且深入淺出。通過閱讀本書,希望提高讀者的原始創(chuàng)新能力。
第1章介紹了如何實現(xiàn)一個最小化的地理信息系統(tǒng),第2章搭建了一個底層開發(fā)的基本框架,第3至5章講述了地理信息可視化的基本要點,第6章介紹了矢量圖層,第7章講述鼠標在地理信息瀏覽中的作用,第8至11章介紹Shapefile文件的讀取以及如何自定義地理信息系統(tǒng)數(shù)據文件格式,第12至14章介紹空間及屬性信息的選擇方法,第15章介紹柵格圖層,第16章介紹多圖層管理,第17章實現(xiàn)了一個基本的地理信息系統(tǒng)集成控件,第18及19章介紹了地理信息的可視化技術,第20及21章講述了網絡分析方法的實現(xiàn),第22及23章介紹了空間索引的構建及應用,第24章介紹了空間參考系統(tǒng),第25及26章講述了空間及屬性數(shù)據的編輯方法,第27章介紹了地理信息系統(tǒng)開發(fā)的幾種優(yōu)化方法。
為便于讀者高效學習,快速掌握地理信息系統(tǒng)底層開發(fā)知識,本書作者精心制作了電子書、完整的源代碼以及通過電子郵件或微信公眾平臺的答疑服務等內容。
本書適合作為廣大高校地理信息系統(tǒng)或地理信息科學專業(yè)的課程教材,也可以作為地理信息系統(tǒng)技術開發(fā)者或愛好者的自學參考用書。
什么是地理信息系統(tǒng)底層開發(fā)
首先,我們需要定義什么是地理信息系統(tǒng)(GIS)。根據作者的理解,地理信息系統(tǒng)就是一個能夠處理、分析和應用各類空間數(shù)據的軟件系統(tǒng)。目前,工業(yè)界已經有不少成熟的商業(yè)或非商業(yè)的地理信息系統(tǒng)軟件產品,比如ArcGIS。針對這些軟件的應用通?煞譃閮蓚層次,即應用和開發(fā),前者即利用軟件的現(xiàn)有功能,通過非程序化的方式,達到應用的目的; 而后者則是在這些軟件平臺提供的二次開發(fā)工具的基礎之上,開發(fā)一個新的軟件產品,這通常被稱為基于某某軟件的地理信息系統(tǒng)二次開發(fā),比如ArcGIS的二次開發(fā)工具ArcGIS Engine。對于一個非常成熟的地理信息系統(tǒng)軟件產品來說,作者建議二次開發(fā)者閱讀或學習其官方用戶手冊或開發(fā)教程,通常更加完備且準確。
本書要講授的內容不是二次開發(fā),而是底層開發(fā)。簡單來說,我們的底層開發(fā)不是基于ArcGIS Engine開發(fā)一個軟件,而是希望開發(fā)一個類似ArcGIS或ArcGIS Engine的軟件。當然,我們說的底層開發(fā)也是有底的,或者說是相對的,它不是從機器語言或匯編語言開始,而是基于高級程序設計語言的,在本書中選擇的是Windows平臺下的C#編程語言,同時也建議讀者能夠基于本書的思想,嘗試利用其他語言實現(xiàn)底層開發(fā),在本書之前的讀者群中,就曾經有過讀者利用Java或Python語言在不同的操作系統(tǒng)下完成了本書的大部分學習內容,而且看起來非常棒!
為什么要學習地理信息系統(tǒng)底層開發(fā)
作者認為有如下三個理由。
第一,在開源共享的大環(huán)境下,越來越多的地理信息系統(tǒng)相關研發(fā)人員覺得底層開發(fā)是沒有必要的,因為我們通常可以很快地從網上找到別人做好的東西,快速整合到自己的系統(tǒng)中。作者非常贊同這樣的做法,站在別人的肩膀上,讓步伐更快些。同時,作者也在深深地思考,提供資源的人總是有限和少數(shù)的,如果每個人都只做成果的使用者或集成者,那么誰去創(chuàng)造成果?從這個意義上講,作者不期待本書有多大的銷量,但作者相信本書的讀者將有可能成為社會的關鍵少數(shù)。
第二,持懷疑態(tài)度的批評者可能會認為,本書介紹的內容過于基礎,其中絕大多數(shù)內容都是現(xiàn)有商業(yè)軟件已經完全實現(xiàn)了的,讀者即便學會了,也似乎沒有用武之地。關于這一點,作者的觀點是,如果希望超越,首先需要學會跟跑。不曾踏過前人經歷的坑坑洼洼,就必將會跌入未來某一個大坑里。當然,如果只希望跟跑,那應該問題不大,總會有強者把你從坑里拉出來。但是,針對承擔著原始創(chuàng)新重任的關鍵少數(shù)來說,要學會自己站起來才行。這就好比,蘋果手機已經很不錯了,我們?yōu)槭裁催需要華為。所以,這也是寫作本書的重要目的之一,提高讀者的原始創(chuàng)新能力。
第三,從讀者個人來講,如果希望成為一個在未來工作中有能力、有擔當?shù)年P鍵少數(shù),需要有強大的分析問題、解決問題的能力。本書并不是一本專門講授如何提高這些能力的心靈雞湯,但確實希望在攻克一個個底層開發(fā)堡壘的過程中,鍛煉讀者抽絲剝繭的能力,提高讀者的獲得感,增強讀者的自信心。顯然,并不是每一位讀者今后都會去從事底層開發(fā)工作,去創(chuàng)造一個屬于自己的ArcGIS、SuperMap等。而且,閱讀完本書,也不能保證讀者就已經可以開發(fā)一套GIS軟件了,如果真如此,那只能說是江湖騙術。更多的實際情況是,讀者可能加入某個GIS相關的行業(yè),因為了解底層的秘密,而成為關鍵少數(shù)的中流砥柱。畢竟,僅僅了解GIS成熟軟件二次開發(fā)的門檻太低了。因此,從這個意義上講,寫作本書的另一個重要目的就是提高讀者的行業(yè)競爭能力。
閱讀本書會得到什么
通過前一小節(jié)的說明,我們希望讀者經由閱讀此書,提高兩個能力:
■原始創(chuàng)新能力。
■行業(yè)競爭能力。
在知識點方面,我們會介紹如何利用程序設計語言實現(xiàn)GIS的三大功能,包括:
■空間數(shù)據管理。
■空間數(shù)據分析。
■空間數(shù)據可視化。
除了書本身,我們還提供:
■對每一位認真的讀者來說都很需要的程序源碼。
■一些示例空間數(shù)據及相關參考文檔。
■作為教材講授時所需要的教學課件。
上述資料可通過以下方式獲得:
■搜索并關注微信公眾號大數(shù)據攻城獅,輸入XGIS,獲得下載地址。
閱讀本書前的準備
本書在Windows操作系統(tǒng)下,以C#語言為開發(fā)語言進行講解。在閱讀本書之前,讀者需要對GIS的基本概念及C#語言有一定了解。此外,面向對象編程思想也在本書有較好的應用,因為這是編寫一個較為復雜的軟件平臺所必需的,讀者可事先尋找相關資料,對這一思想加以學習和領會。相信通過閱讀本書,會進一步加深讀者對C#語言及面向對象編程思想的理解。
學習本書內容,讀者唯一需要特別安裝的軟件就是Visual Studio集成開發(fā)環(huán)境(IDE),該軟件是Microsoft公司的一個產品,如果是出于學習的目的,讀者可以從該公司網站上免費下載并安裝這個產品,在試用一段時間后,通過電子郵件注冊的方式,讀者就可以永久使用這一開發(fā)工具。本書就是利用這一開發(fā)工具編寫代碼的。Visual Studio是一個存在已久的軟件產品,已經發(fā)布了多個版本,而本書內容并不針對其中的特定版本,讀者可以按照以下步驟下載并安裝最新的Visual Studio軟件。
1. 在網絡瀏覽器中輸入或者通過網絡搜索引擎,搜索關鍵字Visual Studio IDE,通常在搜索結果中的第一項就是上述網址。
2. 在打開的網頁中,找到當前適用于讀者Windows操作系統(tǒng)的最新版本,根據網頁提示完成下載和安裝。
在編寫本書時,我們選擇的版本是Visual Studio Community 2019。當安裝結束后,在所有程序中,讀者會發(fā)現(xiàn)一個新的程序,名為Visual Studio 2019,單擊它,就可以開始學習本書的第1章了; 否則,請重新安裝上述軟件工具。在本書中,我們將Visual Studio Community 2019簡稱為VS。
關于書中的程序源碼
本書附帶的程序源碼可以直接在VS中打開閱讀。本書附錄包含所有類及新定義數(shù)據類型的屬性成員和函數(shù)的定義及說明。此外,文中所有源碼都會被清楚地標明其所屬的文件或類,例如,如下信息表示所列出的代碼屬于代碼文件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;
}
同時,基于本書講解的內容開發(fā)的多個實用工具可以通過微信公眾號大數(shù)據攻城獅獲得,歡迎讀者關注。
至此,我們已經完成了準備工作,現(xiàn)在開始正式的學習內容。