阿里巴巴電子商務(wù)網(wǎng)站專業(yè)營銷策劃團(tuán)隊
C/C++使用GDAL庫編程竅門之——通用可移植性庫(Common Portability Library, CPL)
CPL簡介
GDAL全稱地理空間數(shù)據(jù)抽象庫(Geospatial Data Abstraction Library),是一個強(qiáng)大的地理柵格空間數(shù)據(jù)轉(zhuǎn)換庫,支持眾多的柵格和矢量的地理空間數(shù)據(jù)格式,跨平臺性好、提供C/C++、python等語言的API,簡單易用。
CPL(Common Portability Library),即通用可移植性庫,是GDAL的組件之一,用于增強(qiáng)GDAL的可移植性。用戶只需調(diào)用其中的函數(shù)而不需要針對不同平臺去更改代碼,例如創(chuàng)建文件夾、獲取當(dāng)前程序運行路徑等。
常用功能總結(jié)
在代碼中包含了gdal_priv.h
和gdal_utils.h
之后即可使用CPL大多數(shù)的函數(shù):
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");/// 默認(rèn)文件名字符串的編碼是UTF-8不支持中文路徑,設(shè)置此行代碼后支持中文路徑
char strDir[256];
CPLGetExecPath(strDir, 256);// 獲取當(dāng)前exe全路徑
const char* path = CPLGetPath(strDir);// 從輸入字符串提取(文件夾)路徑,xxx\yyy.tif提取為xxx
string strInputImg;
cin>>strInputImg;
const char* pExtIn = CPLGetExtension(strInputImg.c_str());// 獲取文件擴(kuò)展名,不帶'.'.
char strOutDir[256];
strcpy(strOutDir, "E:/new_dir/new_subdir");
VSIMkdirRecursive(strOutDir, 0755);// 遞歸地創(chuàng)建文件夾,即如果父文件夾不存在,亦創(chuàng)建之。第二個參數(shù)是文件夾訪問權(quán)限,默認(rèn)給0755即可。
VSIStatBufL stat;
if (VSIStatExL(strInputImg, &stat, VSI_STAT_EXISTS_FLAG)==-1)//VSIStatExL函數(shù)用于獲取文件的狀態(tài)信息,包括修改時間、文件大小等,獲取失敗時也即文件不存在,返回-1
{return;//如果文件不存在CPLprintf("File %s not exist.", strInputImg.c_str());// CPLprintf用法完全同printf
}
string strOutputImg;
cin>>strOutputImg;
CPLCopyFile(strOutputImg, strInputImg);//拷貝文件 注意第一個參數(shù)是新文件路徑,第二個參數(shù)是原始文件路徑
更多接口,也可查看GDAL庫的include路徑下以cpl_
開頭的多個頭文件,如cpl_conv.h
,cpl_port.h
,cpl_vsi.h
等。
更多用法,請參考中文文檔。
PS: GDAL的功能過于強(qiáng)大,很多東西都需要從文檔學(xué)習(xí)、自己大膽嘗試、問Google。