GDAL C++开发总结(一)获取影像任一点坐标,对该点坐标进行坐标转换,如投影坐标转换为地理坐标,UTM转WGS84

利用GDAL读取获取影像任一点坐标,并可对该点坐标进行坐标转换,如投影坐标转换为地理坐标,UTM转WGS84

	GDALAllRegister(); //注册所有的驱动;
	GDALDataset *poDataset;   //GDAL数据集;
	char *fileName = "D:\\1.tif";
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");	// 支持中文路径;
	poDataset = (GDALDataset *)GDALOpen(fileName, GA_ReadOnly); //读取影像;
	if (poDataset == NULL)//为空时表示读取失败;
	{
    
    
		cout << "fail in open files!!!" << endl;
		return 0;
	}
	//获取图像的尺寸;
	int imageWidth = poDataset->GetRasterXSize();
	int imageHeight = poDataset->GetRasterYSize();
	int bandcount = poDataset->GetRasterCount();	// 获取波段数;

	//获取坐标变换系数;
	//adfGeoTransform[6]  数组adfGeoTransform保存的是仿射变换中的一些参数,分别含义见下
	//adfGeoTransform[0]  左上角x坐标 
	//adfGeoTransform[1]  东西方向分辨率
	//adfGeoTransform[2]  旋转角度, 0表示图像 "北方朝上"
	//adfGeoTransform[3]  左上角y坐标 
	//adfGeoTransform[4]  旋转角度, 0表示图像 "北方朝上"
	//adfGeoTransform[5]  南北方向分辨率
	double adfGeoTransform[6];
	CPLErr aaa = poDataset->GetGeoTransform(adfGeoTransform);

	const char* PrjRef = poDataset->GetProjectionRef();//获取影像投影信息;
	OGRSpatialReference projSRS;
	projSRS.importFromWkt(&PrjRef);
	
	double CenterX = 0.0;
	double CenterY = 0.0;
	// OGRSpatialReference::IsProjected()和OGRSpatialReference::IsGeographic()判断是地理坐标系统还是投影坐标系统;
	if (projSRS.IsGeographic())
	{
    
    
		//获取中心点坐标,亦可修改获取任意点坐标;
		CenterX = adfGeoTransform[0] + imageWidth * 0.5 * adfGeoTransform[1] + imageWidth * 0.5 * adfGeoTransform[2];
		CenterY = adfGeoTransform[3] + imageHeight * 0.5 * adfGeoTransform[4] + imageHeight * 0.5 * adfGeoTransform[5];
	}
	else if(projSRS.IsProjected())
	{
    
    
		CenterX = adfGeoTransform[0] + imageWidth * 0.5 * adfGeoTransform[1] + imageWidth * 0.5 * adfGeoTransform[2];
		CenterY = adfGeoTransform[3] + imageHeight * 0.5 * adfGeoTransform[4] + imageHeight * 0.5 * adfGeoTransform[5];
		
		OGRSpatialReference geoSRS;
		geoSRS = *projSRS.CloneGeogCS();//获取当前投影坐标系对应的地理坐标系信息,作为坐标转换中的目标坐标系信息;
		//初始化坐标转换转化类,投影坐标转地理坐标;
		OGRCoordinateTransformation *coord = OGRCreateCoordinateTransformation(&projSRS, &geoSRS);

		coord->Transform(1, &CenterX , &CenterY); //部分GDAL版本坐标转换会出错;
		
	}
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");	// 用完之后关闭支持中文路径,否则可能导致其他功能不识别中文;

猜你喜欢

转载自blog.csdn.net/DustDawn/article/details/123730006
今日推荐