????????本文主要是对像素坐标转投影坐标、投影坐标转像素坐标的原理进行介绍及代码上的实现!!!?
一、.tif 影像基本信息介绍
1、影像借本信息
????????上图是我使用 QGIS 打开的一副遥感影像的基本属性,上图中 (CRS)范围中的数据对应着该遥感影像的左上角和右下角坐标;
2、遥感影像左上角、右下角坐标和像素大小、宽度、高度之间的关系
二、投影坐标与像素坐标间的转化原理
1、像素坐标转投影坐标?
2、投影坐标转像素坐标
?
三、代码实现?
1、投影坐标转像素坐标
//获取 .tif 图像的投影信息
void getTfw(const char* path, double* geo)
{
GDALAllRegister();
GDALDataset* podataset = (GDALDataset*)GDALOpen(path, GA_ReadOnly);
//保存 .tif 文件的投影信息' x=geo[0]、y=geo[3]、像素大小=geo[1]
//double oldGeo[6];
podataset->GetGeoTransform(geo);
}
//像素坐标转投影坐标(基本无误差)
void pixelsPoint2ProjectPoint()
{
//vector<Point2d> res; //保存投影坐标
//获取 .tif 文件的投影信息
getTfw(OLDPATH, oldGeo);
//创建保存投影坐标的文件
ofstream ofile(".\\oldProjectPoints.txt");
if (!ofile.is_open())
{
qDebug() << "打开文件失败!" << endl;
return;
}
for (auto it = oldPixelsPoints.begin(); it != oldPixelsPoints.end(); it++)
{
Point2d projectPoint;
projectPoint.x = oldGeo[1] * (*it).x + oldGeo[0];
projectPoint.y = oldGeo[3] - oldGeo[1] * (*it).y;
//保存旧坐标系的投影坐标
oldProjectPoints.append(projectPoint);
//把旧坐标系的投影坐标保存到 .txt 文件中
ofile << setprecision(20) << projectPoint.x << "," << setprecision(20) << projectPoint.y << endl;
}
ofile.close();
}
2、投影坐标转像素坐标
//获取 .tif 图像的投影信息
void getTfw(const char* path, double* geo)
{
GDALAllRegister();
GDALDataset* podataset = (GDALDataset*)GDALOpen(path, GA_ReadOnly);
//保存 .tif 文件的投影信息' x=geo[0]、y=geo[3]、像素大小=geo[1]
//double oldGeo[6];
podataset->GetGeoTransform(geo);
}
//投影坐标转像素坐标(基本无误差)
void projectPoint2PixelsPoint()
{
//vector<Point2d> res; //保存像素坐标
//获取 .tif 文件的投影信息,应转像素时转一次就够了(影像不同或许需要转两次)
//getTfw(NEWPATH, newGeo);
getTfw(OLDPATH, newGeo);
char str[25];
//gcvt(geo[1], 10, str);
//cout << str << endl;
//创建保存投影坐标的文件
ofstream ofile(".\\newPixelsPoints.txt");
if (!ofile.is_open())
{
qDebug() << "打开文件失败!" << endl;
return;
}
for (auto it = newProjectPoints.begin(); it != newProjectPoints.end(); it++)
{
Point2d pixelsPoint;
pixelsPoint.x = ((*it).x - newGeo[0]) / newGeo[1];
pixelsPoint.y = (newGeo[3] - (*it).y) / newGeo[1];
//保存新坐标系的像素坐标
newPixelsPoints.append(pixelsPoint);
ofile << setprecision(20) << pixelsPoint.x << "," << setprecision(20) << pixelsPoint.y << endl;
}
ofile.close();
}
说明:获取 .tif 影像的投影信息请参考:c++ 读取 .tfw 文件数据(读取 .tif 影像中的投影信息)_一米九零小胖子的博客-CSDN博客_tfw文件?
四、测试结果
1、像素坐标?
2、像素坐标转投影坐标结果?
?3、投影坐标转像素坐标结果
由上述转换结果可知,转换误差基本为零!!!?
|