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

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

[cpp]  view plain copy
  1. char* szFileName = "K:\\各省市地图\\新建文件夹 (2)\\fuzhoucity.tif";  
  2.     GDALDataset *poDataset;   //GDAL数据集  
  3.     GDALAllRegister();  
  4.   
  5.     poDataset = (GDALDataset*)GDALOpen(szFileName,GA_ReadOnly);  
  6.     if( poDataset == NULL )  
  7.     {  
  8.         AfxMessageBox(_T("文件打开失败!!!"));  
  9.         return;  
  10.     }   
  11.   
  12.     GDALRasterBand *poBand1;   //遥感的一个波段  
  13.     GDALRasterBand *poBand2;  
  14.     GDALRasterBand *poBand3;  
  15.     int nBandCount = poDataset->GetRasterCount();  
  16.     poBand1 = poDataset->GetRasterBand(1);  
  17.     poBand2 = poDataset->GetRasterBand(2);  
  18.     poBand3 = poDataset->GetRasterBand(3);  
  19.   
  20.   
  21.   
  22.     //获得图像显示窗口的尺寸  
  23.     GetClientRect(&m_ViewRect);  
  24.   
  25.     int nImgSizeX = poDataset->GetRasterXSize();  
  26.     int nImgSizeY = poDataset->GetRasterYSize();  
  27.   
  28.     //获得仿射变换的系数  
  29.     double adfGeoTransform[6];  
  30.     poDataset->GetGeoTransform( adfGeoTransform );  
  31.   
  32.     double right  = adfGeoTransform[0] + nImgSizeX*adfGeoTransform[1];  
  33.     double bottom  = adfGeoTransform[3] + nImgSizeY*adfGeoTransform[5];  
  34.   
  35.     int nBufferSizeX,nBufferSizeY;  
  36.   
  37.     nBufferSizeX = nImgSizeX;  
  38.     nBufferSizeY = nImgSizeY;  
  39.   
  40.     int nScrrenWidth = m_ViewRect.Width();  
  41.     int nScrrenHeight= m_ViewRect.Height();  
  42.   
  43.     //为数据缓冲区分配内存  
  44.     BYTE *pafScanblock1,*pafScanblock2,*pafScanblock3,*TempLock1,*TempLock2,*TempLock3;  
  45.     pafScanblock1 = (BYTE *) CPLMalloc((nScrrenWidth)*(nScrrenHeight));  
  46.     pafScanblock2 = (BYTE *) CPLMalloc((nScrrenWidth)*(nScrrenHeight));  
  47.     pafScanblock3 = (BYTE *) CPLMalloc((nScrrenWidth)*(nScrrenHeight));  
  48.     TempLock1 = pafScanblock1;  
  49.     TempLock2 = pafScanblock2;  
  50.     TempLock3 = pafScanblock3;  
  51.   
  52.     //读取数据  
  53.     poBand1->RasterIO( GF_Read, 0, 0,nBufferSizeX,nBufferSizeY,   
  54.         pafScanblock1,nScrrenWidth,nScrrenHeight, GDT_Byte,0, 0 );  
  55.     poBand2->RasterIO( GF_Read, 0, 0,nBufferSizeX,nBufferSizeY,   
  56.         pafScanblock2,nScrrenWidth,nScrrenHeight, GDT_Byte,0, 0 );  
  57.     poBand3->RasterIO( GF_Read, 0, 0,nBufferSizeX,nBufferSizeY,   
  58.         pafScanblock3,nScrrenWidth,nScrrenHeight, GDT_Byte,0, 0 );  
  59.   
  60.   
  61.   
  62.     //在View逐点显示图像  
  63.     DWORD dwBytes = (nScrrenWidth * 24) / 8;  
  64.     while(((DWORD) dwBytes) % 4)   
  65.     {  
  66.         dwBytes++;  
  67.     }  
  68.   
  69.     BYTE *szBuffer = new BYTE[nScrrenHeight*dwBytes];  
  70.     memset(szBuffer,0,nScrrenHeight*dwBytes);  
  71.     BYTE *pTemp = szBuffer;  
  72.     CClientDC dc(this);  
  73.     int nIndex = 0;  
  74.     for (int i=0;i<nScrrenHeight;i++)  
  75.     {  
  76.         for (int j=0;j<nScrrenWidth;j++)  
  77.         {  
  78.   
  79.             BYTE dn1 = *pafScanblock1;  
  80.             BYTE dn2 = *pafScanblock2;  
  81.             BYTE dn3 = *pafScanblock3;  
  82.   
  83.             //先绘制到内存DC中,而后再绘制到设备DC中  
  84.             dcMem.SetPixel(j,i,RGB(dn1,dn2,dn3)); //显示像素值  
  85.   
  86.             pafScanblock1 ++;  
  87.             pafScanblock2 ++;  
  88.             pafScanblock3 ++;  
  89.   
  90.         }  
  91.   
  92.         szBuffer = pTemp+dwBytes*i;  
  93.   
  94.     }  
  95.   
  96.     pDC->BitBlt(0,0,m_ViewRect.Width(),m_ViewRect.Height(),&dcMem,0,0,  
  97.         SRCCOPY);  
  98.   
  99.     CPLFree(TempLock1);  
  100.     CPLFree(TempLock2);  
  101.     CPLFree(TempLock3);  

 

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


这样显示效果就和ArcGIS打开的一样了。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值