GDAL中影像geotransform参数的含义
获取tif影像中的geotransform
获取、设置geotransform可分别调用GetGeoTransform、SetGeoTransform函数。
参数含义
设geotransform
是包含6个元素的数组,则各个元素的含义如下:
- geotransform[0] : 影像左上角像素左上角位置的x坐标,单位通常为米或°(经纬度)
- geotransform[1] : 一个像素的宽度,单位通常为米或°(经纬度)
- geotransform[2] : 旋转系数,一般为0
- geotransform[3] : 影像左上角像素左上角位置的y坐标,单位通常为米或°(经纬度)
- geotransform[4] : 旋转系数,一般为0
- geotransform[5] : 一个像素的高度(一般为负值),单位通常为米或°(经纬度)
由像方坐标(P,L)计算物方坐标(Xp,Yp),有:
Xp = geotransform[0] + P*geotransform[1] + L*geotransform[2];
Yp = geotransform[3] + P*geotransform[4] + L*geotransform[5];
而要根据geotransform
数组计算.tfw
文件中的六个参数,值分别为:
- geotransform[1] : 一个像素的宽度
- geotransform[4] : 旋转系数,一般为0
- geotransform[2] : 旋转系数,一般为0
- geotransform[5] : 一个像素的高度(一般为负值)
- geotransform[0] + 0.5 * geotransform[1] + 0.5 * geotransform[2] : 影像左上角像素中心x坐标
- geotransform[3] + 0.5 * geotransform[4] + 0.5 * geotransform[5] : 影像左上角像素中心y坐标
写.tfw
文件,可调用GDALWriteWorldFile函数。传入geotransform数组,得到tfw结果。
从tfw六参数到geotransform六参数的转换公式
GDAL提供了GDALLoadWorldFile
函数直接读取tfw生成geotransform数组的功能。该函数的定义如下:
int GDALLoadWorldFile(const char*, double*)
参数
pszFilename – tfw文件路径
padfGeoTransform --六参数数组(double类型)首指针。
返回值:成功返回TRUE,失败返回FALSE
然而某些情况下,用户不愿意调用GDAL的函数,想自己由读取的tfw信息计算geotranform数组。这一节介绍双向转换公式,以供这类读者参考。
首先,我们依然假设任意的tfw文件内容如下:
行号 | 参数含义: |
---|---|
1 | geotransform[1] : 一个像素的宽度 |
2 | geotransform[4] : 旋转系数,一般为0 |
3 | geotransform[2] : 旋转系数,一般为0 |
4 | geotransform[5] : 一个像素的高度(一般为负值) |
5 | geotransform[0] + 0.5 * geotransform[1] + 0.5 * geotransform[2] : 影像左上角像素中心x坐标 |
6 | geotransform[3] + 0.5 * geotransform[4] + 0.5 * geotransform[5] : 影像左上角像素中心y坐标 |
我们将tfw的这六个参数依次记作tfw[0]、tfw[1]、tfw[2]、tfw[3]、tfw[4]、tfw[5];
则有:
{ tfw [ 0 ] = geotransform [ 1 ] tfw [ 1 ] = geotransform [ 4 ] tfw [ 2 ] = geotransform [ 2 ] tfw [ 3 ] = geotransform [ 5 ] tfw [ 4 ] = geotransform [ 0 ] + 0.5 ∗ geotransform [ 1 ] + 0.5 ∗ geotransform [ 2 ] tfw [ 5 ] = geotransform [ 3 ] + 0.5 ∗ geotransform [ 4 ] + 0.5 ∗ geotransform [ 5 ] { geotransform [ 0 ] = tfw [ 4 ] − 0.5 ∗ tfw [ 0 ] − 0.5 ∗ tfw [ 2 ] geotransform [ 1 ] = tfw [ 0 ] geotransform [ 2 ] = tfw [ 2 ] geotransform [ 3 ] = tfw [ 5 ] − 0.5 ∗ tfw [ 1 ] − 0.5 ∗ tfw [ 3 ] geotransform [ 4 ] = tfw [ 1 ] geotransform [ 5 ] = tfw [ 3 ] \begin{aligned} &\begin{cases} \text{tfw}[0]= \text{geotransform}[1] \\ \text{tfw}[1]= \text{geotransform}[4] \\ \text{tfw}[2]= \text{geotransform}[2] \\ \text{tfw}[3]= \text{geotransform}[5] \\ \text{tfw}[4]= \text{geotransform}[0] + 0.5 * \text{geotransform}[1] + 0.5 * \text{geotransform}[2] \\ \text{tfw}[5]= \text{geotransform}[3] + 0.5 * \text{geotransform}[4] + 0.5 * \text{geotransform}[5]\\ \end{cases} \\ &\begin{cases} \text{geotransform}[0] = \text{tfw}[4]-0.5*\text{tfw}[0]-0.5*\text{tfw}[2]\\ \text{geotransform}[1] = \text{tfw}[0]\\ \text{geotransform}[2] = \text{tfw}[2]\\ \text{geotransform}[3] = \text{tfw}[5]-0.5*\text{tfw}[1]-0.5*\text{tfw}[3]\\ \text{geotransform}[4] = \text{tfw}[1]\\ \text{geotransform}[5] = \text{tfw}[3]\\ \end{cases} \end{aligned} ⎩ ⎨ ⎧tfw[0]=geotransform[1]tfw[1]=geotransform[4]tfw[2]=geotransform[2]tfw[3]=geotransform[5]tfw[4]=geotransform[0]+0.5∗geotransform[1]+0.5∗geotransform[2]tfw[5]=geotransform[3]+0.5∗geotransform[4]+0.5∗geotransform[5]⎩ ⎨ ⎧geotransform[0]=tfw[4]−0.5∗tfw[0]−0.5∗tfw[2]geotransform[1]=tfw[0]geotransform[2]=tfw[2]geotransform[3]=tfw[5]−0.5∗tfw[1]−0.5∗tfw[3]geotransform[4]=tfw[1]geotransform[5]=tfw[3]