GDAL原始碼剖析(一)

2021-07-07 05:17:53 字數 4220 閱讀 7935

一、gdal簡介

在開始文章之前,我想先提出幾個問題,什麼是gdal?gdal能做什麼?gdal怎麼使用?gdal內部結構是怎麼組織的?gdal提供的演算法原理是什麼?對於上面的幾個問題,希望大家看完該系列文章後能對上面的幾個問題少點疑惑,希望能對感興趣的童鞋們有所幫助。本人不才,文章中難免會出現問題,希望大家不吝指正。

什麼是gdal?這個問題比較簡單,通俗的講,gdal是乙個讀寫空間資料(這裡的空間資料報括柵格資料和向量資料)的開源庫(但不僅限於此,此外還提供了一些非常常用的演算法和工具)。嚴格的講,大家可以參考gdal首頁上的介紹。

the related ogr library(which lives within the gdal source tree) provides a similar capability for****** features vector data.

二、gdal目錄結構

圖1 gdal原始碼壓縮包檔案目錄結構

圖2 gdal svn原始碼檔案目錄結構

從上面兩張圖中可以看出,gdal的目錄結構不管是用什麼方式獲取的源**,它的目錄結構都是一樣的,下面就針對目錄結構中的每個資料夾和檔案做乙個簡單的說明。(按照字母順序來進行說明)

下面先對資料夾進行說明:

1、alg資料夾:alg資料夾中存放的是gdal庫中提供的一些演算法的源**,這些演算法包括但不限於:dem生成等高線演算法;影象糾正演算法(幾何糾正,tps糾正,正射rpc糾正);柵格向量化演算法;向量柵格化演算法;格網計算演算法;pct和rgb互轉演算法;分類圖的小碎斑塊去除演算法等。

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庫,以及字串的處理等。

14、vb6資料夾:這個資料夾中用來將gdal編譯成乙個vb6的模組,對於裡面具體的檔案說明,以及如何編譯參考資料夾中的readme.txt,由於我對vb6的使用,還是僅限於拖個按鈕,寫個單擊事件的基礎,對於模組之間的呼叫,實在是不太懂,所在就不說明了。想用vb6使用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檔案自動生成,後面詳細介紹。

18、 news:gdal的新增功能,以及修復的bug記錄等。

19、 nmake.opt:gdal編譯選項配置檔案,在編譯gdal中,可以指定gdal繫結的其他庫等都在這個裡面進行設定。在後面的gdal編譯中會詳細介紹說明。

20、 nmake-wince.opt:編譯wince版本的編譯選項配置檔案。

22、 submake.bat:乙個編譯的批處理檔案,目前沒啥用。

23、 svnkeywords.sh:又是svn的乙個shell指令碼。

24、 version:gdal版本資訊。

GDAL原始碼剖析(一)

一 gdal簡介 gdal官方 本文章中的基本內容都是參照官網中的資訊,如有錯誤或者與官網中的內容衝突,以官網中的為正確。在開始文章之前,我想先提出幾個問題,什麼是gdal?gdal能做什麼?gdal怎麼使用?gdal內部結構是怎麼組織的?gdal提供的演算法原理是什麼?對於上面的幾個問題,希望大家...

原始碼剖析 Hashtable 原始碼剖析

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...

STL原始碼剖析(一)

新開了個坑,侯捷的stl原始碼剖析。其實最開始想看原始碼是因為用string用的不熟悉,不知道裡面有哪些函式,也不知道用了函式裡面儲存層會變成什麼樣。比如對string用 會發生什麼,重新分配記憶體還是用指標指向新開的記憶體,strlen的複雜度到底是不是o n 等等,然後就買了侯捷的這本書,結果到...