GDAL遥感影像读取与显示-vc环境

GDAL是一个读写栅格和矢量空间数据的库,在GIS行业中有着巨大的应用,遥感影像是我们的空间数据的一种重要的类型,下面就给出遥感数据读取与显示的具体代码:

char* szFileName = "K:\\各省市地图\\新建文件夹 (2)\\fuzhoucity.tif";
	GDALDataset *poDataset;   //GDAL数据集
	GDALAllRegister();

	poDataset = (GDALDataset*)GDALOpen(szFileName,GA_ReadOnly);
	if( poDataset == NULL )
	{
		AfxMessageBox(_T("文件打开失败!!!"));
		return;
	} 

	GDALRasterBand *poBand1;   //遥感的一个波段
	GDALRasterBand *poBand2;
	GDALRasterBand *poBand3;
	int nBandCount = poDataset->GetRasterCount();
	poBand1 = poDataset->GetRasterBand(1);
	poBand2 = poDataset->GetRasterBand(2);
	poBand3 = poDataset->GetRasterBand(3);



	//获得图像显示窗口的尺寸
	GetClientRect(&m_ViewRect);

	int nImgSizeX = poDataset->GetRasterXSize();
	int nImgSizeY = poDataset->GetRasterYSize();

	//获得仿射变换的系数
	double adfGeoTransform[6];
	poDataset->GetGeoTransform( adfGeoTransform );

	double right  = adfGeoTransform[0] + nImgSizeX*adfGeoTransform[1];
	double bottom  = adfGeoTransform[3] + nImgSizeY*adfGeoTransform[5];

	int nBufferSizeX,nBufferSizeY;

	nBufferSizeX = nImgSizeX;
	nBufferSizeY = nImgSizeY;

	int nScrrenWidth = m_ViewRect.Width();
	int nScrrenHeight= m_ViewRect.Height();

	//为数据缓冲区分配内存
	BYTE *pafScanblock1,*pafScanblock2,*pafScanblock3,*TempLock1,*TempLock2,*TempLock3;
	pafScanblock1 = (BYTE *) CPLMalloc((nScrrenWidth)*(nScrrenHeight));
	pafScanblock2 = (BYTE *) CPLMalloc((nScrrenWidth)*(nScrrenHeight));
	pafScanblock3 = (BYTE *) CPLMalloc((nScrrenWidth)*(nScrrenHeight));
	TempLock1 = pafScanblock1;
	TempLock2 = pafScanblock2;
	TempLock3 = pafScanblock3;

	//读取数据
	poBand1->RasterIO( GF_Read, 0, 0,nBufferSizeX,nBufferSizeY, 
		pafScanblock1,nScrrenWidth,nScrrenHeight, GDT_Byte,0, 0 );
	poBand2->RasterIO( GF_Read, 0, 0,nBufferSizeX,nBufferSizeY, 
		pafScanblock2,nScrrenWidth,nScrrenHeight, GDT_Byte,0, 0 );
	poBand3->RasterIO( GF_Read, 0, 0,nBufferSizeX,nBufferSizeY, 
		pafScanblock3,nScrrenWidth,nScrrenHeight, GDT_Byte,0, 0 );



	//在View逐点显示图像
	DWORD dwBytes = (nScrrenWidth * 24) / 8;
	while(((DWORD) dwBytes) % 4) 
	{
		dwBytes++;
	}

	BYTE *szBuffer = new BYTE[nScrrenHeight*dwBytes];
	memset(szBuffer,0,nScrrenHeight*dwBytes);
	BYTE *pTemp = szBuffer;
	CClientDC dc(this);
	int nIndex = 0;
	for (int i=0;i<nScrrenHeight;i++)
	{
		for (int j=0;j<nScrrenWidth;j++)
		{

			BYTE dn1 = *pafScanblock1;
			BYTE dn2 = *pafScanblock2;
			BYTE dn3 = *pafScanblock3;

			//先绘制到内存DC中,而后再绘制到设备DC中
			dcMem.SetPixel(j,i,RGB(dn1,dn2,dn3)); //显示像素值

			pafScanblock1 ++;
			pafScanblock2 ++;
			pafScanblock3 ++;

		}

		szBuffer = pTemp+dwBytes*i;

	}

	pDC->BitBlt(0,0,m_ViewRect.Width(),m_ViewRect.Height(),&dcMem,0,0,
		SRCCOPY);

	CPLFree(TempLock1);
	CPLFree(TempLock2);
	CPLFree(TempLock3);

 

下面是遥感影像显示的效果:


这样显示效果就和ArcGIS打开的一样了。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值