1、前言
GDAL庫在2015年6月開始發佈了2.0.0版本,同時與1.x的版本保持同步更新,GDAL2.x的最新版本已經發布到2.2.0(2017年4月發佈),並且1.x的最後發佈的版本是在2016年7月1.11.5,至今再沒有更新(在維護的版本有一個1.11.6,估計只是修改bug的版本)。由此可以看出GDAL庫將來可能只會更新2.x的版本。
GDAL2.x的版本比1.x的版本有更多的算法,更高的效率和更好的組織結構,所以在接口上發生了一定的變化,但是不是很多(否則基於GDAL庫的項目升級代價太大),下面就對發生變化的部分進行總結,便於大家進行升級到2.x。
2、柵格數據讀寫操作
與1.x的接口完全一樣,可以直接將庫更新到2.x直接編譯即可,代碼都不用修改。但是打開圖像增加了GDALOpenEx函數,該函數與之前的GDALOpen類似。
3、矢量數據讀寫操作(注意:下面是重點)
與1.x的接口變化較大,主要在於打開數據和關閉數據。請看下面的代碼:
1.x打開矢量數據代碼如下:
#include "ogrsf_frmts.h"
int main()
{
OGRRegisterAll();
OGRDataSource *poDS;
poDS = OGRSFDriverRegistrar::Open( "point.shp", FALSE );
if( poDS == NULL )
{
printf( "Open failed.\n" );
exit( 1 );
}
OGRLayer *poLayer;
poLayer = poDS->GetLayerByName( "point" );
//中間讀取Feature、FeatureDefn和Geometry等接口沒有任何變化
//關閉數據
OGRDataSource::DestroyDataSource( poDS );
}
2.x打開矢量數據代碼如下:
#include "ogrsf_frmts.h"
int main()
{
GDALAllRegister();
GDALDataset *poDS;
poDS = (GDALDataset*) GDALOpenEx( "point.shp", GDAL_OF_VECTOR, NULL, NULL, NULL );
if( poDS == NULL )
{
printf( "Open failed.\n" );
exit( 1 );
}
OGRLayer *poLayer;
poLayer = poDS->GetLayerByName( "point" );
//中間讀取Feature、FeatureDefn和Geometry等接口沒有任何變化
//關閉數據
GDALClose( poDS );
}
由於GDAL2.x的版本將柵格和矢量訪問接口進行了統一,個人覺得主要原因是爲了更方便的訪問比如PIX、PDF等既可以存圖像又可以存矢量的數據,所以將讀寫矢量數據的接口與讀寫柵格的接口進行了一致。
通過比較可以發現,主要的不同在於以下幾個方面:
序號 | 說明 | 1.x版本 | 2.x版本 |
---|---|---|---|
1 | 註冊函數變化 | OGRRegisterAll() | GDALAllRegister() |
2 | 數據集對象 | OGRDataSource | GDALDataset |
3 | 打開函數 | OGRSFDriverRegistrar::Open() | GDALOpenEx() |
4 | 獲取圖層對象 | OGRDataSource | GDALDatset |
5 | 關閉矢量數據 | OGRDataSource::DestroyDataSource() | GDALClose() |
3、總結
如果在項目中僅僅使用了圖像處理的內容,直接可以升級到2.x的版本,不需要進行任何修改。
如果在項目中用到了矢量數據讀寫的內容,升級的時候只需要將矢量數據打開和關閉的部分進行修改即可。
對於其他語言,如C/C#/Python/Java等,柵格數據接口沒有任何變化,矢量數據接口打開和關閉進行了調整。