基于C++中netCDF库读取.nc数据时的一些坑

  本文介绍基于C++ 语言的netCDF库读取.nc格式的栅格文件时,出现数据无法读取数据读取错误无法依据维度提取变量等情况的原因与解决方法。

  最近,由于需要读取ERA5气象数据,因此使用C++语言中的netCDF库读取.nc格式文件;这其中也是踩了很多的坑,所以在此记录一下,也相当于是汇总了C++netCDF库读取.nc文件时的一些常见问题。

1 环境配置

  环境配置是使用每一个第三方库时,首先遇到的问题。针对不同语言,netCDF库也有着对应的不同版本,我们之前的文章也介绍过在PythonC++ 等代码的开发环境中,配置netCDF库的具体方法,大家直接参考文章Anaconda下Python中h5py与netCDF4模块下载与安装方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/120553597),以及文章在Visual Studio配置C++的netCDF库的方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/136451536)即可。但当然,本文后续提到的各类问题,都是在基于C++ 语言的netCDF库读取.nc格式文件时,出现的问题(毕竟Python读取.nc格式文件还是很方便的,感觉一般也不会有太大的问题或坑)。

2 数据增益值与偏移值

  首先,如果大家读取数据时,发现得到的结果数值很奇怪、不符合数据范围的实际情况,那么大概率就是.nc文件的变量存在scaleoffset(增益值、偏移值)导致的;关于这一点,我们之前已经用了完整的一篇文章对其加以介绍,大家参考文章C++读取NC数据的结果与真实数值不一致的解决方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/136539908)即可。

3 NcVar格式数据不能跨函数使用

  此外,经过操作发现,我们读取得到的NcVar格式的变量,其似乎只能在.nc格式文件被读取后立刻使用,而不能跨函数使用;如果跨函数使用,就会出现badid的错误。

  例如,我们一般情况下,都是通过如下代码,打开.nc格式文件,并读取其中的变量数据。

NcFile file(path, NcFile::read);
NcVar var = file.getVar("ssrd");

  那么此时,假设我上述的2句代码是在一个函数中运行的,然后我将得到的NcVar格式的变量var作为这个函数返回值,返回给调用者;随后,又将这个被返回的NcVar格式变量var作为参数,输入到另一个新的函数中——那么,在这个新的函数中,我们如果还想读取var这个变量(例如用如下的代码来读取var这个变量),就会出现badid的错误。

vector<size_t> start{ size_t(time_idx), size_t(latitude_idx), size_t(longitude_idx) };
double* value = new double[1];
var.getVar(start, value);

  在这个地方,一开始我还以为是我的start参数设置有误,导致一直无法读取var;后来才注意到,原来是这个var不能够跨越函数读取导致的(应该是这样的吧,具体我倒也没有看到官网上有明确的说明)。

4 时间维度需要放在第一个位置

  有时,我们需要按照不同维度,对变量数据加以读取。例如,我这里的.nc格式文件中,变量是1种气象数据,其具有3维度,包括经度、纬度与时间等。

  那么,假设我们希望获取某一个指定时间中,某一个经度与纬度处,对应的变量的数值(相当于就是其在栅格文件中的像素值)——那么多数情况下,我们会选择.getVar(start, value)这种方法,对变量数据加以读取。如果是如此,就需要注意将时间维度放在start第一个元素的位置上;具体代码如下所示。

NcFile file(path, NcFile::read);
NcVar var = file.getVar("ssrd");
vector<size_t> start{ size_t(time_idx), size_t(latitude_idx), size_t(longitude_idx) };
double* value = new double[1];
var.getVar(start, value);

  可以看到,我们需要保证上述代码中,time_idx是这个start变量的第一个元素。关于这一点,在C++ 版本的netCDF库的官方网站中,也有具体提及,如下图所示。

  在这里多提一句。我们可以用下述代码,将读取.nc格式的栅格文件,并获取其中的所有维度。这个代码首先读取了我们的.nc格式文件,然后通过.getDims()方法,获取了其中的全部维度,并将每一个维度都放入了multimap格式的变量dimension_map中。

NcFile file(path, NcFile::read);
multimap<string, NcDim> dimension_map;
dimension_map = file.getDims();

  此时,当我们查看这个dimension_map,有时会发现——时间维度并不在这个multimap的第一位(multimap是有序的),其myId参数的值也不一定是0;如下图所示。

  如下图所示,我打开了另一个.nc格式的栅格文件并查看其维度,可以看到虽然此时时间维度myId值为0,但是其在multimap中的位置依然不是第一位。

  但是,尽管如此——只要我们需要基于.getVar(start, value)这种方法,对变量数据加以读取,那么就一定注意将时间维度放在start的第一个位置。

  至此,大功告成。

欢迎关注:疯狂学习GIS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/436956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Win8.1 连接Wifi后开启热点

1 首先管理员运行 cmd, 输入命令&#xff0c;其中ssid无线名称&#xff0c;key密码&#xff0c;此时网络连接出现 本地连接 2. netsh wlan set hostednetwork modeallow ssidwahahaad key12345678 netsh wlan start hostednetwork 2 找到当前连接的 WLAN, 设置共享。 3 先停止…

纯手工搭建一个springboot maven项目

前言&#xff1a;idea社区版无法自动搭建项目&#xff0c;手动搭建的经验分享如下&#xff1a; 1 包结构 参考下图&#xff1a; 2 项目结构 3 maven依赖 具体的项目包结构如下图&#xff1a; 依据这个项目包结构配置一个springboot 的 pom依赖&#xff1a; <?xml ve…

基于springboot+vue的高校学生党员发展管理系统(源码+论文)

文章目录 目录 文章目录 前言 一、功能设计 二、功能实现 6.1 系统首页界面 6.2 用户登录界面 6.6 管理员后台界面 6.7 学生信息管理界面 6.8 资料管理界面 6.9 入党申请管理界面 6.10 正式党员管理界面 三、库表设计 四、论文 前言 为了进一步加强高校内党组织建设&#xff0c…

ue WebUI插件下载官方Github方法

首先要先将EPIC账号绑定Github账号 这个网上有很多教程 我就不细说了 绑定以后点击这个链接 https://github.com/tracerinteractive/UnrealEngine 进去后是这样的 点击这里 下滑找到对应版本下载即可 好了就这样 别被割韭菜了

《汇编语言》- 读书笔记 - 第17章-使用 BIOS 进行键盘输入和磁盘读写

《汇编语言》- 读书笔记 - 第17章-使用 BIOS 进行键盘输入和磁盘读写 17.1 int9 中断例程对键盘输入的处理键盘缓冲区 17.2 使用 int 16h 中断例程读取键盘缓冲区编程检测点 17.1 17.3 字符串的输入编程&#xff1a;字符串输入程序需求分析处理过程子程序完整代码 17.4 应用 in…

Mybatis-Plus——06,CRUD查

CRUD查 一、普通查询1.1、通过id查询单个用户1.2、通过id查询多个用户1.3、条件查询 通过map封装 二、分页查询2.1、配置分页插件2.2、运行方法 三、通过wrapper条件构造器查询3.1、查询name不为空&#xff0c;email不为空&#xff0c;age大于18的用户3.2、查询nameJone的用户3…

[技术杂谈]解决右键没有vscode打开选项的问题

问题&#xff1a; 点击鼠标右键没有‘使用vscode打开’的选项。 原因&#xff1a; 在安装时没有勾选相关选项 解决办法&#xff1a; 新建一个reg文件写入下面文件&#xff0c;注意替换自己真实Code.exe路径 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\she…

计算机考研❗️这些院校(含985)性价比巨高

✅厦门大学 (985) 不歧视双非&#xff0c;全靠实力&#xff0c;校园环境还贼美 ✅重庆大学 (985) 信息公开透明&#xff0c;复试抽签 ✅北京师范大学 (985) 不歧视本科出身&#xff0c;面试抽签答题。 ✅东南大学 (985) 保护第一志愿&#xff0c;复试抽签 ✅吉林大学 (…

3Dmax中VR渲染太阳光渲染参数怎么设置?渲染100云渲染助力

我们用3Dmax建模时一些场景会用到太阳光&#xff0c;那么渲染参数是如何设置的呢&#xff1f; 我们一起来看看&#xff0c;直接上图 以上就是详细的参数设置&#xff0c;大家可以用做参考&#xff0c;如果本地渲染慢的朋友可以考虑使用云渲染100 机器多&#xff0c;渲染稳定不…

仪酷LabVIEW OD实战(4)——Object Detection+OpenVINO工具包快速实现yolo目标检测

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『仪酷LabVIEW目标检测工具包实战』 &#x1f4d1;上期文章&#xff1a;『仪酷LabVIEW OD实战(3)——Object Detectiononnx工具包快速…

【新版Hi3521DV200处理器性能】

新版Hi3521DV200处理器性能 Hi3521DV200是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;DVR产品应用开发的新一代专业SoC芯片。Hi3521DV200集成了ARM Cortex-A7四核处理器和性能强大的神经网络推理引擎&#xff0c;支持多种智能算法应用。同时&#xff0c;Hi352…

微服务之商城系统

一、商城系统建立之前的一些配置 1、nacos Nacos是一个功能丰富的开源平台&#xff0c;用于配置管理、服务发现和注册、健康检查等&#xff0c;帮助构建和管理分布式系统。 在linux上安装nacos容器的命令&#xff1a; docker run --name nacos-standalone -e MODEstandalone …

在centos7系统中如何给docker配置代理

一、需求场景 生产环境私有云中&#xff0c;通常一个集群的机器中只有几台机器可以直接访问公网&#xff0c;其他机器需要通过代理的方式从能访问公网的机器出去&#xff0c;在已经做了如下配置之后&#xff0c;使用docker pull命令已经报错超时timeout&#xff0c;这时可以尝…

python中的defaultdict

collections.defaultdict 是 collections 模块提供的一个有用的类&#xff0c;它是内置字典类 dict 的一个子类。与普通字典一样&#xff0c;可以进行元素的访问、添加、删除等操作。区别在于当访问一个不存在的键时&#xff0c;defaultdict 会返回默认值&#xff0c;而不会引发…

Go程序是如何编译并运行起来的(图文详解)

Go程序是如何编译的 从hello RdrB1te开始 package main import "fmt" func main() { fmt.Println("hello RdrB1te") }不实际编译它&#xff0c;只输出它的编译过程&#xff1a; go build -n简单的编译过程分析&#xff1a; 上面的过程确认了两个…

SpringBoot集成JSP和war包部署到Tomcat

SpringBoot集成JSP 加依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot…

开抖音小店一个月,就摸清楚了电子面单发货,不用担心被查无货源

大家好&#xff0c;我是电商花花。 开抖音小店一个月的时间&#xff0c;就摸清楚了抖音小店的电子面单发货&#xff0c;再也不用担心做无货源模式被平台稽查了。 现在平台的规则越来越严格&#xff0c;很多抖音小店的商家为了避免违规&#xff0c;为了不被平台稽查&#xff0…

传感器在TWS耳机中的应用

一项音频产品使用报告显示&#xff0c;消费者对音频设备中音质差异的认知不断提高&#xff0c;对在设备上获得最佳音频体验的期待也在提升。自适应主动降噪、语音增强、空间音频等是提升TWS耳机用户体验的主要因素&#xff0c;这些技术背后都有运动传感器的身影&#xff0c;包括…

Gartner对未来5年全球信息安全和风险管理市场的预测分析:影响市场的四大因素及对相关产品市场的影响

到 2023 年&#xff0c;信息安全和风险管理市场的最终用户支出将增长至 1850 亿美元&#xff08;现价美元&#xff09;&#xff0c;货币稳定增长率为 13.4%。到2027年&#xff0c;市场规模将达到2870亿美元&#xff0c;按固定汇率计算&#xff0c;2022年至2027年的复合年增长率…

Windows系统搭建VisualSVN并结合内网穿透实现远程访问本地服务

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…