影像地理坐标获取以及坐标系之间的坐标转换
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");//支持中文路径!
///读入输入影像
const char * pszFile = imgfile.c_str();
GDALDataset *poDataset = (GDALDataset*)GDALOpen(pszFile, GA_ReadOnly);//使用只读方式打开图像
if (poDataset == NULL)
{
printf("File: %s不能打开!\n", pszFile);
}
GDALRasterBand *pBand_temp = NULL;
pBand_temp = poDataset->GetRasterBand(1);
///获取四角点经纬度
double adfGeoTransform[6];
if (poDataset->GetGeoTransform(adfGeoTransform) == CE_Failure)
{
printf("获取仿射变换参数失败");
}
std::cout << "仿射变换参数:" << endl << adfGeoTransform[0] << endl << adfGeoTransform[1] << endl << adfGeoTransform[2] << endl << adfGeoTransform[3] << endl << adfGeoTransform[4] << endl << adfGeoTransform[5] << endl;
double X1 = adfGeoTransform[0] ;//经度
double Y1 = adfGeoTransform[3];//纬度
double X2 = adfGeoTransform[0] + iw * adfGeoTransform[1];
double Y2 = adfGeoTransform[3];
double X3 = adfGeoTransform[0] + iw * adfGeoTransform[1];
double Y3 = adfGeoTransform[3] + ih * adfGeoTransform[5];
double X4 = adfGeoTransform[0];
double Y4 = adfGeoTransform[3] + ih * adfGeoTransform[5];
/输出影像四个角点的地理坐标
std::cout << Y1 << endl << X1 << endl;
std::cout << Y2 << endl << X2 << endl;
std::cout << Y3 << endl << X3 << endl;
std::cout << Y4 << endl << X4 << endl;
double X[4] = { X1, X2, X3 ,X4};
double Y[4] = { Y1, Y2, Y3, Y4};
int* flag = NULL;
///若坐标系为非GWS84,则进行空间坐标系转化
OGRSpatialReference obj_OSRS;
obj_OSRS.SetWellKnownGeogCS("WGS84");
const char* spr=poDataset->GetProjectionRef();
OGRSpatialReference OSRS(spr);
if (obj_OSRS.IsSame(&OSRS) == TRUE)
{
std::cout << "数据为GWS84地理坐标系统" << std::endl;
///地理边界
dataxml.topleft_latitude = Y1;
dataxml.topleft_longitude = X1;
dataxml.topright_latitude = Y2;
dataxml.topright_longitude = X2;
dataxml.bottomright_latitude = Y3;
dataxml.bottomright_longitude = X3;
dataxml.bottomleft_latitude = Y4;
dataxml.bottomleft_longitude = X4;
}
else
{
OGRCoordinateTransformation *transf1=OGRCreateCoordinateTransformation(&OSRS, &obj_OSRS);
if (transf1 == NULL)
{
std::cout << "数据不支持转化" << std::endl;
}
else
{
std::cout << "支持坐标系统之间转化" << std::endl;
}
transf1->TransformEx(4, X, Y, NULL, flag);
///地理边界
dataxml.topleft_latitude = Y[0];
dataxml.topleft_longitude = X[0];
dataxml.topright_latitude = Y[1];
dataxml.topright_longitude = X[1];
dataxml.bottomright_latitude = Y[2];
dataxml.bottomright_longitude = X[2];
dataxml.bottomleft_latitude = Y[3];
dataxml.bottomleft_longitude = X[3];
OGRCoordinateTransformation::DestroyCT(transf1);
}
/*if (OSRS.IsGeographic() == TRUE)
{
cout << "镶嵌数据为地理坐标系统" << endl;
}
if (OSRS.IsProjected()==TRUE)
{
cout << "镶嵌数据为投影坐标系统" << endl;
}*/
/*std::string srs_txt = srcdata + "\\" + dataname + ".txt";
ofstream out_sr(srs_txt);
out_sr << spr;
out_sr.close();*/
/*OGRSpatialReference::DestroySpatialReference(&obj_OSRS);
OGRSpatialReference::DestroySpatialReference(&OSRS);*/
/输出影像四个角点的地理坐标
std::cout << Y[0] << endl << X[0] << endl;
std::cout << Y[1] << endl << X[1] << endl;
std::cout << Y[2] << endl << X[2] << endl;
std::cout << Y[3] << endl << X[3] << endl;