GDAL库常用函数介绍

转自:https://blog.csdn.net/hong__fang/article/details/43529561

本文作用:GDAL常用函数的应用,其中包含图像数据的读取、写入,地理坐标与行列坐标的相互转化,颜色表的读取和设置。

一、图像的读取与写入

  1. //初始化GDAL库注册表

  2. GDALAllRegister();

  3. CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");

  4.  
  5. //打开图像

  6. CString inPath("C:\\Users\\Administrator\\Desktop\\GF1.tif");

  7. GDALDataset * pInDataset = (GDALDataset * )GDALOpen(inPath,GA_ReadOnly);

  8. if(pInDataset==NULL)

  9. {

  10. AfxMessageBox("读取图像失败!");

  11. return FALSE;

  12. }

  13.  
  14. int Width = pInDataset->GetRasterXSize(); //获取图像宽

  15. int Height = pInDataset->GetRasterYSize(); //获取图像高

  16. int Count = pInDataset->GetRasterCount(); //波段数

  17.  
  18. //读取数据

  19. GDALRasterBand *pInRasterBand = pInDataset->GetRasterBand(1);

  20. float *inBuf;

  21. inBuf = new float[Width*Height];

  22. ZeroMemory(inBuf,sizeof(float)*Width*Height);

  23. CPLErr err;

  24. err=pInRasterBand->RasterIO(GF_Read,0,0,Width,Height,inBuf,Width,Height,GDT_Float32,0,0);

  25.  
  26. if(err==CE_Failure)

  27. {

  28. AfxMessageBox("读取输入图像数据失败!");

  29. return FALSE;

  30. }

  31.  
  32.  
  33.  
  34. //创建输出图像、写图像

  35. CString outPath("C:\\Users\\Administrator\\Desktop\\GF1000.tif");

  36. GDALDriver *poDriver =GetGDALDriverManager()->GetDriverByName("GTiff");

  37. if( poDriver==NULL)

  38. {

  39. AfxMessageBox("获取创建输出图像指针poDriver失败!");

  40. return FALSE;

  41. }

  42.  
  43. CString OutFilename = CString(outPath);

  44. OutFilename.TrimRight();

  45. GDALDataset* pOutDataset=poDriver->Create(OutFilename,Width,Height,1,GDT_Float32,NULL);

  46. if(pOutDataset == NULL)

  47. {

  48. AfxMessageBox("create输出图像失败!");

  49. return FALSE;

  50. }

  51. GDALRasterBand* pOutRasterBand = pOutDataset->GetRasterBand(1);

  52.  
  53. err = pOutRasterBand->RasterIO(GF_Write,0,0,Width,Height,inBuf,Width,Height,GDT_Float32,0,0);

  54. if(err==CE_Failure)

  55. {

  56. AfxMessageBox("输出图像写失败!");

  57. return FALSE;

  58. }

  59.  
  60.  
  61. //关闭波段和驱动

  62. GDALClose(pInDataset);

  63. GDALClose(pOutDataset);

  64. GetGDALDriverManager()->DeregisterDriver(poDriver);

  65. GDALDestroyDriverManager();

 

注:

    1.在读取图像时,一定要先初始化注册表,不然打开图像会失败。

    2.写输出图像结束后,要关闭波段和驱动,不然写的图像会打不开。

 

二、获取设置仿射信息以及地理坐标与行列坐标的相互转化

  1. //获取地理放射信息

  2. double dGeoTrans[6] = {0};

  3. pInDataset->GetGeoTransform(dGeoTrans);

  4.  
  5. //设置输出图像仿射信息

  6. pOutDataset->SetGeoTransform(dGeoTrans);

  7. pOutDataset->SetProjection(pInDataset->GetProjectionRef());

  8.  
  9. //像素行列坐标求地理坐标 row:行数 col:列数

  10. double GeoX = dGeoTrans[0] + col * dGeoTrans[1] + row * dGeoTrans[2]; //地理经度

  11. double GeoY = dGeoTrans[3] + col * dGeoTrans[4] + row * dGeoTrans[5]; //地理纬度

  12.  
  13. //由地理坐标求行列坐标,相当于已知GeoX,GeoY求row col 解二元方程即可

  14. //这里提供一组解法

  15. double temp = dGeoTrans[1]*dGeoTrans[5] - dGeoTrans[2]*dGeoTrans[4];

  16. col = int(((GeoX-dGeoTrans[0])*dGeoTrans[5] - (GeoY-dGeoTrans[3])*dGeoTrans[2])/temp); //列数

  17. row = int(((GeoY-dGeoTrans[3])*dGeoTrans[1] - (GeoX-dGeoTrans[0])*dGeoTrans[4])/temp); //行数

 

三、获取颜色表设置颜色表

  1. //获取颜色表,设置颜色表

  2. GDALColorTable * pColorTable;//颜色表

  3. GDALColorEntry * pColorEntry;//颜色组

  4. pColorTable =new GDALColorTable ;//

  5. pColorEntry = new GDALColorEntry[256];

  6. for(int i=0; i<256; i++)

  7. {

  8.  
  9. pColorEntry[i].c1 = 255; //设置颜色值

  10. pColorEntry[i].c2 = 255;

  11. pColorEntry[i].c3 = 255;

  12. pColorEntry[i].c4 = 0;

  13.  
  14. pColorTable->SetColorEntry(i,pColorEntry+i);

  15. }

  16.  
  17. err = pOutRasterBand->SetColorTable(pColorTable); //给输出图像设置颜色表

  18. if(err != CE_None)

  19. {

  20. AfxMessageBox("写颜色表失败!");

  21. return FALSE;

  22. }

  23.  
  24. delete pColorEntry;

  25. delete pColorTable;

四、统计波段中的最大最小值

  1. <1> virtual double GetMinimum (int *pbSuccess=NULL)

  2. virtual double GetMaximum (int *pbSuccess=NULL)

  3. /*********************************************

  4. 功能:统计波段中的最大或最小值

  5. 参数说明: pbSuccess:用来指示说明统计结果是否为真实最大最小

  6. 如果是,则为1,否则为NULL

  7. 返回值: 返回统计得到的最大或最小值

  8. **********************************************/

  9. eg:

  10. int pSuccess;

  11. double minval, maxval;

  12. minval = pBand->GetMinimum(&pSuccess);

  13. maxval = pBand->GetMaximum(&pSuccess);

  14.  
  15. <2> CPLErr GDALRasterBand::ComputeRasterMinMax(int bApproxOK, double *pdfMinMax)

  16. /*********************************************

  17. 功能:统计波段中的最大最小值

  18. 参数说明:

  19. bApproxOK: true 表示粗略统计,与真实最大最小有偏差,但统计速度快

  20. false表示严格统计,等于图像真实最值,统计速度相对慢

  21. pdfMinMax: 返回统计的最大最小值

  22. *******************************************/

  23. eg:

  24. double MinMax[2];

  25. pBand->ComputeRasterMinMax(false, MinMax)

  26.  
  27. <3> virtual CPLErr GetStatistics (int bApproxOK, int bForce, double *pdfMin, double *pdfMax,

  28. double *pdfMean, double *padfStdDev)

  29.  
  30. /*********************************************

  31. 功能:统计波段中的最大最小值,均值、方差等

  32. 参数说明:

  33. bApproxOK: true 表示粗略统计,统计速度快

  34. false表示严格统计,统计速度相对慢

  35. bForce: true表示扫描图像进行统计,会生成一个存储最大最大均值方差的xml文件

  36. false表示不扫描图像,而是直接根据生成的xml文件获得这些值,如果没有提前生成xml,

  37. 则会出现统计错误。

  38. pdfMin: 返回最小值

  39. pdfMax: 返回最大值

  40. pdfMean: 返回均值

  41. pdfStdDev: 返回方差

  42. *******************************************/

  43. eg:

  44. double minval,maxval,meanval,stddev;

  45. pBand->GetStatistics(FALSE,TRUE,&minval,&maxval,&meanval,&stddev);

  46.  
  47.  
  48. <4> virtual CPLErr ComputeStatistics (int bApproxOK, double *pdfMin, double *pdfMax, double *pdfMean,

  49. double *pdfStdDev, GDALProgressFunc, void *pProgressData)

  50. //参数意义与以上相同,后两个参数为进度条参数,可以设为NULL

  51. eg:

  52. double minval,maxval,meanval,stddev;

  53. pBand->ComputeStatistics(FALSE,&minval,&maxval,&meanval,&stddev,NULL,NULL);

 

五、其它

  1. GDALDataType:

  2. GDT_Byte //Eight bit unsigned integer

  3. GDT_UInt16 //Sixteen bit unsigned integer

  4. GDT_Int16 //Sixteen bit signed integer

  5. GDT_UInt32 //Thirty two bit unsigned integer

  6. GDT_Int32 //Thirty two bit signed integer

  7. GDT_Float32 //Thirty two bit floating point

  8. GDT_Float64 //Sixty four bit floating point

  9. GDT_CInt16 //Complex Int16

  10. GDT_CInt32 //Complex Int32

  11. GDT_CFloat32 //Complex Float32

  12. GDT_CFloat64 //Complex Float64

  13.  
  14.  
  15. CString inPath = pInDataset->GetDescription(); //获取输入图像路径

  16. GDALDataType dataType = pInRasterBand->GetRasterDataType(); //获取数据类型

  17.  
  18. enum CPLErr

  19. {

  20. CE_None = 0; //表示运行成功

  21. CE_Debug = 1;

  22. CE_Warning = 2;

  23. CE_Failure = 3;

  24. CE_Fatal = 4;

  25. }

  • 3
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值