2020-12-13

 

关于C++操作GDAL读写数据的代码

#include "stdafx.h"
#include "fangshibo.h"

#include <vector>


#include<math.h>
///gdal头文件
#include "..\include\gdal.h"
#include "..\include\gdal_priv.h"
#include "..\include\ogr_srs_api.h"
#include "..\include\cpl_string.h"
#include "..\include\cpl_conv.h"
#pragma comment (lib,"..\lib\gdal_i.lib")
/


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// The one and only application object

CWinApp theApp;
using namespace std;

///
void  MaxNDVI(vector<CString> files,CString maxNDVfile)
{  
//    GDALAllRegister();
   vector<GDALDataset *> datasets;  
       //打开文件
       for(int i=0;i<files.size();i++)
       {  
           CString filename=files[i];          
           GDALDataset *tmpDataset = (GDALDataset *) GDALOpen( files[i], GA_ReadOnly);
           if(tmpDataset!=NULL)
           {              
               datasets.push_back(tmpDataset);              
           }
           else
           {
               fprintf( stderr, "GDALOpen failed - %dn%sn", CPLGetLastErrorNo(), CPLGetLastErrorMsg() );
           }  
           tmpDataset=NULL;//以后再释放
       }
       读取数据咯,按行来读取
       //GDALDir
       if(datasets.size()==0)return;
       GDALDataset *tmpDataset=datasets[0];
       if(tmpDataset!=NULL)
       {  
           GDALDriver * driver=NULL;
           int index = maxNDVfile.ReverseFind('.');
           if (index < 0)
               return ;
           if (index == maxNDVfile.GetLength()-1)
               return ;
           CString suffix = maxNDVfile.Right(maxNDVfile.GetLength()-1-index);          
           suffix.MakeLower();
           if (suffix == "bmp")
               driver = GetGDALDriverManager()->GetDriverByName("BMP");
           else if (suffix == "jpg")
               driver = GetGDALDriverManager()->GetDriverByName("JPEG");
           else if (suffix == "tif")
               driver = GetGDALDriverManager()->GetDriverByName("GTiff");
           else if (suffix == "img")
               driver = GetGDALDriverManager()->GetDriverByName("HFA");
           else if (suffix == "bt")
               driver = GetGDALDriverManager()->GetDriverByName("BT");
           else if (suffix == "ecw")
               driver = GetGDALDriverManager()->GetDriverByName("ECW");
           else if (suffix == "fits")
               driver = GetGDALDriverManager()->GetDriverByName("FITS");
           else if (suffix == "gif")
               driver = GetGDALDriverManager()->GetDriverByName("GIF");
           else if (suffix == "hdf")
               driver = GetGDALDriverManager()->GetDriverByName("HDF4");
           else if (suffix == "hdr")
               driver = GetGDALDriverManager()->GetDriverByName("EHdr");
         
 
           int w=tmpDataset->GetRasterXSize();
           int h=tmpDataset->GetRasterYSize();          
           GDALDataset *maxNDV=driver->Create(maxNDVfile,w,h,1,GDT_Float32,NULL);      
           int xOff=0;
           int yOff=0;
           int width=w;
           int height=1;//一行一行地读取
           vector<float*> bufs;
           for(int i=0;i<datasets.size();i++)
           {
               float *buf=new float[width*height];
               bufs.push_back(buf);
               buf=NULL;
           }      
           float *newbuf=new float[width*height];
           GDALRasterBand * newpoband=maxNDV->GetRasterBand(1);      
           for(int j=0;j<h;j++)
           {              
               for(int i=0;i<datasets.size();i++)
               {
                   GDALDataset *tmpDt=datasets[i];
                   GDALRasterBand * poband=tmpDt->GetRasterBand(1);              
                   float *buf=bufs[i];
                   xOff=0;
                   yOff=j;
                   poband->RasterIO(GF_Read,xOff,yOff,width,height,buf,width,height,GDT_Float32,0,0);
                   buf=NULL;
                   tmpDt=NULL;//在后面再释放,因为很多个指针指向同一一段内存,不能随便释放内存哦
               }          
               //
               //在这可以开始运算咯
               for(int k=0;k<w;k++)//对于每个像元
               {
                   //下面这段代码以后要支持均值,极差,方差
                   for(int kk=0;kk<bufs.size();kk++)
                   {
                       float *buf=bufs[kk];
                       if(kk==0)//初始化
                       {
                           newbuf[k]=buf[k];
                       }
                       if(buf[k]>newbuf[k])//最大的,稍微改下就是最小值,
                       {
                           newbuf[k]=buf[k];
                       }                  
                   }
               }
               //写入数据
               newpoband->RasterIO(GF_Write,xOff,yOff,width,height,newbuf,width,height,GDT_Float32,0,0);
           }
           delete newbuf;
           newbuf=NULL;
           for( i=0;i<bufs.size();i++)
           {
               if(bufs[i]!=NULL)
                   delete bufs[i];          
           }
           bufs.resize(0);



转载本文请联系原作者获取授权,同时请注明本文来自林清莹科学网博客。
链接地址:http://wap.sciencenet.cn/blog-3134052-1049416.html
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值