技术背景

  海洋地形数据主要是通过美国全球地形起伏数据(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. linux系统安装python3和pip

    一.安装python 1.安装依赖环境 yum install gcc -y yum -y install zlib-devel bzip2-devel openssl-devel ncurses-d ...

  2. Flask + flask_sqlalchemy + jq 完成书籍展示、新增、删除功能

    后端代码 from flask import Flask, render_template, request, jsonify from flask_wtf.csrf import CSRFProte ...

  3. selenium实现并发

    for循环和多线程 + selenium 实例一 for循环 # -*- coding: utf-8 -*- """ Datetime: 2019/6/22 Author ...

  4. 《Flink SQL任务自动生成与提交》后续:修改flink源码实现kafka connector BatchMode

    目录 问题 思路 kafka参数问题 支持batchmode的问题 参数提交至kafkasource的问题 group by支持问题 实现 编译 测试 因为在一篇博文上看到介绍"汽车之家介绍 ...

  5. ServletContext接口

    Servlet 容器启动时,会为每个 Web 应用(webapps 下的每个目录都是一个 Web 应用)创建一个唯一的 ServletContext 对象,该对象一般被称为"Servlet ...

  6. gorm中的scope

    作用域允许您重用常用逻辑,共享逻辑需要定义为类型 func(*gorm.DB) *gorm.DB 查询 func Scope1(db *gorm.DB) *gorm.DB { return db.Wh ...

  7. Go 面向对象编程应用

    #### Go 面向对象编程应用前面学习了很多的基础知识,这一节来实际写一个小案例:涉及到的知识: 1. 数组的基本使用2. 结构体3. 切片 4. 方法5. 循环6. 函数返回值(命名返回值,普通返 ...

  8. IoC容器-Bean管理注解方式(完全注解开发)

    完全注解开发 (1)创建配置类,替代xml配置文件 (2)编写测试类 在实际中一般用springboot做

  9. linux文件压缩与文件夹压缩(打包)

    目录 一:linux文件压缩 1.linux常见的压缩包有哪些? 2.bzip压缩(文件) 二:打包(文件夹压缩) 1.打包命令 2.参数 3.参数解析(实战) 4.注意事项 简介: win中的压缩包 ...

  10. Python学习笔记之读取文件、OS模块、异常处理、with as语法示例

    转:https://m.sogou.com/web/id=4c468b90-3f64-418c-acf8-990b5fe2a757/keyword=python%20os%E6%A8%A1%E5%9D ...