GDAL讀取的座標起點在畫素左上角還是畫素中心?
1. 問題
筆者在處理地理柵格資料的時候,總是會發生偏差半個畫素的問題。
比如說通過ArcMap開啟一張.tif,檢視其地理資訊;同時用記事本開啟.tfw,比較兩者得地理資訊:

同樣的起點位置(左上角座標),兩者卻相差半個畫素的距離。
而對於另一些資料,比較ArcMap與tfw的資訊,兩者的地理資訊又可以是一樣的。那麼對於地理柵格資料,其起點位置(左上角座標)是以哪一種為準?為什麼兩者會相差半個畫素的距離?
而GDAL可以也讀取地理柵格資料(DEM、DOM等)的座標資訊:
// GDALAllRegister(); CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); // const char * pszFile = "D:\\Data\\imgDemo\\K52E004015AD005M2010A.TIF"; GDALDataset *poDataset = (GDALDataset*)GDALOpen(pszFile, GA_ReadOnly);//使用只讀方式開啟影象 if (!poDataset) { printf("File: %s不能開啟!\n", pszFile); } //獲取地理座標資訊 double padfTransform[6]; if (poDataset->GetGeoTransform(padfTransform) == CE_Failure) { printf("獲取仿射變換引數失敗"); } cout << fixed << "仿射變換引數:" << endl << padfTransform[0] << endl//左上角點座標X << padfTransform[1] << endl//X方向的解析度 << padfTransform[2] << endl//旋轉系數,如果為0,就是標準的正北向影象 << padfTransform[3] << endl//左上角點座標Y << padfTransform[4] << endl//旋轉系數,如果為0,就是標準的正北向影象 << padfTransform[5] << endl;//Y方向的解析度
那麼GDAL讀取座標起點也就是左上角點座標(padfGeoTransform[0],padfGeoTransform[3])又應該是哪一種呢?
2. 結論
經過比較和論證,筆者發現GDAL和ArcMap在處理TIF格式的地理柵格資料的時候,都遵循以下原則:
- GDAL/ArcMap讀取的起點位置都是左上角畫素左上角的位置。
- TFW裡面儲存的座標起點標識的是左上角畫素中心的位置。
- 而TIF內部儲存的座標起點標識的是左上角畫素左上角的位置。所以兩者的地理座標的距離總是差半個畫素的距離。
- TIF內部可以不儲存地理資訊,此時GDAL/ArcMap會以TFW裡面儲存的起點位置為準,但因為TFW是畫素中心的位置,讀取的起點位置會偏移半個畫素的距離。
- 一旦TIF內部可以儲存地理資訊,此時GDAL/ArcMap會以TIF內部可以儲存地理為準。此時TFW檔案就不起作用了。
3. 例外
GDAL和ArcMap都沒有區分處理的地理柵格資料是DEM(地形)還是DOM(影像),其實對於地形柵格資料,很多時候會把起點位置處理成左上角畫素中心的位置。比如說軟體GlobalMapper中,開啟TIF的時候會詢問是將其作為DEM處理還是DOM處理。當作為DEM處理的時候,其餘的原則一樣,但是讀取的起點就是左上角畫素中心的位置了。