<span style="white-space: pre;">
</span><strong><span style="font-size:14px;">近期在开发一个遥感地图的云采样软件,正好为南航一位同学写了一个小文档解释怎么使用GDAL读取文件,现在贴一下。</span></strong>
//使用GDAL时,只需要包含头文件
//包含目录库目录配置好,在链接器->输入->附加依赖项里添加“gdal_i.lib”
//把bin里的dll文件放入程序运行目录下
#include "gdal_priv.h"
//tif文件读取
std::string name = “H:/test/xxx.TIF”;
const char *charName = name.c_str();
//注册
GDALAllRegister();
//以防中文名不能正常读取
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
GDALDataset *m_pDataset = (GDALDataset*)GDALOpen(charName, GA_ReadOnly);
if (m_pDataset[i] == NULL)
{
QMessageBox::information(this,tr("提示"), tr("指定的文件不能打开!"));
return;
}
//获取第1波段的波段指针,参数就是表示第几波段的意思
GDALRasterBand *pBand =m_pDataset->GetRasterBand(1);
//获取数据宽度和高度,(带黑框的大图的)
int dataWidth = m_pDataset[i]->GetRasterXSize();
int dataHeight = m_pDataset[i]->GetRasterYSize();
//比例系数
int dScale = dataHeight/m_size;
//缓存大小
int bufHeight = dataHeight/dScale;
int bufWidth = dataWidth/dScale;
unsigned char* m_data = new unsigned char[bufHeight*bufWidth];
//读取数据
CPLErr err = pBand->RasterIO(GF_Read,0, 0, dataWidth, dataHeight, m_data, bufWidth, bufHeight, GDT_Byte, 0, 0);
//RasterIO函数用法参考这个网址http://blog.csdn.net/liminlu0314/article/details/7072224
//合成就是每个波段数据读出之后分别放入rgb对应位置
//我的代码是Qt的,你可以转换成你显示的相关函数
QImage QImg(bufWidth, bufHeight, QImage::Format_RGB32);
QRgb value;
for (int i = 0; i < bufWidth; i++)
{
for (int j = 0; j < bufHeight; j++)
{
value = qRgb(m_data[2][j*bufWidth+i], m_data[1][j*bufWidth+i], m_data[0][j*bufWidth+i]);
QImg.setPixel(i, j, value);
}
}
//关于经纬度的读取,就是读取大图像四个角的经纬度
//算出长和宽方向上的经纬度间隔,然后算出长和宽方向上每个像素点的经纬度数
//基于大图像的四个角中的合适点,根据点的相对像素移动,计算出该点经纬度
float longGap = m_commonInfo->dataUpperRightLong - m_commonInfo->dataLowerLeftLong;
float latGap = m_commonInfo->dataUpperLeftLat - m_commonInfo->dataLowerRightLat;
float longitude = m_commonInfo->productLowerLeftLong + (sample->x - m_commonInfo->dataLowerLeft_x)*longGap/dataWidth;
float latitude = m_commonInfo->productLowerRightLat + (sample->y - m_commonInfo->dataLowerRight_y)*latGap/dataHeight;