技术背景

海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达等功能操作;由于Surfer软件不支持二次开发,没有提供相应的SDK供开发者进行使用,所以这一切只能通过相应类似的技术进行实现,首先,数据的读取,如何通过编程实现数据的读取操作呢?这里就要说一下GIS软件所使用的一个开源库-GDAL,GDAL库的具体解释资料,请查阅官方网站【https://www.gdal.org/index.html】,由于后期要进行数据入库的步骤,所以本文提供的是一种采用C++语言(Qt平台)进行读取的方法,前面的GDAL库的编译方法请参考博客4【gdal库编译并适配至vs2017】,下面具体讲一下环境配置。

环境配置有两种方法,这个看个人习惯,主要是看自己使用时是否是配置环境变量,编译好的库文件主要有一下文件夹

其中bin文件夹主要是编译后的运行文件要使用的,也就是Qt编译出来的debug文件或者是release文件会在运行的时候调用这个文件夹里面的程序,而lib文件夹是你编程时候要使用的库文件,编译是否正确跟这个库文件有关。方法一:配置环境变量法,将bin文件夹添加到系统环境变量path内,然后在新建的项目文件添加库文件(外部库),添加完成后可见*.pro文件里面多了

这样几个引用语句,这就表明已经成功导入项目了,直接开始后面的编辑工作了;方法二:直接导入法,直接将bin文件夹里面的*.dll文件导入到项目的debug或release文件里面,然后在新建的项目文件添加库文件(外部库),添加完成后*.pro文件和上文提到的一样,多了那三行引用语句。集体来说,我推荐第一种方法,因为一劳永逸,不用每个项目都要去导一下。

数据读取

下面进行数据的读取,数据的读取步骤和正常GDAL库读取差不多,没什么太大的区别,具体理论步骤请大家参考博客3【gdal读写图像分块处理(精华版)】,这里面唯一要注意的就是数据的缓冲区大小,因为grd为二进制数据,数据的值是否正确和你缓冲区大小设置有关系,这里我是用的是float,也就是代码中的GDT_Float32,不说了,直接看代码吧。

读取-头文件

1 #ifndef GRDFILEREAD_H

2 #define GRDFILEREAD_H

3

4 class grdFileRead

5 {

6 public:

7 void fileRead(const char* pszFile);

8 };

9

10 #endif // GRDFILEREAD_H

读取-源文件

1 #include "grdfileread.h"

2

3 #include

4 #include

5

6 void grdFileRead::fileRead(const char* pszFile)

7 {

8 GDALAllRegister();

9 GDALDataset *poDataset;

10 //使用只读方式打开图像

11 poDataset = (GDALDataset*) GDALOpen( pszFile,GA_ReadOnly );

12 if( poDataset == NULL ){

13 printf( "File: %s不能打开!\n",pszFile);

14 return;

15 }

16

17 printf( "Driver:%s/%s\n",

18 poDataset->GetDriver()->GetDescription(),

19 poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME) );

20

21 //输出图像的大小和波段个数

22 printf( "Size is%dx%dx%d\n",

23 poDataset->GetRasterXSize(),poDataset->GetRasterYSize(),

24 poDataset->GetRasterCount());

25

26

27 //输出图像的投影信息

28 if( poDataset->GetProjectionRef() != NULL )

29 printf( "Projectionis `%s'\n", poDataset->GetProjectionRef() );

30

31 //输出图像的坐标和分辨率信息

32 double adfGeoTransform[6];

33 if( poDataset->GetGeoTransform( adfGeoTransform) == CE_None ){

34 printf( "Origin =(%.6f,%.6f)\n",adfGeoTransform[0], adfGeoTransform[3]);

35 printf( "PixelSize = (%.6f,%.6f)\n",adfGeoTransform[1], adfGeoTransform[5]);

36 }

37

38 //读取第一个波段

39 GDALRasterBand *poBand = poDataset->GetRasterBand( 1 );

40

41 //获取该波段的最大值最小值,如果获取失败,则进行统计

42 int bGotMin, bGotMax;

43 double adfMinMax[2];

44 adfMinMax[0] = poBand->GetMinimum( &bGotMin);

45 adfMinMax[1] = poBand->GetMaximum( &bGotMax);

46

47 if( ! (bGotMin&& bGotMax) )

48 GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);

49

50 printf( "Min=%.3fd,Max=%.3f\n", adfMinMax[0], adfMinMax[1] );

51

52 int nXSize = poBand->GetXSize();

53 int nYSize = poBand->GetYSize();

54 float *pafScanline = new float[nXSize];

55

56 //读取图像数据

57 for(int i = 0; i< 10/*nYSize*/;i++){

58 poBand->RasterIO(GF_Read, 0, i, nXSize,1, pafScanline, nXSize,1, GDT_Float32, 0, 0 );

59

60 QString LineDataInfo = "";

61 for(int j = 0; j< 10/*nXSize*/;j++){

62 if(j == 0){

63 LineDataInfo = QString("%1").arg(pafScanline[j], 0, 'f', 0);

64 }else{

65 LineDataInfo = LineDataInfo + "," + QString("%1").arg(pafScanline[j], 0, 'f', 1);

66 }

67

68 }

69 qDebug() << LineDataInfo << endl;

70 }

71

72 delete []pafScanline;

73

74 //关闭文件

75 GDALClose((GDALDatasetH)poDataset);

76 }

主函数调用

1 #include

2

3 #include "grdfileread.h"

4 #include

5

6 int main(int argc, char *argv[])

7 {

8 QCoreApplication a(argc, argv);

9

10 grdFileRead gfr;

11 gfr.fileRead("F:/Data File/test/E135N30_sf.grd");

12

13 return a.exec();

14 }

运行结果

至此,文件读取完成。

致谢

感谢李民录老师的指导,以及相关技术博主的技术分享,谢谢你们!

参考博客

c语言读grd文件,基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版相关推荐

  1. Python gdal库读取tif文件

    from osgeo import gdal # GDAL库主要提供对栅格数据的处理,使用抽象数据模型来解析所支持的数据格式 import filename_cut as fc import matp ...

  2. Linux配置gdal变量环境,基于GDAL库的LINUX环境下的FY-3D和FY-4A遥感数据处理

    王燕婷 摘要 基于GDAL库的功能和其开源.可对栅格空间数据操作的特点,将GDAL与C++语言的完美结合,可极大得发挥其在开发遥感图像处理软件中的优势,并可跨平台应用于不同操作系统下的遥感图像数据处理 ...

  3. 基于GDAL库,读取海洋风场数据(.nc格式)c++版

    经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形.海洋表面温度.盐度.湿度.云场.风场等数据,除了地形数据是grd格式外,其他的都是nc格式的数据.本文将以海洋风场数据为例 ...

  4. 小悦文件保险箱 - 一款基于DuiLib 库开发的文件加密工具

    小悦文件保险箱是一款基于DuiLib 库开发的文件加密工具. 作为学习型编程,所以免费供大家使用.它可以作为加密备忘录使用,也能够为任何文件提供加密保存功能.使用方法也非常简单,先输入密码创建一个自己 ...

  5. 使用第三方库读取plist文件

    使用第三方库读取plist文件 一.摘要 在数据模型中,读取数据一直是一个比较头疼的问题,以读取plist文件为例,需要一层层往内读,如果自己写代码及其耗时而且容易出错,而使用第三方库,一句代码就可以 ...

  6. python读取nc文件转成img_使用python的netCDF4库读取.nc文件 和 创建.nc文件[转]

    使用python netCDF4库读取.nc文件 和 创建.nc文件 1. 介绍 .nc(network Common Data Format)文件是气象上常用的数据格式,python上读取.nc使用 ...

  7. pandas读取csv写入mysql_使用python的pandas库读取csv文件保存至mysql数据库

    第一:pandas.read_csv读取本地csv文件为数据框形式 data=pd.read_csv('G:\data_operation\python_book\chapter5\\sales.cs ...

  8. Python用pydicom库读取dicom文件

    Python用pydicom库读取dicom文件并调用 方法1:通过group.element读取 方法2:通过tag读取 方法3:get()方法 通用 import pydicompath = 'x ...

  9. 利用EXIF库读取jpg文件中的经纬度信息

    利用EXIF库读取jpg文件中的经纬度信息 EXIF库API参考:http://code.ciaoca.com/javascript/exif-js/ <!DOCTYPE html> &l ...

  10. STC8单片机基于开源库读取mpu6050数据

    STC8单片机基于开源库读取mpu6050数据

最新文章

  1. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)
  2. java虚拟机6.HotSpot的GC实现
  3. android读取短信内容简书,Android 获取App信息
  4. 算法竞赛入门经典(第二版) | 习题3-5 谜题 (UVa227,Puzzle)(World Finals 1993)
  5. redis数据库配置
  6. 使用Maven构建Spring项目“HelloWorld”
  7. 单元格自适应宽度_Excel – 合并单元格时,如何同时保留每个单元格的内容?...
  8. 通过ODBC接口访问人大金仓数据库
  9. 在python语言中、写文件的操作是_Python语言之详解文件操作
  10. 计算机网络经典试题答案,2016年计算机软考网络工程师经典练习试题及答案
  11. Vijos P1423 最佳路线
  12. linux命令键盘快捷键,如何将Linux命令设置成键盘快捷键
  13. 华为ensp 和secureCRT 连接
  14. 从融360到理财魔方、再到韭菜财经,新金融正确姿势为哪般?
  15. 马尔可夫链的定义、举例和应用
  16. 江南百景图过Root检测
  17. C#通过ip地址取当前城市
  18. PDF打开正常打印后却被放大,如何调整到正常?
  19. 线性代数的本质(1)——基底、向量、线性变换、逆阵、行列式
  20. 2月编程语言排行榜新鲜出炉,谁又摘得桂冠?

热门文章

  1. 基于arduino的WiFi无线传输
  2. 知识库 编号:002
  3. 【ACO MTSP】基于matlab粒子群优化蚁群算法求解多旅行商问题【含Matlab源码 1616期】
  4. 在优矿(uqer.io)上打开量化投资的黑箱-技术分析篇
  5. 服装网站建设策划书-服装网站建设目的需求分析策划书
  6. M1芯片,PS2022版真的来了。Photoshop 2022 for Mac中文版介绍安装教程,支持Monterey系统
  7. 路由器和交换机的作用及区别,不再为路由器的选择而烦恼
  8. Spring Cloud原理分析系列#Gateway#GlobalFilter vs GatewayFilter vs WebFilter
  9. 解读 | 关于阿里巴巴架构大调整,有 7 个重点值得特别关注
  10. 虹科新品 | 需要进行高功率,大规模的测试控制?这款5A功率高密度继电器模块你一定不能错过!