剛上研一那會就聽師兄說起GDAL,由于當時剛開始用C#開發,所以看著他們編譯了一下GDAL1.5的代碼,試圖用的C#圖像處理的開發中,感覺好繁瑣??!所以雖然一直有心學習一下,但只是粗略的接觸了一些。知道Google earth、ArcGIS都在用。最近再一次學習C++,覺得有必要從新接觸GDAL。查閱了一些資料,發現1.7以后的版本編譯起來并不是那么困難!尤其是應用到C++中的開發中。所以先編譯了一個簡單的應用到學習中。
一、環境準備:
1.VC++2010
2.gdal181源碼
首先使用VisualStudio2010 IDE編譯,但是在C:\warmerda\bld盤只安裝了bin、data、html三個文件夾,所以在測試開發的時候找不到include和lib文件夾。
決定使用cmd命令行編譯,首先在“開始菜單\所有程序\Microsoft Visual Studio 2010\Visual Studio Tools\ Visual Studio 2010命令提示”
使用cd命令,切換到GDAL的源代碼目錄, 依次敲入 下面的命令行后回車,等待編譯結束即可。
nmake -f makefile.vc
nmake -f makefile.vc install
nmake -f makefile.vc devinstall
同時還有其他的命令,如:
nmake -f makefile.vc clean nmake -f makefile.vc MSVC_VER=1600clean nmake -f makefile.vc MSVC_VER=1600DEBUG=
1
上面六行的命令含義依次是:
1
編譯GDAL庫
2
編譯GDAL庫,并安裝(這里安裝的意思就是將生成的dll,
exe等文件拷貝到C:
\warmerda\bld目錄),
3
編譯GDAL庫,并安裝開發者模式(安裝的意思同上,
開發者模式意思是將開發用的include文件夾中的頭文件和lib文件一同拷貝到
C:
\warmerda\bld目錄,
此時會在C:
\warmerda\bld目錄中多出來兩個文件夾,分別是include和lib,分別存放的是GDAL的頭文件和lib文件,用于調用GDAL庫使用)。
4
清理GDAL庫,同時會刪除編譯GDAL庫所生成的臨時文件,作用相當于在VS環境中的清理命令。
5
作用同上,但是添加了一個MSVC_VER=
1600
,表示使用VS2010編譯。
6
編譯GDAL庫的debug模式,可以用來調試GDAL源碼。
這樣再C:\warmerda\bld盤只安裝了bin、data、html、include、lib共5個文件夾。這樣簡單的開發用到的項目基本全了。
( 參考:http://www.cnblogs.com/bigbigtree/archive/2011/11/20/2256434.html ?該文章寫的很好,特別推薦,只是配圖沒有了?。?
二、測試開發
1.新建一個win32項目命名為readimg
2.配置項目【屬性】
【C/C++】-【常規】,右側的【附加包含目錄】中,選擇GDAL的include文件夾路徑
【鏈接器】-【常規】,右側的【附加庫目錄】中,選擇GDAL的lib文件夾路徑
【鏈接器】-【輸入】,右側的【附加依賴項】中,填寫gdal_i.lib
3.添加頭文件
1
#include
"
cpl_conv.h
"
2
#include
"
gdal_priv.h
"
4.在main中鍵入如下代碼
1
//
注冊文件格式
2
GDALAllRegister();
3
4
const
char
* pszFile =
"
D:\\hsy.img
"
;
5
GDALDataset*
poDataset;
6
//
使用只讀方式打開圖像
7
poDataset = (GDALDataset*
)GDALOpen(pszFile,GA_ReadOnly);
8
if
( poDataset ==
NULL )
9
{
10
printf(
"
File: %s不能打開!\n
"
,pszFile);
11
return
0
;
12
}
13
14
//
輸出圖像的格式信息
15
printf(
"
Driver:%s/%s\n
"
,
16
poDataset->GetDriver()->
GetDescription(),
17
poDataset->GetDriver()->
GetMetadataItem( GDAL_DMD_LONGNAME) );
18
19
//
輸出圖像的大小和波段個數
20
printf(
"
Size is%dx%dx%d\n
"
,
21
poDataset->GetRasterXSize(),poDataset->
GetRasterYSize(),
22
poDataset->
GetRasterCount());
23
24
//
輸出圖像的投影信息
25
if
( poDataset->GetProjectionRef() !=
NULL )
26
printf(
"
Projectionis `%s'\n
"
, poDataset->
GetProjectionRef() );
27
28
//
輸出圖像的坐標和分辨率信息
29
double
adfGeoTransform[
6
];
30
if
( poDataset->GetGeoTransform( adfGeoTransform) ==
CE_None )
31
{
32
printf(
"
Origin =(%.6f,%.6f)\n
"
,
33
adfGeoTransform[
0
], adfGeoTransform[
3
]);
34
35
printf(
"
PixelSize = (%.6f,%.6f)\n
"
,
36
adfGeoTransform[
1
], adfGeoTransform[
5
]);
37
}
38
char
a;
39
std::cin>>a;
運行結果:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
