目录
1. 问题
2. 结论
3. 例外
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 处理的时候, 其余的原则一样, 但是读取的起点就是左上角像素中心的位置了.
来源: https://www.cnblogs.com/charlee44/p/10424005.html