欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VS2015 GDAL c++ 开发——栅格读写

程序员文章站 2022-03-20 13:30:38
...

栅格处理需要引入的头文件是 gdal_priv.h

读取栅格文件

  1. 打开文件 GDALOpen(文件路径,打开权限)
    权限有 GA_ReadOnly 只读,GA_Update 理解为读写。
    返回对象需要强转为一个GDALDataset 指针。
    GDALDataset * ds = (GDALDataset *)GDALOpen("a.tif",GA_Update);
  2. 打开后对栅格进行操作
    GDALRasterBand * bandn = ds->GetRasterBand(n); 
    n 表示读取第几个波动,这个n是从1开始计数的。
    GDALDataType dataType = pBandR->GetRasterDataType();
    获取波段的类型,有以下几种:
    GDT_Byte、GDT_CFloat32、GDT_CFloat64、
    GDT_CInt16、GDT_CInt32、GDT_Float32、
    GDT_Float64、GDT_Int16、GDT_Int32、
    GDT_UInt16、GDT_UInt32、GDT_Unknown,
    我没理解Cint 和 int Cfloat 和 float 区别何在,就且认为是一样的就好了。
    这里说一句比较重要的话,在win10x64系统中,
    GDT_CInt16/GDT_Int16 我发现等同于 short int,
    GDT_CInt32/GDT_Int32 等同于 int,
    带u的等同为unsigned。
     
    bandn->RasterIO(flag,fx,fy,w,h,buf,bw,bh,type,xsp,ysp);
    flag表示读 GF_Read 还是写 GF_Write
    fx,fy,w,h 表示从那个位置开始读,读的横向大小w,纵向大小h
    buf 是个指针,表示从读取到该指针中,或从该指针中读取数据写入波段。
    bw,bh 指 buf 的缓冲区大小
    type 是数据类型,有GDT_Byte ....
    xsp,ysp 表示读取的下一列下一行偏移,默认是0,即一个一个挨着读取
    如果设置为 xsp=1 ysp=0,表示每隔一列取一次
    例如数据(1,2,3,4) 取 (1,3)
    获取transform
    double transform[6]; firstDataset->GetGeoTransform(transform);
    获取列数和行数
    bandn->GetYSize() bandn->GetXSize()

    创建栅格文件 

    GDALDriver * pDriver = GetGDALDriverManager()->GetDriverByName(format);

     

  3. 创建一个驱动器用来创建栅格文件
    format 可以是BMP、JPEG、GTiff、HFA、BT、ECW、FITS、GIF
    我对此不是很熟悉,就用GTiff 做试验就好了
    2.通过驱动器创建栅格文件

    GDALDataset * ds = pDriver->Create(path,nCol,nRow,bandCount,type,option) 

    path 是文件路径 
    nCol nRow bandCount 表示该栅格的长宽和层数
    type 是类型有 GDT_Byte ...
    option 我不清楚,设置为 NULL 即可

  4. 接下来可以设置投影和 transform
    【注】:就 extent 和 transform 的区别,单独个人理解是两者是通用的,extent 记录了栅格数据的上下左右四个数值,transform 记录了栅格的左上角坐标(x,y)和像元大小以(xw,yw)及方向(d1,d2) [x,xw,d1,y,yw,d2]

    ds->SetGeoTransform(transform); 

     

  5. 对栅格进行写入操作,其实这个步骤和上面的 RasterIO 是一样的

相关标签: GDAL