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格式的地理柵格數據的時候,都遵循以下原則:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM