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處理的時候,其余的原則一樣,但是讀取的起點就是左上角像素中心的位置了。