GDAL学习总结
GDAL介紹
GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協(xié)議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。OGR是GDAL項目的一個分支,功能與GDAL類似,只不過它提供對矢量數據的支持。
有很多著名的GIS類產品都使用了GDAL/OGR庫,包括ESRI的ARCGIS 9.3,Google Earth和跨平臺的GRASS GIS系統(tǒng)。利用GDAL/OGR庫,可以使基于Linux的地理空間數據管理系統(tǒng)提供對矢量和柵格文件數據的支持。
外文名 Geospatial Data Abstraction Library?
簡 ? ?稱 GDAL?
性 ? ?質 開源柵格空間數據轉換庫
用 ? ?途 進行數據轉換和處理
簡介
GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協(xié)議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。
OGR是GDAL項目的一個分支,功能與GDAL類似,只不過它提供對矢量數據的支持。
有很多著名的GIS類產品都使用了GDAL/OGR庫,包括ESRI的ARCGIS 9.3,Google Earth和跨平臺的GRASS GIS系統(tǒng)。利用GDAL/OGR庫,可以使基于Linux的地理空間數據管理系統(tǒng)提供對矢量和柵格文件數據的支持。
功能特征
GDAL提供對多種柵格數據的支持,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas Imagine Images(img),ASCII DEM(dem) 等格式。
GDAL使用抽象數據模型(abstract data model)來解析它所支持的數據格式,抽象數據模型包括數據集(dataset),坐標系統(tǒng),仿射地理坐標轉換(Affine Geo Transform), 大地控制點(GCPs), 元數據(Metadata),柵格波段(Raster Band),顏色表(Color Table),子數據集域(Subdatasets Domain),圖像結構域(Image_Structure Domain),XML域(XML:Domains)。
GDALMajorObject類:帶有元數據的對象。
GDALDdataset類:通常是從一個柵格文件中提取的相關聯(lián)的柵格波段集合和這些波段的元數據;GDALDdataset也負責所有柵格波段的地理坐標轉換(georeferencing transform)和坐標系定義。
GDALDriver類:文件格式驅動類,GDAL會為每一個所支持的文件格式創(chuàng)建一個該類的實體,來管理該文件格式。
GDALDriverManager類:文件格式驅動管理類,用來管理GDALDriver類。
OGR體系結構
Geometry類:Geometry (包括OGRGeometry等類)封裝了OpenGIS的矢量數據模型,并提供了一些幾何操作,WKB(Well Knows Binary)和WKT(Well Known Text)格式之間的相互轉換,以及空間參考系統(tǒng)(投影)。
Spatial Reference類:OGRSpatialReference封裝了投影和基準面的定義。
Feature類:OGRFeature封裝了一個完整feature的定義,一個完整的feature包括一個geometry和geometry的一系列屬性。
Feature Definition類:OGRFeatureDefn里面封裝了feature的屬性,類型、名稱及其默認的空間參考系統(tǒng)等。一個OGRFeatureDefn對象通常與一個層(layer)對應。
Layer類:OGRLayer是一個抽象基類,表示數據源類OGRDataSource里面的一層要素(feature)。
Data Source類:OGRDataSource是一個抽象基類,表示含有OGRLayer對象的一個文件或一個數據庫。
Drivers類:OGRSFDriver對應于每一個所支持的矢量文件格式。類OGRSFDriver由類OGRSFDriverRegistrar來注冊和管理。
GDAL的安裝
(1)下載gdal的安裝文件,解壓到某目錄下,如C:\gdalsrc下。
這里我們假定VC6的安裝在默認目錄C:\Program Files\Microsoft Visual Studio8下。
(2)啟動cmd,即打開控制臺窗口。進入VC6的安裝目錄下,如cd C:\Program Files\MicrosoftVisual Studio8\VC\bin\,在此目錄下有個文件VCVARS32.BAT,執(zhí)行一下這個文件,然后重新回到C:\gdalsrc下。運行命令nmake /f makefile。編譯完成后,用記事本打開文件C:\gdalsrc\nmake.opt,根據自己的情況修改GDAL_HOME = 這一行,這個指的是最終GDAL的安裝目錄,比如說我們安裝在C:\GDAL,那么這一行就是GDAL_HOME = "C:\GDAL",在C:\gdalsrc下執(zhí)行nmake /f makefile install,然后是nmake /f makefile devinstall,然后我們需要的東西就安裝到了C:\GDAL下。
GDAL的使用
初次使用visual studio 對工具不熟悉,有些步驟可以配置的
(1)在VS2005中新建win32控制臺程序 testGDALconsole,(向導中附加選項不能選為空項目)將C:\GDAL\bin\gdal14.dll拷貝到testGDALconsole目錄下的debug目錄中。(否則運行時會提示找不到gdal14.dll)
(2)在工程的Library files中和Include files中分別添加GDAL的LIB文件目錄和頭文件目錄,
這步我不會,就直接將gdal_priv.h拷貝到testGDALconsole.cpp所在目錄下
(3)添加一個文件gdal_i.lib。使用 #pragma comment (lib,"..\\lib\\gdal_i.lib")(這步沒做)
(4)程序文件
樣本程序如下:
#include "stdafx.h"
#include "gdal_priv.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
if(argc!=2)
{
return 0;
}
GDALDataset *poDataset;
GDALAllRegister();
poDataset = (GDALDataset *) GDALOpen( argv[1], GA_ReadOnly );
if( poDataset != NULL )
{
cout<<"RasterXSize:"<<poDataset->GetRasterXSize()<<endl;
cout<<"RasterYSize:"<<poDataset->GetRasterYSize()<<endl;
cout<<"RasterCount:"<<poDataset->GetRasterCount()<<endl;
}
return 0;
}
假定生成的程序名為test.exe,假定有一個文件名為1.jpg的文件在C:\下,在命令行下test.exe
c:\1.jpg,程序將打印出此圖片的橫縱坐標和raster count,如:
C:\>test 1.JPG
RasterXSize:800
RasterYSize:600
RasterCount:3[1]?
========
很好的GDAL初學者資料
1、編譯加使用:http://blog.csdn.net/gisblog/archive/2008/10/06/3021933.aspx?如何在CSharp中使用GDAL?
? ? GDAL庫的簡潔、高效深受開發(fā)人員的喜愛,很多開源的GIS軟件甚至是商業(yè)GIS軟件都使用了這個庫。GDAL使用C++,在Visual studio環(huán)境下開發(fā),對C,C++的支持當然不會有什么問題。但對于C#、Python、Java來說,過程就相對繁瑣一些,對初學者造成了不少的麻煩。本文以GDAL1.50為例,詳細說明在CSharpe語言中使用GDAL的環(huán)境配置問題,至于Python的環(huán)境配置問題,在另一篇文章“如何在CSharpe中使用GDAL”中另行討論。希望對初用GDAL的人員有所幫助。?
? ? GDAL從1.4.1開始添加了swig,以支持.NET環(huán)境下的C#語言。在swig文件夾中包含了C#源代碼。以下是主要的處理步驟:?
1、準備一個C++編譯器。建議使用Visual studio2005。?
2、下載源代碼。?
地址:http://download.osgeo.org/gdal/gdal150.zip。?
3、把gdal150.zip解壓至“C:\gdal-1.5.0”,當然放在其它文件夾也可以。?
4、修改源代碼中的錯誤。源文件“C:\gdal-1.5.0\frmts\leveller\levellerdataset.cpp”的第171行的內容如下:?
{ "?, kPI / 180.0, UNITLABEL_DEGREE },?
在?號后面加上雙引呈",改成如下形式:?
{ "?", kPI / 180.0, UNITLABEL_DEGREE },?
你可以使用任何一種文本文件的編輯工具來進行修改。筆者嘗試過下載GDAL1.52的版本,存在同樣的問題,真想不到GDAL庫也會犯如此低級的錯誤。?
5、創(chuàng)建安裝的目標文件夾“C:\gdal-runtime”,稍后的編譯配置中,我們將配置GDAL把編譯后將會安裝到這個文件夾內。?
6、修改編譯配置文件夾“C:\gdal-1.5.0\nmake.opt”。以下是第41至第43行的內容:?
!IFNDEF GDAL_HOME?
GDAL_HOME = "C:\warmerda\bld"?
!ENDIF?
默認的情況下,GDAL將會安裝到"C:\warmerda\bld"文件夾內,為了更好地了解安裝過程,我們把第42行修改成如下內容:?
GDAL_HOME = "C:\gdal-runtime"?
7、編譯源文件。使用“Visual Studio 2005 命令提示”工具來進行,(該工具位于“開始\程序\Microsoft Visual Studio 2005\Visual Studio Tools”內)。?
打開“Visual Studio 2005 命令提示”工具,鍵入"cd C:\gdal-1.5.0",進入源文件所在的文件夾,再鍵入"nmake /f makefile.vc"執(zhí)行編譯。編譯過程可能需要一些時間,主要取決于機器的性能。?
如果沒有第4步的修改,將會出現(xiàn)大量的編譯錯誤,累積至100個后,VS2005將自動停止編譯。?
8、安裝文件。?
鍵入“nmake /f makefile.vc install”,執(zhí)行完畢后,"C:\gdal-runtime"文件夾下增加了bin,data,及html文件夾。?
鍵入“nmake /f makefile.vc devinstall”執(zhí)行完畢后,"C:\gdal-runtime"文件夾下增加了lib,include文件夾。這兩個文件夾主要用于C及C++的開發(fā)。?
在"C:\gdal-runtime\bin"文件夾內已經生成了gdal15.dll文件,這是GDAL庫的核心,不管采用何種開發(fā)方式,最終都由這個DLL文件來執(zhí)行實質性的操作。?
9、編譯C#源文件。?
鍵入“cd C:\gdal-1.5.0\swig\csharp”,進入C#源文件所在的文件夾。?
鍵入“nmake /f makefile.vc”,編譯完畢后生成8個DLL文件:gdal_csharp.dll、gdalconst_csharp.dll、ogr_csharp.dll、osr_csharp.dll和gdal_wrap.dll、gdalconst_wrap.dll、ogr_wrap.dll、osr_wrap.dll。前面4個文件名中都含有"csharp",用法與另外4個稍有不同,稍后詳細討論。?
10、把8個DLL文件復制到安裝文件夾"C:\gdal-runtime\bin"。?
11、創(chuàng)建環(huán)境變量。?
把路徑C:\gdal-runtime\bin添加到系統(tǒng)變量Path,如果沒有該變量,則應新建一個。如果你使用的是windows2003,添加后不必重啟,修改即時生效;如果你不能確定是否已經生效,可以在doc窗口內輸入“echo %path%”,如果顯示的內容中包含了"C:\gdal-runtime\bin",則表示修改已經生效。如果你還是無法確定,那就重啟吧,這是最安全的方式。?
12、在VS2005 CSharp項目中添加對GDAL的引用。新建一個CShapr應用程序項目,然后添加對C:\gdal-runtime\bin中4個含有"csharp"的DLL文件的引用。至此我們就可以使用GDAL的功能了。為了測試GDAL是否可以運行,我們?yōu)榇绑w的Load事件增加如下的代碼:?
private void Form1_Load(object sender, EventArgs e)?
{?
try?
{?
OSGeo.GDAL.Gdal.AllRegister();?
OSGeo.GDAL.Dataset dataSet = OSGeo.GDAL.Gdal.Open(@"C:\F-49-32-(10).tif", Access.GA_ReadOnly);?
int w = dataSet.RasterXSize;?
int h = dataSet.RasterYSize;?
MessageBox.Show("image width=" + w + ",height=" + h);?
}?
catch (Exception err)?
{?
Console.WriteLine(err.Message);?
}?
}為了運行程序,Open方法的第一個參數@"C:\F-49-32-(10).tif"應改成你本機上圖像文件所在的路徑。如果運行正常的話將彈出一個對話框,顯示圖像的寬度和高度。?
關于其它一些問題的討論:?
1、關于GDAL_DATA系統(tǒng)變量。GDAL建議創(chuàng)建這個系統(tǒng)變量,從上面的討論中,我們已經知道,這個系統(tǒng)變量并非必須的,但是如果你想使用一些GDAL提供的例子,那就很有必要,因為樣例中的某些方法需要訪問這個系統(tǒng)變量。?
2、我們已經提到過,創(chuàng)建安裝文件夾并非必須的;如果使用默認的方式來編譯,將安裝到C:\warmerda\bld文件夾內。無論使用何種方式,要想使用GDAL,你的C#程序必須能訪問到這些DLL文件:包括上面提到的8個DLL文件,以及C:\gdal-runtime\bin\gdal15.dll文件。我們可以用一句話來概括:C#環(huán)境下使用GDAL的問題核心,實質上就是如何保證C#程序能夠訪問到這9個DLL文件。?
在此,我們回顧一下Windows搜索DLL文件的基本規(guī)則:?
1)執(zhí)行文件所在的文件夾。?
2)windows系統(tǒng)安裝文件夾,即安裝了windows的文件夾,GetWindowsDirectory( )函數可提供該目錄的路徑名。?
3)Windows系統(tǒng)目錄,即System32子目錄;調用GetSystemDiretory( )函數可獲得這個目錄的路徑名。?
4)在系統(tǒng)變量Path中配置的文件夾,或用dos的path命令指定的文件夾。?
5)網絡中映象的目錄列表中的全部目錄。?
在需要調用DLL文件時,windows將按以上的順序,逐一查找各個文件夾,如果找不到相應的文件,將返回異常信息。?
根據以上的規(guī)則,系統(tǒng)變量path中不必包含GDAL的安裝路徑,我們只要把這9個DLL文件復制到執(zhí)行文件所有的位置,同樣可以運行。例如把文件復制到bin/debug或bin/release文件夾內,這樣程序的運行就不再依賴于任何系統(tǒng)變量了。這種方式非常適合于發(fā)布和打包最終的應用程序。在程序開發(fā)期間,我們仍然提倡使用系統(tǒng)變量指向GDAL安裝路徑的方式,開發(fā)時將更加有靈活性。
2、GDAL(Geospatial Data Abstraction Library)從1.4.1版本開始支持.NET環(huán)境下的C#語言?;镜木幾g步驟參照《如何在CSharp中使用GDAL》(http://blog.csdn.net/gisblog/archive/2008/10/06/3021933.aspx),博主把步驟寫的很詳細,一路參照編譯順利,只是把自己遇到的幾個問題總結如下:
a)下載地址:http://download.osgeo.org/gdal/,自己使用的時候還只是1.6.1,現(xiàn)在最新的版本已是1.6.2,O(∩_∩)O~每天都有新事物。
b)GDAL的底層是用C++寫的,所以要用C++編譯器才會編譯成功。
c)生成的九個dll中,gdal16.dll才是GDAL庫的實現(xiàn)核心。
d)在C#中使用時,需要引用四個有_csharp后綴的dll。
e)在開發(fā)過程,最好把編譯的GDAL庫bin文件夾加入到系統(tǒng)環(huán)境變量中。
f)在打包和用于發(fā)布的應用程序中,需要把9個dll文件全部拷貝到程序目錄中。
注意了上面的細節(jié),就可以順利使用啦↖(^ω^)↗
3、
Gdal In C# 接口編譯
Gdal是柵格地理空間數據格式的轉換開源類庫,它使用一種單一的抽象數據模型,滿足了其所支持的所有數據格式的應用需求。目前Gdal的最新版本為GDAL/OGR 1.6.0
與Gdal類似地,與Gdal庫一起的OGR類庫,提供了對矢量數據的相關操作。
詳細資料請參考GDAL
流浪者N應用Gdal是為了用C#實現(xiàn)對HDF文件的操作。
下面為流浪者N編譯支持HDF4、HDF5的Gdal庫的操作,首先聲明流浪者N這么編譯出的Gdal仍然不支持HDF,這里寫下一為記錄;二為交流,尋求幫助。
流浪者N嘗試編譯的Gdal版本:gdal-1.5.2、gdal-1.6.0 ;
另外還需swig,這里用的版本:swigwin-1.3.38 ;HDF4:42r4-win-vnet;HDF5:5-182-win-vs2005
為了支持HDF5,還需下載SZip,這里用szip21-vs2005 ;
OK,現(xiàn)在萬事具備,只欠編譯了,盡管編譯出來不能支持HDF,但對于TIFF之類還是支持的,仍然期待…
編譯準備……
1.Gdal壓縮包、swigwin壓縮包、HDF壓縮包、szip壓縮包解壓;
2.修改。
修改Gdal中的bug,Source Files\leveller\levellerdataset.cpp文件171行 { “?, kPI / 180.0, UNITLABEL_DEGREE },將“ “? ”修改為“ ”? “ ”,保存;
修改Gdal根目錄下的nmake.opt文件:MSVC_VER=1400(即選擇VS2005);GDAL_HOME=“YourDir”,YourDir為你自己建立的用于存放編譯生成的文件的地方,自行定義;SWIG = swig.exe,將swigwin解壓后其中swig.exe的路徑填于此處;
3.再次修改nmake.opt,安裝 Hdf4、Hdf5的驅動。
找到“Uncomment the following and update to enable NCSA HDF Release 4 support”位置,將該項下方的三個#去除。修改如下:HDF4_PLUGIN = YES ? ?HDF4_DIR = E:\JoSn\sIon\Gdal0311_10\42r4-win-vnet ? ? HDF4_LIB = $(HDF4_DIR)\lib\ hd424.lib
同理修改HDF5的相關配置。修改如下:HDF5_PLUGIN = YES ? ? HDF5_DIR = E:\JoSn\sIon\Gdal0311_10\5-182-win-vs2005 ? ? SZIP_DIR = E:\JoSn\sIon\Gdal0311_10\szip21-vs2005-enc ? ? ? HDF5_LIB = $(HDF5_DIR)\hdf5dll.lib \
? $(SZIP_DIR)\dll\szlibdll.lib
修改部分結束
修改完畢,編譯真正開始…
1.打開VS 2005 命令行,定位到Gdal所在的文件夾;
2.nmake /f makefile.vc;
3.nmake /f makefile.vc install;
4.nmake /f makefile.vc devinstall,這步完成后GDAL_HOME處生成一系列的文件,其bin目錄下會有gdal15.dll or gdal16.dll,視gdal版本而定。
5. cd swig\csharp,定位到gdal目錄下的csharp文件夾。
6.nmake /f makefile.vc,這步完成后會在csharp目錄下生成8個dll文件。將這8個文件拷貝到gdal15.dll or gdal16.dll 所在位置(見第4步)。
測試程序……
1.添加*_csharp.dll 四個文件的引用。
2.OSGeo.GDAL.Gdal.AllRegister();
3.OSGeo.GDAL.Dataset ds=OSGeo.GDAL.Gdal.Open(@”d:\test.tiff”,OSGeo.GDAL.Access.GA_ReadOnly);
4.int w = ds.RasterXSize; int h = ds.RasterYSize; MessageBox.Show(”image width=” + w + “,height=” + h);
5.tiff文件的測試沒有問題,但改為HDF4或HDF5文件就無能為力了。提示為:暫不支持該文件。
尋求交流與幫助
1.望對Gdal有較深研究者傳授流浪者N編譯支持HDF的方法
2.流浪者N后來用FWTools,據說FWTools編譯的Gdal支持了HDF4、HDF5,但不知是流浪者N愚鈍,不會用FWTools2.2.8,還是FWTools2.2.8存在bug,總之有異常,說是“OSGeo.GDAL.GdalPINVOKE的類型初始值設定項引發(fā)異?!?#xff0c;這倒與之前流浪者N錯誤編譯Gdal庫時的異常相同,不知是和緣故,望廣大GIS同行們指點。
3.大家?guī)蛶兔?期待ing
?
4\
========
在Window下編譯、安裝、使用GDAL?
1. GDAL簡介
GDAL(主頁:http://www.gdal.org/)是一個操作柵格地理數據的庫,由C寫成。它包括讀取、寫入、轉換和處理各種柵格數據格式。當前版本的GDAL還包含了OGR庫,OGR也是用C寫成,是操作矢量地理數據的庫,合二為一,GDAL庫具備了操作柵格和矢量地理數據的能力。更令人欣喜的是,GDAL是開源的,跨平臺的,目前有很多軟件都用到了GDAL,如GRASS,QGIS,Google Earth等等。GDAL支持C/C++、VB、Python、Java、C#/.NET、Ruby、Perl,目前能夠支持如此多語言的庫真的不多。GDAL支持的格式多得驚人,可以看看它主頁上列也的Support Formats(http://www.gdal.org/formats_list.html)。
2.下載GDAL
二進制文件(已經編譯好的):http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries
源文件(未編譯):http://trac.osgeo.org/gdal/wiki/DownloadSource
上面兩鏈接都列出了各種平臺各種版本,你可根據自己的情況下載。撰寫此文時,GDAL最新的Release版本是1.6.0。
3.編譯前配置
? ? ? ? ?直接下載編譯好的二進制文件固然省事,但對于想自己動手進一步了解GDAL,用GDAL進行開發(fā)的話,最好還是下載源文件自己編譯。編譯方法如下:
1) ?準備C++編譯器,如Visual Studio2005或者2003。
2) ?將下載的源碼解壓到C:\gdal-X.X.X(X.X.X表示版本號,當然你也可以自己命名),把文件放在其它目錄也可以。
3) ?修改源文件的錯誤。源文件\frmts\leveller\levellerdataset.cpp的第171行的內容如下:
{ "?, kPI / 180.0, UNITLABEL_DEGREE }
在?號后面加上雙引號",改成如下形式:
{ "?", kPI / 180.0, UNITLABEL_DEGREE },
不知為何,1.6.0版本依然沒有修改這個BUG。
4) ?修改編譯安裝目錄。
用任意文本編輯器,如記事本打開配置文件nmake.opt,找到以下代碼:
!IFNDEF GDAL_HOME
GDAL_HOME = "C:\warmerda\bld"
!ENDIF
BINDIR = $(GDAL_HOME)\bin
PLUGINDIR = $(BINDIR)\gdalplugins
PY_INST_DIR = $(GDAL_HOME)\pymod
LIBDIR = $(GDAL_HOME)\lib
INCDIR = $(GDAL_HOME)\include
DATADIR = $(GDAL_HOME)\data
HTMLDIR = $(GDAL_HOME)\html
其中GDAL_HOME = "C:\warmerda\bld"為編譯后的安裝目錄,這里你可以修改你想要的目錄,當然也可以不改。
4. ?添加Python支持
修改PY_INST_DIR = $(GDAL_HOME)\pymod把路徑改成python下的Lib\site-packages文件夾下。PYDIR = "C:\Software\Python24" 改成python的安裝路徑。
5. ?添加其它支持
在編譯GDAL時,你可以按需要添加其它支持,如ProJ,GeoTiff等等,添加方法只要在nmake.opt找到相關配置節(jié),把前面的“#”去掉,即取消注釋,然后修改相關的路徑即可。如:
nmake.opt中的PROJ.4 stuff節(jié)
# PROJ.4 stuff
# Uncomment the following lines to link PROJ.4 library statically. Otherwise
# it will be linked dynamically during runtime.
# PROJ_FLAGS = -DPROJ_STATIC
# PROJ_INCLUDE = -ID:\GDAL\proj-4.5.0\src
# PROJ_LIBRARY = D:\GDAL\proj-4.5.0\src\proj_i.lib
本節(jié)的作用是控制鏈接方式,默認是注釋的,即采用動態(tài)鏈接方式。只需拷貝proj的動態(tài)庫。若要采用靜態(tài)鏈接方式,通過取消gdal的該節(jié)注釋,并設置proj源碼的對應路徑即可。靜態(tài)鏈接的好處是,加載之初就會判斷庫的依賴關系,這可以避免采用動態(tài)鏈接庫而又缺少依賴庫而出現(xiàn)莫名其妙的現(xiàn)象。
6. ?編譯GDAL源碼
打開“Visual Studio 2005 命令提示”工具,該工具位于“開始\程序\Microsoft Visual Studio 2005\Visual Studio Tools”?;蛘咧苯哟蜷_“cmd”窗口,但需要注冊VC編譯環(huán)境,使用如下代碼(與你機子的VS安裝路徑有關):
E:\program files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat
在命令提示符下,用“cd”命令定位到GDAL文件夾(如C:\gdal-1.6.0),輸入以下命令:
nmake /f makefile.vc
這里編譯要花費一定的時間,請耐心等待。
7. ?安裝GDAL
編譯完成后,輸入以下命令:
nmake /f makefile.vc install
命令執(zhí)行后,即在安裝目錄下創(chuàng)建了bin,data,html文件夾。其中bin中包含了GDAL的核心文件gdalXX.dll(XX為版本號,如為gdal16.dll)。
再輸入以下命令:
nmake /f makefile.vc devinstall
命令執(zhí)行后,即在安裝目錄下創(chuàng)建include,lib文件夾,這兩個文件夾用于開發(fā)。?
8. ?編譯C#源碼
? ? ? ? ?在命令提示符下輸入:
cd C:\gdal-1.5.0\swig\csharp
進入C#源文件所在的文件夾,然后再輸入:
nmake /f makefile.vc
編譯完成后,將會生成以下8個dll文件:
gdal_csharp.dll、
gdalconst_csharp.dll、
ogr_csharp.dll、
osr_csharp.dll
gdal_wrap.dll、
gdalconst_wrap.dll、
ogr_wrap.dll、
osr_wrap.dll。
將以上8個dll文件復制到安裝目錄的bin文件夾下。
9. ?使用GDAL
在VS開發(fā)中,要先在工具(Tools)-> 選項(Options)-> Projects(vc6.0為Directories)中添加GDAL的lib和include路徑,然后把生成的dll文件放在可執(zhí)行文件所在的文件夾里或直接放在system32文件夾內即可。
如果要用到bin目錄中的exe程序,則要創(chuàng)建環(huán)境變量,即把GDAL的安裝目錄的bin路徑(如C:\gdal-1.6.0\bin)添加到環(huán)境變量中的Path。添加方法為:右擊“我的電腦”-> “屬性”->”高級”,點擊“環(huán)境變量”按鈕,在系統(tǒng)變量里找到Path,如果沒有可添加Path變量,然后把路徑添加進去,多個路徑以分號分隔。
?
========
GDAL源碼剖析 之GDAL開發(fā)及其調試
一、簡單的調用關于GDAL的使用,網上的資料都很多,主要還是要熟悉GDAL的組織結構,類以及類的函數等,熟悉了,使用GDAL就不在話下了。最常用的就是動態(tài)庫的GDAL,當然你也可以使用靜態(tài)庫,這里只是簡單的介紹使用動態(tài)GDAL庫來做開發(fā)。
首先打開VS,新建一個工程,控制臺的就成。然后在工程的屬性對話框中,找到【配置屬性】-【C/C++】-【常規(guī)】,右側的【附加包含目錄】中,將GDAL的include文件夾路徑填寫到這里,如下圖:
第二、繼續(xù)在屬性對話框中,找到【配置屬性】-【鏈接器】-【常規(guī)】,右側的【附加庫目錄】中,將GDAL的lib文件夾路徑填寫到這里,如下圖:
第三、在【配置屬性】-【鏈接器】-【輸入】,右側的【附加依賴項】中,將gdal_i.lib填寫到此處。然后點擊確定即可。至此,使用GDAL的環(huán)境全部搭建完成,剩下的就是在您的代碼中使用GDAL了。
將下面的代碼(代碼摘自GDAL官方指南:http://gdal.org/gdal_tutorial.html)貼到剛才新建的工程中的cpp文件中,保存后編譯,正常情況下會提示生成成功,然后運行,會在控制臺上將圖像的信息輸出。
#include "gdal_priv.h"
#include "cpl_conv.h" //for CPLMalloc()
?
int main()
{
? ? //注冊文件格式
? ? GDALAllRegister();
? ?
? ? const char* pszFile = "C:\\Test.img";
? ? GDALDataset *poDataset;
? ? //使用只讀方式打開圖像
? ? poDataset = (GDALDataset*) GDALOpen( pszFile,GA_ReadOnly );
? ? if( poDataset == NULL )
? ? {
? ? ? ? printf( "File: %s不能打開!\n",pszFile);
? ? ? ? return 0;
? ? }
?
? ? //輸出圖像的格式信息
? ? printf( "Driver:%s/%s\n",
? ? ? ? poDataset->GetDriver()->GetDescription(),
? ? ? ? poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME) );
?
? ? //輸出圖像的大小和波段個數
? ? printf( "Size is%dx%dx%d\n",
? ? ? ? poDataset->GetRasterXSize(),poDataset->GetRasterYSize(),
? ? ? ? poDataset->GetRasterCount());
?
? ? //輸出圖像的投影信息
? ? if( poDataset->GetProjectionRef() != NULL )
? ? ? ? printf( "Projectionis `%s'\n", poDataset->GetProjectionRef() );
?
? ? //輸出圖像的坐標和分辨率信息
? ? double adfGeoTransform[6];
? ? if( poDataset->GetGeoTransform( adfGeoTransform) == CE_None )
? ? {
? ? ? ? printf( "Origin =(%.6f,%.6f)\n",
? ? ? ? ? ? adfGeoTransform[0], adfGeoTransform[3]);
?
? ? ? ? printf( "PixelSize = (%.6f,%.6f)\n",
? ? ? ? ? ? adfGeoTransform[1], adfGeoTransform[5]);
? ? }
?
? ? GDALRasterBand *poBand;
? ? int ? ? ? ? ? ?nBlockXSize, nBlockYSize;
? ? int ? ? ? ? ? ?bGotMin, bGotMax;
? ? double ? ? ? ? adfMinMax[2];
?
? ? //讀取第一個波段
? ? poBand = poDataset->GetRasterBand( 1 );
?
? ? //獲取圖像的塊大小并輸出
? ? poBand->GetBlockSize(&nBlockXSize, &nBlockYSize );
? ? printf( "Block=%dx%dType=%s, ColorInterp=%s\n",
? ? ? ? nBlockXSize, nBlockYSize,
? ? ? ? GDALGetDataTypeName(poBand->GetRasterDataType()),
? ? ? ? GDALGetColorInterpretationName(
? ? ? ? poBand->GetColorInterpretation()));
?
? ? //獲取該波段的最大值最小值,如果獲取失敗,則進行統(tǒng)計
? ? adfMinMax[0] = poBand->GetMinimum( &bGotMin);
? ? adfMinMax[1] = poBand->GetMaximum( &bGotMax);
?
? ? if( ! (bGotMin&& bGotMax) )
? ? ? ? GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);
?
? ? printf( "Min=%.3fd,Max=%.3f\n", adfMinMax[0], adfMinMax[1] );
?
? ? //輸出圖像的金字塔信息
? ? if( poBand->GetOverviewCount() > 0 )
? ? ? ? printf( "Band has%d overviews.\n", poBand->GetOverviewCount() );
?
? ? //輸出圖像的顏色表信息
? ? if( poBand->GetColorTable() != NULL)
? ? ? ? printf( "Band hasa color table with %d entries.\n",
? ? ? ? poBand->GetColorTable()->GetColorEntryCount() );
?
? ? float *pafScanline;
? ? int ? nXSize = poBand->GetXSize();
? ?
? ? //讀取圖像的第一行數據
? ? pafScanline = (float*) CPLMalloc(sizeof(float)*nXSize);
? ? poBand->RasterIO(GF_Read, 0, 0, nXSize,1,?
? ? ? ? pafScanline, nXSize,1, GDT_Float32, 0, 0 );
?
? ? CPLFree(pafScanline); //記得要釋放空間
?
? ? //關閉文件
? ? GDALClose((GDALDatasetH)poDataset);
}
二、GDAL源代碼調試
在很多時候我們需要看看GDAL的內部實現(xiàn),當然可以直接查看GDAL的源代碼,但是直接看源代碼,不能很好的理解,這時候就需要調試查看源代碼中變量的內容。調試GDAL的源代碼,需要GDAL的debug版本,以及編譯GDAL的時候的pdb等調試文件。當然也可以把GDAL的源代碼加入到你的工程中,但是這樣太費時費力。
下面就有一個很簡單的方法,可以直接調試進GDAL的源代碼中,首先編譯一下GDAL的debug版本,將編譯生成的文件,主要有gdal18.dll,gdal_i.exp,gdal_i.lib,gdal.lib,gdal18.pdb,gdal18.ilk,gdal18.exp等文件,將gdal18開頭的文件拷貝到自己工程的生成目錄中,然后調試自己的程序,在執(zhí)行到GDALOpen函數(或者其他GDAL的函數)時按F11鍵,就會進入到GDAL的源代碼中進行調試GDAL代碼。
三、GDAL使用示例
1、使用GDAL進行圖像裁切,參考http://blog.csdn.net/liminlu0314/article/details/6136512
2、使用GDAL進行圖像重采樣,參考http://blog.csdn.net/liminlu0314/article/details/6130064
3、使用GDAL創(chuàng)建金字塔,參考http://blog.csdn.net/liminlu0314/article/details/6127755
4. ?CSDN 上一個GDAL專欄:http://blog.csdn.net/column/details/gdal.html
========
了解GDAL圖像處理
http://blog.163.com/chenxingfeng_001/blog/static/10627072006115836560/1. GDAL庫介紹?
簡單地說,GDAL是一個操作各種柵格地理數據格式的庫。包括讀取、寫入、轉換、處理各種柵格數據格式(有些特定的格式對一些操作如寫入等不支持)。它使用了一個單一的抽象數據模型就支持了大多數的柵格數據(GIS對柵格,矢量,3D數據模型的抽象能力實在令人嘆服)。當然除了柵格操作,這個庫還同時包括了操作矢量數據的另一個有名的庫ogr(ogr這個庫另外介紹),這樣這個庫就同時具備了操作柵格和矢量數據的能力,買一送一,這么合算的買賣為什么不做。最最最重要的是這個庫是跨平臺的,開源的!如今這個庫對各種數據格式的支持強大到令人嘖嘖的地步了。如果你對他的強大有什么懷疑的話,看看這里一大串的GDAL所支持格式清單,嚇到了吧!再看看它的主頁最后那些使用了它作為底層數據處理的軟件列表吧!其中你可以不知道GRASS,你也可以不知道Quantum GIS (QGIS),但是你總該知道Google Earth吧!?
你即使不玩GIS,這個庫也是滿有用的。首先,哪個庫支持這么多柵格(圖片)格式,哪個庫在C/C++/python/ruby/VB/java/C#(這個暫時不完全支持)下都能用,而且都一樣用?退一步講,3S軟件又不一定要用在3S下(很多醫(yī)學影像就是用PCI軟件來處理的)。再退一步,你的生活即使和3S一點關系都沒有,柵格數據又不單單只有GIS下才用到。你大可用這個庫來讀取jpg,gif,tif,xpm等格式。而且對各種格式支持得不是一般的好,很大一部分非標準格式照樣支持得非常好。我曾經在java下玩過jai,以及一系列jai的擴展庫,一些圖像格式在很多圖片瀏覽器中都可以正確讀取(有的甚至不是非標準格式),用jai死活就讀不出來!?
這個庫的python版和其他的python庫結合的很好。最直接、明顯的支持是使用Numeric庫來進行數據讀取和操作。各種矩陣魔術可以發(fā)揮得淋漓盡致(圖像其實就是矩陣)。而且按我的觀點,python對矩陣的操作比其他的語言有明顯的優(yōu)勢。寫出來的東西比其他語言寫出來的短小的多,而且好看得多。并且python的弱類型在處理柵格數據格式類型的時候代碼量比強類型的語言少了數倍(不用double,byte,short等等分開處理,這簡直就是先天上的優(yōu)勢)。所以我就喜歡用python做圖像的處理。所以就連GIS界的微軟ESRI也直接在ARCGIS9中用python來作柵格數據的導入導出。一句話,真是太方便啦!?
2. 安裝?
2.1. windows下的安裝?
官方安裝文檔在這里。下面是我自己的實踐步驟:?
先去http://www.gdal.org/dl/下一個版本,解壓。 打開控制臺,輸入: “D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" 注冊vc的編譯環(huán)境。?
打 開gdal文件夾下的nmake.opt修改GDAL_HOME = "C:\warmerda\bld"把路徑改到需要把gdal安裝的地方。不改也可以。這里需要添加python支持,所以修改PY_INST_DIR = $(GDAL_HOME)\pymod把路徑改成python下的Lib\site-packages文件夾下。PYDIR = "C:\Software\Python24" 改成python的安裝路徑。 下面的參數愛改什么就把前面的#刪除(要看您有沒有那些庫的源碼),注意一下路徑就可以了。我是都沒改。 后面就依次運行?
Toggle line numbers?
1 nmake /f makefile.vc?
2 nmake /f makefile.vc install?
3 nmake /f makefile.vc devinstall?
最后最后,還要去GDAL_HOME目錄下的bin文件夾下把gdal13.dll (也有可能是gdal12.dll)copy到PY_INST_DIR路徑下?
到此處就完成安裝gdal(python)的工作。?
最后需要注意一下,gdal在.net2005下只能順利編譯1.2,1.3以上版本不能順利編譯,有一個地方指針轉換出錯??赡苁?005的編譯器比以往的嚴厲一點吧。另外,安裝了QGIS,對編譯也有一些影響,主要是proj庫的沖突,導致一個找不到"d:/program.obj"文件的錯誤,如果你有靜態(tài)編譯過proj,那么你可以打開nmake.opt修改有關proj的設置,如果搞不定,就卸載QGIS,然后編譯,編譯后再安裝QGIS.呵呵,還好QGIS的體積沒有ArcGIS那么可怕.?
2.2. linux下的安裝?
linux下的安裝就更簡單了。直接?
Toggle line numbers?
1 ./configure?
2 make?
3 su?
4 make install?
5 ldconfig?
就ok(默認就已經支持python)。當然在第一步的時候需要看看是否依賴的庫都安裝了。如果缺少,就去安裝一個。如果對configure的條件不理解,就用./configure --help看看具體情況。?
2.3. 安裝其他驅動?
這里講一個安裝hdf4的驅動的例子(默認情況下gdal是不安裝hdf4的),其他驅動應該和這個也差不了多少吧,可以作為其他的參考。完整步驟如下:?
在windows下的安裝:?
從ftp://ftp.ncsa.uiuc.edu/HDF/HDF/HDF%5FCurrent/bin/windows/下載42r1-win.ZIP,解壓。?
編輯gdal根目錄下的nmake.opt,找到“# Uncomment the following and update to enable NCSA HDF Release 4 support.”這一行?
把下面兩行前面的#去掉,然后改成:?
HDF4_DIR = D:\warmerda\42r1-win\release?
#HDF4_LIB = /LIBPATH:$(HDF4_DIR)\lib hd421m.lib?
HDF4_LIB = $(HDF4_DIR)\dll\hd421m.lib $(HDF4_DIR)\dll\hm421m.lib \?
$(HDF4_DIR)\lib\hd421.lib $(HDF4_DIR)\lib\hm421.lib?
用HDF4_LIB=/LIBPATH:這種形式似乎可以建立gdal的庫,但是往下編譯會出錯。而且要把$(HDF4_DIR)\dll和$(HDF4_DIR)\lib拷貝到同一個目錄下,不然會提示找不到庫?
你也可以試一試在D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vsvars32.bat文件中添加HDF4_LIB路徑到“@set LIB=”這行的末尾(不要忘記;的分割符)。?
然后找一下"INC="這行,把 -I$(HDF4_DIR)\include加到下一行的末尾(應該也可以在vsvars32.bat中添加路徑,不過要重啟命令行)。?
然后編譯吧!祝你好運。?
注意:上面的HDF4_DIR 是我本機的路徑,你要根據你自己的路徑進行設置(想起我的一個老師說過的話:“抄人家的作業(yè)可以,不要連名字也一起抄走啊 ” ),下面的$(HDF4_DIR)可以不用改,那個是變量,會自動替代HDF4_DIR 路徑。?
編譯成功后,要HDF4能運行,還需要兩個庫,一個是zlib,一個是szip,可以到下面兩個鏈接去下載一個?
ftp://hdf.ncsa.uiuc.edu/lib-external/zlib/1.2/bin?
ftp://hdf.ncsa.uiuc.edu/lib-external/szip/2.0/bin/windows?
把這兩個庫下載后解壓,然后設置PATH系統(tǒng)變量,使得它們在默認狀態(tài)下也可以被動態(tài)鏈接成功 。?
在Linux下比在Windows下簡單:?
只要用./configure --help察看一下打開HDF4的編譯開關(包括庫路徑,頭文件路徑等,看清楚),然后在./configure 后面加上那個開關以及hdf4的安裝路徑后就可以了。在configure后gdal會提示是否支持HDF4。 編譯后也要把zlib和szip的動態(tài)鏈接庫設置好 。?
到此你已經可以用C/C++來操作gdal讀寫hdf4的格式了!?
最后,為了讓Python能夠支持hdf的讀寫,別忘了把重新生成安裝后的pymod目錄下的內容,還有gdal13,還有那兩個hdf的庫,還有zlib,szip的庫拷貝到Python的Lib\site-packages目錄下 。?
2.4. 下載?
如果你實在玩不轉,可以在這里下載已經編譯好的gdal1.3.2程序庫 以及其依賴的其他庫,其中包括hdf4,hdf5支持,以及proj,geos插件。注意,這里的geos是靜態(tài)鏈接的,注意版權(geos是LGPL的license)。hdf4和hdf5用的是release版本。這里是我的nmake配置文件,你可以對照你的實際情況參考一下。?
3. 快速開始?
其實在主站的教程里已經有python的示例了。但是我們還是按照自己的思路來開始吧。?
第一步就是打開一個數據集。對于“數據集”這個名詞大家可能不會太習慣,但是對于一般的格式來說,一個“數據集”就是一個文件,比如一個gif文件就是一個以gif為擴展名的文件。但是對于眾多RS數據來說,一個數據集包含的絕對不僅僅是一個文件。對于很多RS數據,他們把一張圖像分成數個圖像文件,然后放在一個文件夾中,用一些額外的文件來組織它們之間的關系,形成一個“數據集”。如果你不理解,那么就算了,當成jpg或者gif文件好了。?
下面我們打開一個tiff文件(GeoTIFF)。這個文件是我從GRASS的示例數據spearfish中導出的一個同名影像數據。?
Toggle line numbers?
1 >>> import gdal?
2 >>> dataset = gdal.Open("j:/gisdata/gtif/spot.tif")?
3 >>> dir(dataset)?
4 ['AddBand', 'AdviseRead', 'BuildOverviews', 'FlushCache', 'GetDescription', 'Get?
5 Driver', 'GetGCPCount', 'GetGCPProjection', 'GetGCPs', 'GetGeoTransform', 'GetMe?
6 tadata', 'GetProjection', 'GetProjectionRef', 'GetRasterBand', 'GetSubDatasets',?
7 'RasterCount', 'RasterXSize', 'RasterYSize', 'ReadAsArray', 'ReadRaster', 'Refr?
8 eshBandInfo', 'SetDescription', 'SetGCPs', 'SetGeoTransform', 'SetMetadata', 'Se?
9 tProjection', 'WriteRaster', '__del__', '__doc__', '__init__', '__module__', '_b?
10 and', '_o']?
11 >>>?
這樣我們就打開了這個文件。并且我們可以看到可以供我們調用的函數們(更具體的API列表可以看這里)?,F(xiàn)在我們不做修改,不做添加,所以只要帶有Set開頭的函數以及有Write開頭的函數我們暫時都不管。因為RS影像必然要和地理上的位置掛上鉤,才能把圖像正確鋪展到一個坐標系中。其中的信息和對應關系有點復雜,不適合在快速開始中介紹,我們暫時也先不管。這里需要注意的就是幾個函數。?
GetDescription 獲得柵格的描述信息。?
Toggle line numbers?
1 >>> dataset.GetDescription()?
2 'j:/gisdata/gtif/spot.tif'?
3 >>>?
看來這里的圖像描述是圖像的路徑名,但是這是和各種不同數據集相關的,不同數據集可能有不同的描述。這要看讀取驅動的實現(xiàn)作者的高興了。?
RasterCount 獲得柵格數據集的波段數。?
GetRasterBand 獲得柵格數據集的波段。?
Toggle line numbers?
1 >>> dataset.RasterCount?
2 1?
3 >>> band = dataset.GetRasterBand(1)?
4 >>>?
Band這個詞可以翻譯成“波段。?
這里我們獲取了第一個波段(紅色值組成的表)。注意!這里的波段獲取和通常的C數組獲取不一樣,開始是1不是0。獲取了波段,我們就可以在下面的操作中讀取這個波段的所有數值。?
RasterXSize 圖像的寬度(X方向上的像素個數)?
RasterYSize 圖像的高度(Y方向上的像素個數)?
Toggle line numbers?
1 >>> dataset.RasterXSize?
2 950?
3 >>> dataset.RasterYSize?
4 700?
5 >>>?
可以看出我們的圖像大小是950*700。還是很小的一張圖。?
ReadRaster 讀取圖像數據(以二進制的形式)?
ReadAsArray 讀取圖像數據(以數組的形式)?
Toggle line numbers?
1 >>> help(dataset.ReadRaster)?
2 Help on method ReadRaster in module gdal:?
3 ReadRaster(self, xoff, yoff, xsize, ysize, buf_xsize=None, buf_ysize=None, buf_t?
4 ype=None, band_list=None) method of gdal.Dataset instance?
5 >>> help(dataset.ReadAsArray)?
6 Help on method ReadAsArray in module gdal:?
7 ReadAsArray(self, xoff=0, yoff=0, xsize=None, ysize=None) method of gdal.Dataset?
8 instance?
9 >>>?
這兩個函數很重要,它們直接讀取圖像的數據,可以看到兩個函數的幫助中有一大溜的參數。解釋一下: xoff,yoff,xsize,ysize 你可能不想讀取整張圖像。只想讀取其中的一部分。那么就用xoff,yoff指定想要讀取的部分原點位置在整張圖像中距離全圖原點的位置。用xsize和ysize指定要讀取部分圖像的矩形大小。?
buf_xsize buf_ysize 你可以在讀取出一部分圖像后進行縮放。那么就用這兩個參數來定義縮放后圖像最終的寬和高,gdal將幫你縮放到這個大小。?
buf_type 如果你要讀取的圖像的數據類型不是你想要的(比如原圖數據類型是short,你要把它們縮小成byte),就可以設置它。?
band_list 這就適應上面多波段的情況。你可以指定讀取的波段序列。要哪幾個波段,不要哪幾個波段,你說了算。?
舉個例子吧:?
Toggle line numbers?
1 >>> dataset.ReadAsArray(230,270,10,10)?
2 array([[255, 255, 255, 232, 232, 255, 255, 255, 255, 222],?
3 [255, 255, 255, 255, 255, 255, 210, 110, 11, 122],?
4 [255, 255, 255, 255, 255, 255, 210, 255, 11, 243],?
5 [201, 255, 255, 255, 255, 200, 200, 110, 122, 243],?
6 [111, 211, 255, 201, 255, 255, 100, 11, 132, 243],?
7 [255, 100, 100, 100, 110, 100, 110, 111, 122, 243],?
8 [255, 255, 255, 255, 255, 255, 122, 222, 255, 255],?
9 [255, 255, 255, 255, 255, 255, 243, 243, 255, 255],?
10 [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],?
11 [255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],'b')?
12 >>> dataset.ReadRaster(230,270,10,10)?
13 '\xff\xff\xff\xe8\xe8\xff\xff\xff\xff\xde\xff\xff\xff\xff\xff\xff\xd2n\x0bz\xff\?
14 xff\xff\xff\xff\xff\xd2\xff\x0b\xf3\xc9\xff\xff\xff\xff\xc8\xc8nz\xf3o\xd3\xff\x?
15 c9\xff\xffd\x0b\x84\xf3\xffdddndnoz\xf3\xff\xff\xff\xff\xff\xffz\xde\xff\xff\xff?
16 \xff\xff\xff\xff\xff\xf3\xf3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff?
17 \xff\xff\xff\xff\xff\xff\xff\xff\xff'?
18 >>>?
我們就把圖像中位于230,270,寬度10高度10的數據讀取出來了。?
我們看完了數據集的主要函數。似乎已經夠用了。的確,如果只是為了顯示圖像,這些的確已經夠了。但是如果需要更多信息,我們就不得不進入波段操作數據(實際上我們大多數時候都需要進入band獲取信息)。下面我們現(xiàn)在來看看剛才讀取出來的那個band有些什么東西可以供我們操作的(具體的API列表看這里)。?
Toggle line numbers?
1 >>> dir(band)?
2 ['AdviseRead', 'Checksum', 'ComputeBandStats', 'ComputeRasterMinMax', 'DataType'?
3 , 'Fill', 'FlushCache', 'GetDefaultHistogram', 'GetDescription', 'GetHistogram',?
4 'GetMaximum', 'GetMetadata', 'GetMinimum', 'GetNoDataValue', 'GetOffset', 'GetO?
5 verview', 'GetOverviewCount', 'GetRasterColorInterpretation', 'GetRasterColorTab?
6 le', 'GetScale', 'GetStatistics', 'ReadAsArray', 'ReadRaster', 'SetDefaultHistog?
7 ram', 'SetDescription', 'SetMetadata', 'SetNoDataValue', 'SetRasterColorInterpre?
8 tation', 'SetRasterColorTable', 'WriteArray', 'WriteRaster', 'XSize', 'YSize', '?
9 __doc__', '__init__', '__module__', '_o']?
10 >>>?
挑幾個有用的吧。?
Toggle line numbers?
1 >>> band.XSize?
2 950?
3 >>> band.YSize?
4 700?
5 >>> band.DataType?
6 1?
7 >>>?
不用解釋了吧,波段圖像的寬和高(象元為單位)。DataType,圖像中實際數值的數據類型。具體數據類型定義在gdalconst模塊里。使用的時候用import gdalconst引入。?
Toggle line numbers?
1 >>> import gdalconst?
2 >>> dir(gdalconst)?
3 ['CE_Debug', 'CE_Failure', 'CE_Fatal', 'CE_None', 'CE_Warning', 'CPLES_Backslash?
4 Quotable', 'CPLES_CSV', 'CPLES_SQL', 'CPLES_URL', 'CPLES_XML', 'CPLE_AppDefined'?
5 , 'CPLE_AssertionFailed', 'CPLE_FileIO', 'CPLE_IllegalArg', 'CPLE_NoWriteAccess'?
6 , 'CPLE_None', 'CPLE_NotSupported', 'CPLE_OpenFailed', 'CPLE_OutOfMemory', 'CPLE?
7 _UserInterrupt', 'CXT_Attribute', 'CXT_Comment', 'CXT_Element', 'CXT_Literal', '?
8 CXT_Text', 'DCAP_CREATE', 'DCAP_CREATECOPY', 'DMD_CREATIONDATATYPES', 'DMD_CREAT?
9 IONOPTIONLIST', 'DMD_EXTENSION', 'DMD_HELPTOPIC', 'DMD_LONGNAME', 'DMD_MIMETYPE'?
10 , 'GA_ReadOnly', 'GA_Update', 'GCI_AlphaBand', 'GCI_BlackBand', 'GCI_BlueBand',?
11 'GCI_CyanBand', 'GCI_GrayIndex', 'GCI_GreenBand', 'GCI_HueBand', 'GCI_LightnessB?
12 and', 'GCI_MagentaBand', 'GCI_PaletteIndex', 'GCI_RedBand', 'GCI_SaturationBand'?
13 , 'GCI_Undefined', 'GCI_YellowBand', 'GDT_Byte', 'GDT_CFloat32', 'GDT_CFloat64',?
14 'GDT_CInt16', 'GDT_CInt32', 'GDT_Float32', 'GDT_Float64', 'GDT_Int16', 'GDT_Int?
15 32', 'GDT_TypeCount', 'GDT_UInt16', 'GDT_UInt32', 'GDT_Unknown', 'GF_Read', 'GF_?
16 Write', 'GPI_CMYK', 'GPI_Gray', 'GPI_HLS', 'GPI_RGB', 'GRA_Bilinear', 'GRA_Cubic?
17 ', 'GRA_CubicSpline', 'GRA_NearestNeighbour', '__builtins__', '__doc__', '__file?
18 __', '__name__']?
19 >>>?
那些GDT開頭的就是數值數據類型。?
Toggle line numbers?
1 >>> band.GetNoDataValue()?
2 65535.0?
3 >>> band.GetMaximum()?
4 >>> band.GetMinimum()?
5 >>> band.ComputeRasterMinMax()?
6 (1.0, 255.0)?
7 >>>?
Maximum 是表示在本波段數值中最大的值,Minimum當然就是表示本波段中最小的值啦。我們可以看到在一開始這兩個都沒有值。因為對于文件格式不會有固有的最大最小值。所以我們通過函數ComputeRasterMinMax計算得到了。注意!這里的最大最小值不包括“無意義值”!也就是上面顯示的NoDataValue。需要解釋一下“無意義值”。不要以為0或者255在任何情況下都無意義。在很多情況下0,255需要和其他值一樣表示一個實際意義。雖然可能它最終會被顯示得和黑色一樣。而一些位置上的點要表示的意思是“什么也不是”,它在那個位置上只是為了占一個位置,使得整體圖像看起來像個矩形而已。在做實際應用的時候兩種值的處理將會完全不一樣。所以需要設置無意義值,來和其他的值區(qū)別開來。而用ComputeRasterMinMax算出的最大最小值,是排除了無意義值后計算出來的最大最小值。?
Toggle line numbers?
1 >>> band.GetRasterColorInterpretation()?
2 2?
3 >>> gdalconst.GCI_PaletteIndex?
4 2?
5 >>> colormap = band.GetRasterColorTable()?
6 >>> dir(colormap)?
7 ['Clone', 'GetColorEntry', 'GetColorEntryAsRGB', 'GetCount', 'GetPaletteInterpre?
8 tation', 'SetColorEntry', '__del__', '__doc__', '__init__', '__module__', '__str?
9 __', '_o', 'own_o', 'serialize']?
10 >>> colormap.GetCount()?
11 256?
12 >>> colormap.GetPaletteInterpretation()?
13 1?
14 >>> gdalconst.GPI_RGB?
15 1?
16 >>> for i in range(colormap.GetCount()):?
17 ... print colormap.GetColorEntry(i),?
18 ...?
19 (0, 0, 0, 255) (0, 0, 28, 255) (0, 0, 56, 255) (0, 0, 85, 255) (0, 0, 113, 255)?
20 (0, 0, 142, 255) (0, 0, 170, 255) (0, 0, 199, 255) (0, 0, 227, 255) (0, 0, 255,?
21 255) (0, 28, 0, 255) (0, 28, 28, 255) (0, 28, 56, 255) (0, 28, 85, 255) (0, 28,?
22 113, 255) (0, 28, 142, 255) (0, 28, 170, 255) (0, 28, 199, 255) (0, 28, 227, 255?
23 ) (0, 28, 255, 255) (0, 56, 0, 255) (0, 56, 28, 255) (0, 56, 56, 255) (0, 56, 85?
24 , 255) (0, 56, 113, 255) (0, 56, 142, 255) (0, 56, 170, 255) (0, 56, 199, 255) (?
25 0, 56, 227, 255) (0, 56, 255, 255) (0, 85, 0, 255) (0, 85, 28, 255) (0, 85, 56,?
26 255) (0, 85, 85, 255) (0, 85, 113, 255) (0, 85, 142, 255) (0, 85, 170, 255) (0,?
27 85, 199, 255) (0, 85, 227, 255) (0, 85, 255, 255) (0, 113, 0, 255) (0, 113, 28,?
28 255) (0, 113, 56, 255) (0, 113, 85, 255) (0, 113, 113, 255) (0, 113, 142, 255) (?
29 0, 113, 170, 255) (0, 113, 199, 255) (0, 113, 227, 255) (0, 113, 255, 255) (0, 1?
30 42, 0, 255) (0, 142, 28, 255) (0, 142, 56, 255) (0, 142, 85, 255) (0, 142, 113,?
31 255) (0, 142, 142, 255) (0, 142, 170, 255) (0, 142, 199, 255) (0, 142, 227, 255)?
32 (0, 142, 255, 255) (0, 170, 0, 255) (0, 170, 28, 255) (0, 170, 56, 255) (0, 170?
33 , 85, 255) (0, 170, 113, 255) (0, 170, 142, 255) (0, 170, 170, 255) (0, 170, 199?
34 , 255) (0, 170, 227, 255) (0, 170, 255, 255) (0, 199, 0, 255) (0, 199, 28, 255)?
35 (0, 199, 56, 255) (0, 199, 85, 255) (0, 199, 113, 255) (0, 199, 142, 255) (0, 19?
36 9, 170, 255) (0, 199, 199, 255) (0, 199, 227, 255) (0, 199, 255, 255) (0, 227, 0?
37 , 255) (0, 227, 28, 255) (0, 227, 56, 255) (0, 227, 85, 255) (0, 227, 113, 255)?
38 (0, 227, 142, 255) (0, 227, 170, 255) (0, 227, 199, 255) (0, 227, 227, 255) (0,?
39 227, 255, 255) (0, 255, 0, 255) (0, 255, 28, 255) (0, 255, 56, 255) (0, 255, 85,?
40 255) (0, 255, 113, 255) (0, 255, 142, 255) (0, 255, 170, 255) (0, 255, 199, 255?
41 ) (0, 255, 227, 255) (0, 255, 255, 255) (28, 0, 0, 255) (28, 0, 28, 255) (28, 0,?
42 56, 255) (28, 0, 85, 255) (28, 0, 113, 255) (28, 0, 142, 255) (28, 0, 170, 255)?
43 (28, 0, 199, 255) (28, 0, 227, 255) (28, 0, 255, 255) (28, 28, 0, 255) (28, 28,?
44 28, 255) (28, 28, 56, 255) (28, 28, 85, 255) (28, 28, 113, 255) (28, 28, 142, 2?
45 55) (28, 28, 170, 255) (28, 28, 199, 255) (28, 28, 227, 255) (28, 28, 255, 255)?
46 (28, 56, 0, 255) (28, 56, 28, 255) (28, 56, 56, 255) (28, 56, 85, 255) (28, 56,?
47 113, 255) (28, 56, 142, 255) (28, 56, 170, 255) (28, 56, 199, 255) (28, 56, 227,?
48 255) (28, 56, 255, 255) (28, 85, 0, 255) (28, 85, 28, 255) (28, 85, 56, 255) (2?
49 8, 85, 85, 255) (28, 85, 113, 255) (28, 85, 142, 255) (28, 85, 170, 255) (28, 85?
50>>>?
通過GetRasterColorInterpretation,我們知道我們的圖像是一個顏色表索引的圖像而不是純粹的黑白灰度圖像(PaletteIndex,其他的顏色模型,可以察看gdalconst模塊中GCI打頭的枚舉值)。這意味著我們讀出的數據有可能不是真實的數據。這些數據只是一個個實際數據的索引。真實數據存儲在另一個表中。我們通過ReadRaster讀出的數據值只是對應到這個表的一個索引而已。我們需要通過讀出這些數據,并在真實數據表中找出真實數據,重新組織成一個RGB表才能用來繪制。如果我們不經過對應,我們繪制出來的東西可能什么東西都不是。?
用GetRasterColorTable獲得了顏色表,通過GetPaletteInterpretation我們知道我們獲得的顏色表是一個RGB顏色表。GDAL支持多種顏色表,具體可以參考gdalconst模塊中GPI打頭的枚舉值。然后我們可以通過GetCount獲得顏色的數量。通過GetColorEntry獲得顏色表中的值。這里的顏色值都是一個4值的元組。里面有意義的只有前三個(如果顏色模型是GPI_RGB, GPI_HLS,都使用前3個,如果采用GPI_CMYK,則4個值都有意義了)。?
Toggle line numbers?
1 >>> help(band.ReadAsArray)?
2 Help on method ReadAsArray in module gdal:?
3 ReadAsArray(self, xoff=0, yoff=0, win_xsize=None, win_ysize=None, buf_xsize=None?
4 , buf_ysize=None, buf_obj=None) method of gdal.Band instance?
5 >>> help(band.ReadRaster)?
6 Help on method ReadRaster in module gdal:?
7 ReadRaster(self, xoff, yoff, xsize, ysize, buf_xsize=None, buf_ysize=None, buf_t?
8 ype=None) method of gdal.Band instance?
9 >>>?
顯然,band里的ReadAsArray參數顯然比dataset里面的要好用,而ReadRaster則差不多。但是ReadAsArray讀出的是數組,可以用Numeric模塊進行矩陣魔法。ReadRaster讀出的是二進制,雖然可以直接繪制,但是對于一些繪圖API來說,對[[RRR...][GGG...][BBB...]]表的處理明顯不如[[RGB][RGB]...],有的甚至不支持。雖然可以用struct.unpack來拆封,可效率上就差很多(而且拆封出來還是數組)。數組在矩陣魔法的控制之下則會顯得十分方便快捷,最后用tostring直接轉化稱為二進制繪制,速度也相當快。?
好了,快速開始已經使我們可以初步看清楚了gdal中圖像的組織。下面用一句話總結一下:波段組成圖像,波段指揮顏色。
========
Win7(32/64)VS2010配置編譯GDAL環(huán)境(圖文教程)
最近的一個VS2010的項目中用到了GDAL,關于GDAL這個庫的說明與贊美,這里就不贅述了,下面是在VS2010中配置GDAL的詳細過程。
系統(tǒng)說明
Win7(32位/64位),VS2010,GDAL 1.10.1(截止本文發(fā)布的最新版),進行下面的操作之前,請確保您已經正確安裝了VS2010,步驟如下:
1.下載GDAL
點擊進入GDAL的官方下載頁面,根據需要選擇不同的版本,根據測試之前的GDAL1.9.1 0往后的版本均可以按照本文的方法編譯成功。下載完成后解壓到一個根目錄下,因為這樣后面的操作會比較方便,本文所解壓的地址為
D:\gdal-1.10.1
如果你解壓的地址跟本文不同,可以按照實際情況做出修改。
2.執(zhí)行VCVARS32.BAT
以管理員身份運行cmd,(您可以在開始菜單搜索cmd,然后右擊選擇用管理員身份運行,也可以在C:\windows\system32下找到cmd.exe右擊選擇采用管理員身份運行),如圖:
undefined
然后在cmd中切換到VS2010的安裝目錄,例如本文中的是
C:\program files\Microsoft Visual Studio 10.0\VC\bin
執(zhí)行VCVARS32.BAT,如圖:
undefined
3.編譯GDAL
在cmd中切換目錄到
D:\gdal-1.10.1
目錄下,運行如下命令
nmake /f makefile.vc
編譯過程可能需要幾分鐘,根據系統(tǒng)的配置而定,如圖
undefined
4.設置輸出目錄
找到下載目錄中的nmake.opt文件,例如本文的中的文件路徑為:
D:\gdal-1.10.1\nmake.opt
用文本編輯器(建議使用現(xiàn)代化文本編輯器例如notepad++)打開修改GDAL_HOME的值為安裝目錄。本文中使用的目錄如下:
GDAL_HOME = "D:\GDAL"
如圖:
undefined
5.安裝GDAL
回到CMD界面,切換到解壓目錄(本文的是D:\gdal-1.10.1)下,執(zhí)行如下兩條命令:
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
如圖所示:
先執(zhí)行nmake /f makefile.vc install
undefined
再執(zhí)行nmake /f makefile.vc devinstall
undefined
等待一段時間之后,GDAL就算真正的編譯完成了,這時候打開步驟4中設置的安裝目錄,需要的東西就在里面了,有bin,data,html,lib,include幾個文件夾。如圖所示:
undefined
安裝完成以后需要在VS2010的項目中配置GDAL,具體方法情看:VS2010中項目配置引入GDAL
6.其他方法
Windows下,cmd定位至gdal目錄,運行makegdal_gen.bat生成.vcproj,然后打開生成即可;Linux下,terminal定位至gdal目錄,運行./configure,然后運行make命令即可,如需安裝,運行sudo make install。 來自@hao,也可以測試下。
VS2010調試變量報錯CXX0017沒有找到符號
?
運行VS2010空項目直接退出
?
VS2010中項目配置引入GDAL
請問配置好后添加頭文件,為什么總是提示無法找到呢?急急急急
參考http://malagis.com/vs2010-project-configuration-gdal.html,我這里是可以的
請問為什么它不能成功識別.BAT文件路徑?
你的路徑是不是有空格?
編譯gdal只能用vs20##軟件嗎?vc++6.0 不行嗎?
應該也可以,你去GDAL的官網看看,有沒相應的支持版本。
.站長,小弟覺得您的方法有紕漏,下面是我搜到的方法以管理員身份運行Visual Studio x64 兼容工具命令提示(2010)http://m15989223765.blog.163.com/blog/static/233430095201421725748335/
我想問下我編譯最后兩行的時候總是出現(xiàn)兩個錯誤
Fatal error LNK1181和fatal error U1007 返回值0x49d
有解決方法么
你好,我現(xiàn)在在vs2010c++項目里用gdal打開圖像,自己電腦可以正常打開,換別的電腦就打不開
========
相關鏈接
http://blog.csdn.net/rrrrssss00/article/details/7455478http://www.cnblogs.com/zhangjun1130/archive/2009/11/13/1602340.html
http://malagis.com/win7-vs2010-gdal.html
http://blog.csdn.net/liminlu0314/article/details/7072007
總結
- 上一篇: 数据库并发学习总结
- 下一篇: Java开发语句和代码块模板