技术背景

  海洋地形数据主要是通过美国全球地形起伏数据(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 <QtDebug>
4 #include <gdal_priv.h>
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 <QCoreApplication>
2
3 #include "grdfileread.h"
4 #include <QWidget>
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 }

运行结果

  至此,文件读取完成。

致谢

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

参考博客

1、GDAL遥感影像读取与显示【https://blog.csdn.net/zhouxuguang236/article/details/8070090

2、Qt配置GDAL(Qt 5.6.1+MSVC 2013+64 bit)【https://blog.csdn.net/u010670734/article/details/53106786?locationNum=13&fps=1

3、gdal读写图像分块处理(精华版)【https://blog.csdn.net/elfxwt_study/article/details/9071261

4、gdal库编译并适配至vs2017【https://blog.csdn.net/Dragonzxc/article/details/80356883

基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版的更多相关文章

  1. 基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版

    技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...

  2. 使用C#版本的gdal库打开hdf文件

    作者:朱金灿 来源:http://blog.csdn.net/clever101 最近应同事的请求帮忙研究下使用C#版的gdal库读取hdf文件,今天算是有一点成果,特地做一些记录. 首先是编译C#版 ...

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

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

  4. 关于基于GDAL库QT软件平台下C++语言开发使用说明

    背景前提 地理空间数据抽象库(GDAL)是一个用于读取和编写栅格和矢量地理空间数据格式的计算机软件库,由开源地理空间基金会在许可的X / MIT风格免费软件许可下发布. 作为一个库,它为调用应用程序提 ...

  5. 基于GDAL库,读取.nc文件(以海洋表温数据为例)C++版

    对于做海洋数据处理的同学,会经常遇到nc格式的文件,nc文件的格式全称是NetCDF,具体的详细解释请查询官网[https://www.unidata.ucar.edu/software/netcdf ...

  6. 基于GDAL库海洋表温日平均计算工具设计与实现 C++版

    技术背景 在对物理海洋数据处理过程中,表层温度是众多要素中的一种,本文书要是针对海洋表温数据批量日平均处理的一个工具设计.首先要在对当前的SST数据文件作一下简要的说明,SST全称为sea surfe ...

  7. C++调用GDAL库读取并输出tif文件,并计算斑块面积输出景观指数:CSD

    部分源码选自GDAL库的官方网址:www.gdal.org,其余的代码为笔者自己编写. // readfile.cpp : 定义控制台应用程序的入口点. // /* part of the codes ...

  8. GDAL库——读取图像并提取基本信息

    GDAL库是一个跨平台的栅格地理数据格式库,包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据.这里有GDAL ...

  9. gdal库对ENVI文件的一点支持不好

    作者:朱金灿 来源:http://blog.csdn.net/clever101 使用GDALOpen函数打开ENVI的img文件,如果使用更新的方式即GA_Update会改写对应的hdr文件.改写h ...

随机推荐

  1. MySQL 表字段唯一性约束设置方法unique

    1. 建表时加上唯一性约束 CREATE TABLE `t_user` ( `Id` int(11) NOT NULL AUTO_INCREMENT, -- 自增 `username` varchar ...

  2. java邮件打包在linux备份数据库练习

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6812982512256549387/ 承接上一篇文档<Java实现163邮箱发送邮件到QQ邮箱> 主方 ...

  3. Mysql高性能优化

    一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 SQL 查询语句关联5,6张表且编写不够规范,导致 MySQL 在执行 SQL 语 ...

  4. C# 开源一个基于 yarp 的 API 网关 Demo,支持绑定 Kubernetes Service

    关于 Neting 刚开始的时候是打算使用微软官方的 Yarp 库,实现一个 API 网关,后面发现坑比较多,弄起来比较麻烦,就放弃了.目前写完了查看 Kubernetes Service 信息.创建 ...

  5. LCT小记

    不用说了,直接上怎么 die( 千万不要和 Treap 一样写左旋 zig 和右旋 zag,莫名死亡.Splay 只支持一个 rotate 上旋一个节点即可. splay() 之前记得弄一个栈存储 u ...

  6. 【pwn】学pwn日记——栈学习(持续更新)

    [pwn]学pwn日记--栈学习(持续更新) 前言 从8.2开始系统性学习pwn,在此之前,学习了部分汇编指令以及32位c语言程序的堆栈图及函数调用. 学习视频链接:XMCVE 2020 CTF Pw ...

  7. echart 横轴倾斜

    xAxis: [ { type: 'category', data:[], axisLabel: { interval:0, rotate:40 }, grid: { left: '10%', bot ...

  8. 【记录一个问题】运算迁移到gpu后的计时问题

    我把部分计算迁移到GPU后,发现以帧率计算的程序,帧率下降:但是看各个函数的时间,又比之前减少了. 很奇怪,既然各个函数的时间减少,为什么帧率反而下降? 原来计算帧率使用了 gettimeofday( ...

  9. python 爬虫爬取历年双色球开奖信息

    目前写的这些爬虫都是些静态网页,对于一些高级网页(像经过JS渲染过的页面),目前技术并不能解决,自己也是在慢慢学习过程中,如有错误,欢迎指正: 对面前端知识本人并不懂,过程中如果涉及到前端知识,也是百 ...

  10. Linux下安装confluence汉化破解版

    Atlassian Confluence(简称Confluence)是一个专业的wiki程序.它是一个知识管理的工具,通过它可以实现团队成员之间的协作和知识共享.Confluence 不是一个开源软件 ...