GDAL讀取的座標起點在像素左上角仍是像素中心?

1. 問題

筆者在處理地理柵格數據的時候,老是會發生誤差半個像素的問題。
好比說經過ArcMap打開一張.tif,查看其地理信息;同時用記事本打開.tfw,比較二者得地理信息:

一樣的起點位置(左上角座標),二者卻相差半個像素的距離。
而對於另外一些數據,比較ArcMap與tfw的信息,二者的地理信息又能夠是同樣的。那麼對於地理柵格數據,其起點位置(左上角座標)是以哪種爲準?爲何二者會相差半個像素的距離?code

而GDAL能夠也讀取地理柵格數據(DEM、DOM等)的座標信息:orm

//
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])又應該是哪種呢?blog

2. 結論

通過比較和論證,筆者發現GDAL和ArcMap在處理TIF格式的地理柵格數據的時候,都遵循如下原則:it

  1. GDAL/ArcMap讀取的起點位置都是左上角像素左上角的位置。
  2. TFW裏面存儲的座標起點標識的是左上角像素中心的位置。
  3. 而TIF內部存儲的座標起點標識的是左上角像素左上角的位置。因此二者的地理座標的距離老是差半個像素的距離。
  4. TIF內部能夠不存儲地理信息,此時GDAL/ArcMap會以TFW裏面存儲的起點位置爲準,但由於TFW是像素中心的位置,讀取的起點位置會偏移半個像素的距離。
  5. 一旦TIF內部能夠存儲地理信息,此時GDAL/ArcMap會以TIF內部能夠存儲地理爲準。此時TFW文件就不起做用了。

3. 例外

GDAL和ArcMap都沒有區分處理的地理柵格數據是DEM(地形)仍是DOM(影像),其實對於地形柵格數據,不少時候會把起點位置處理成左上角像素中心的位置。好比說軟件GlobalMapper中,打開TIF的時候會詢問是將其做爲DEM處理仍是DOM處理。看成爲DEM處理的時候,其他的原則同樣,可是讀取的起點就是左上角像素中心的位置了。io

相關文章
相關標籤/搜索