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);
下面是遥感影像显示的效果:

本文详细介绍了如何利用GDAL库读取和显示遥感影像,包括数据集打开、波段读取、图像尺寸获取、仿射变换系数计算、内存缓冲区分配与数据读取,并在视图中逐点显示图像,最终实现与ArcGIS类似的效果。

957

被折叠的 条评论
为什么被折叠?



