前言:一直在使用和研究GDAL的相關東西,發現網上對GDAL的內容倒是不少,但是很少有系統的介紹說明,以及內部的一些結構說明,基於這些原因,將本人的一些粗淺的理解放在此處,形成一個系列,暫時名為《GDAL源碼剖析》(名稱有點大言不慚,歡迎大家口水吐之,板磚拍之),供大家交流參考,有什麼錯誤之處,望大家不吝指正,本系列對於GDAL的使用均是在Windows平台下,對於Linux平台下的不在此系列討論範圍之內。此外,轉載本部落格內容,請註明出處,強烈鄙視轉載後不註明出處的“類剽竊”行為。
一、GDAL簡介
GDAL官方網站http://www.gdal.org/,本文章中的基本內容都是參照官網中的資訊,如有錯誤或者與官網中的內容衝突,以官網中的為正確。
在開始文章之前,我想先提出幾個問題,什麼是GDAL?GDAL能做什嗎?GDAL怎麼使用?GDAL內部結構是怎麼組織的?GDAL提供的演算法原理是什嗎?對於上面的幾個問題,希望大家看完該系列文章後能對上面的幾個問題少點疑惑,希望能對感興趣的童鞋們有所協助。本人不才,文章中難免會出現問題,希望大家不吝指正。
什麼是GDAL?這個問題比較簡單,通俗的講,GDAL是一個讀寫空間資料(這裡的空間資料包括柵格資料和向量資料)的開源庫(但不僅限於此,此外還提供了一些非常常用的演算法和工具)。嚴格的講,大家可以參考GDAL首頁上的介紹。
GDAL is a translator library for raster geospatial dataformats that is released under an X/MIT style Open
Source license by the Open Source Geospatial Foundation. As alibrary, it presents a singleabstract data model to the calling application for allsupported formats. It
also comes with a variety of usefulcommandline utilities fordata translation and processing. TheNEWSpage describes the July 2011 GDAL/OGR 1.8.1
release.
The related OGR library(which lives within the GDAL source tree) provides a similar capability forsimple features vector data.
二、GDAL目錄結構
首先對於GDAL的目錄結構進行一個簡單的介紹。GDAL原始碼:http://trac.osgeo.org/gdal/wiki/DownloadSource,或者安裝svn從原始碼伺服器下載,svn地址是:http://svn.osgeo.org/gdal/trunk。
如果是使用下載的壓縮包,其目錄結構如:
圖1 GDAL源碼壓縮包檔案目錄結構
如果使用svn下載的原始碼,目錄結構如下:
圖2 GDAL SVN源碼檔案目錄結構
從上面兩張圖中可以看出,GDAL的目錄結構不管是用什麼方式擷取的原始碼,它的目錄結構都是一樣的,下面就針對目錄結構中的每個檔案夾和檔案做一個簡單的說明。(按照字母順序來進行說明)
下面先對檔案夾進行說明:
1、alg檔案夾:alg檔案夾中存放的是GDAL庫中提供的一些演算法的原始碼,這些演算法包括但不限於:DEM產生等高線演算法;映像糾正演算法(幾何糾正,TPS糾正,正射RPC糾正);柵格向量化演算法;向量柵格化演算法;格網計算演算法;PCT和RGB互轉演算法;分類圖的小碎斑塊去除演算法等。
2、apps檔案夾:apps檔案夾中存放的是GDAL庫中提供的一些命令列工具集的原始碼,這些工具集的介紹可以參考http://gdal.org/gdal_utilities.html,將來我會對這些工具做一個簡單的說明。其中有些工具非常的有用,比如gdalinfo,可以使用該工具來查看映像的中繼資料資訊等。
3、bridge檔案夾:bridge檔案夾中存放的是用來串連GDAL抽象類別的定義以及GDAL自己的結構體定義和實現的原始碼。具體到後面涉及到GDAL的實現原理時會對該檔案夾作一個比較詳細的介紹。
4、data檔案夾:data檔案夾中存放的是GDAL庫中需要用到的一些“設定檔”(此處用設定檔可能不太準確),這些檔案主要有ESRI的投影檔案,ESPG的投影檔案,PCI的投影和橢球體檔案,autoCAD的標頭檔,以及其他的一些檔案。在GDAL庫中有很多時候會自動讀取該檔案夾中的檔案,一般是通過環境變數來尋找該檔案夾,環境變數的名字叫GDAL_DATA,值就是data檔案夾的路徑,或者可以在你的程式中使用函數 CPLSetConfigOption("GDAL_DATA","C:\GDAL\data");來進行設定該檔案夾的目錄,如果沒有設定GDAL會自動從環境變數中尋找,如果還是沒有找到,那麼GDAL可能會提示錯誤,比如如果不設定GDAL_DATA,那麼在寫如atuocad的dxf格式的時候就提示建立不成功,後面遇到的話會再進行說明。
5、doc檔案夾:doc檔案夾存放的是用來生產GDAL協助文檔的一些dox檔案,dox檔案是使用doxygen工具來進行產生的,後面會對doxygen工具作一個簡單的介紹和說明,以及在自己的工程中怎麼使用doxygen產生自己的程式的開發協助文檔等。總之一句話,這個檔案夾就是用來產生GDAL庫的協助文檔的一些東西。後面會告訴大家如何產生一份GDAL的協助文檔,當然你也可以把gdal.org整個網站抓下來,J
6、frmts檔案夾:這個檔案夾可以說是GDAL代碼中東西最多的一個檔案夾了,每次更新GDAL的版本後都會發現這個檔案夾中會多出幾個檔案夾,同時GDAL也會中支援的檔案格式中多出來幾個新的檔案格式。沒錯,這個檔案夾存放的就是GDAL針對每種不同的特定的映像格式解析的原始碼,可以舉幾個簡單的例子,比如bmp檔案夾就是解析BMP映像的,hfa檔案夾就是用來解析Erdas的img映像格式,raw檔案夾用來讀取ENVI的hdr檔案,還有pcidsk檔案夾就是讀取PCI的pix格式的等等。所以這個檔案夾存放的是解析各個檔案格式的原始碼。
7、gcore檔案夾:通過名字大家也應該知道這個檔案夾是做什麼的了,叫core的肯定都是很核心的東西了,這個檔案夾就是GDAL的靈魂所在,主要存放的GDAL抽象類別的資料集,波段,映像讀寫介面等都在這個裡面實現的。如果要知道GDAL的抽象類別是怎麼對映像格式進行抽象的,可以看看這個裡面的代碼。
8、html檔案夾:html檔案夾如果使用壓縮包的話,裡面應該是空的,這個檔案夾主要是用來存放GDAL的產生的協助文檔的地方,主要是使用前面介紹的doc檔案夾中的dox指令碼,使用doxygen工具產生的GDAL協助文檔會出現在這個檔案夾中。後面會和doc檔案夾一起進行一個詳細介紹。
9、m4檔案夾:m4檔案夾存放的有好幾個已m4為尾碼名的檔案,m4檔案叫MacroProcessor Library,m4檔案是編譯基礎中最核心的檔案,這個檔案主要是用autoconf來產生configure設定檔,繼而自動產生Makefile檔案。這個檔案夾中Windows平台下貌似沒什麼作用,可能是我還不知道吧,在此略過。
10、man檔案夾:man檔案夾貌似是用來產生linux或者其他平台下的協助檔案,估計是可以使用linux下的man協助吧。Windows平台下貌似也沒什麼用,略過。
11、ogr檔案夾:用過GDAL的肯定知道ogr庫吧,在很久很久以前,GDAL和OGR是兩個庫,GDAL專門負責讀取柵格資料,OGR庫負責讀取向量資料,然後可能是因為兩個庫分開有些不方便,比如GDAL的演算法庫中經常會用到向量資料的讀取,或者還有別的原因吧,現在將這兩個庫整合在了一起,目前OGR庫就是GDAL庫的一個子集。其實OGR庫還是可以單獨編譯出來的。Ogr檔案夾就是存放OGR庫原始碼的檔案夾。這個檔案夾裡面也是有很多東西的,後面再詳細進行介紹。
12、port檔案夾:port檔案夾中存放的是port庫的東西,port庫對於GDAL庫來說是一個底層的支援庫,port庫中定義了一些字串的操作,檔案處理,網頁請求,資料庫連接,雜湊表,字元加密檔案壓縮等基礎的函數。比如GDAL中所有的匯出函數符號CPL_DLL就是在這個port檔案夾中定義的,還有frmts檔案夾中,開啟檔案,開啟資料庫,開啟網路路徑等都是用的port庫,以及字串的處理等。
13、swig檔案夾:swig檔案夾主要是存放swig的指令碼。Swig全稱叫SimplifiedWrapper and Interface Generator,網址是www.swig.org,
swig的作用就是可以將C/C++寫的庫封裝為Python,C#,Java,Perl和 Ruby等其他語言的提供者。網上GDAL的C#版本就是使用swig來編譯出來實現的,很強大吧。後面有時間的話,會寫一篇關於swig編譯GDAL的文章。
14、vb6檔案夾:這個檔案夾中用來將GDAL編譯成一個VB6的模組,對於裡面具體的檔案說明,以及如何編譯參考檔案夾中的readme.txt,由於我對VB6的使用,還是僅限於拖個按鈕,寫個單擊事件的基礎,對於模組之間的調用,實在是不太懂,所在就不說明了。想用VB6使用GDAL的可以自己研究一下,應該也不是很難。
15、wince檔案夾:顧名思義,這個檔案夾中的東西就是用來編譯Windows CE平台下的GDAL庫用的,具體編譯請參考其中的說明文檔。
檔案夾介紹完了,下面對檔案進行一個大概說明:
1、aclocal.m4:同上面的m4檔案夾
2、autogen.sh:Linux平台下的shell檔案,用來調用autoconf來產生configure設定檔的。
3、COMMITERS:該檔案中的內容是GDAL開發人員的資訊,姓名,聯絡郵箱以及各自負責開發的模組說明等。
4、config.guess,config.sub,configure,configure.in:這四個檔案貌似都是linux平台下的設定檔,中Windows下沒啥用,略過。
5、Doxyfile:Doxyfile就是前面doc檔案夾中說明提到的doxygen的工程檔案,用來產生協助文檔用的,後面在介紹doxygen的使用是會對該檔案進行一個說明。
6、GDALmake.opt.in:這個檔案是linux平台下的GDAL庫編譯設定檔,功能在後面的nmake.opt中介紹。
7、gdalnightlysvn.sh:Linux平台下調用svn擷取GDAL原始碼的一個shell指令碼。
8、GNUmakefile:GNU的make檔案。
9、HOWTO-RELEASE:GDAL發布版本的一些說明。
10、 install-sh:GDAL的安裝shell指令碼,Linux平台下。
11、 LICENSE.TXT:GDAL的許可說明檔案。
12、 ltmain.sh:libtool的shell指令碼,Linux平台下,Windows下貌似沒用到。
13、 makefile.vc:GDAL的編譯檔案,用來將原始碼編譯成dll檔案,後面會在GDAL編譯中作一個介紹。
14、 makegdal_gen.bat:用來產生VS的工程檔案的一個批次檔,後面在GDAL編譯中會對該檔案的使用方式做一個說明。
15、 makegdal10.sln:檔案夾中所有的sln檔案都是VS的專案檔,檔案名稱後的數字代表的是VS的版本號碼。
16、 makegdal10.vcxproj和makegdal71.vcproj:VS的工程檔案,該檔案可以由makegdal_gen.bat檔案自動產生,後面詳細介紹。
17、 mkbindist.sh,mkgdaldist.sh和mktestdist.sh:三個shell指令檔,Windows下沒用,略過。
18、 NEWS:GDAL的新增功能,以及修複的bug記錄等。
19、 nmake.opt:GDAL編譯選項設定檔,在編譯GDAL中,可以指定GDAL綁定的其他庫等都在這個裡面進行設定。在後面的GDAL編譯中會詳細介紹說明。
20、 nmake-wince.opt:編譯wince版本的編譯選項設定檔。
21、 PROVENANCE.TXT:GDAL目錄說明檔案,如果上面說明的不夠清楚,可以參考這個檔案。
22、 submake.bat:一個編譯的批次檔,目前沒啥用。
23、 svnkeywords.sh:又是svn的一個shell指令碼。
24、 VERSION:GDAL版本資訊。
第一篇完,後續文章陸續奉上,敬請期待新作!