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

news2024/11/17 23:28:38

  本文介绍基于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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker基础教程 - 7 容器数据卷

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 7 容器数据卷 什么是容器卷&#xff0c;为什么需要容器卷&#xff1f; 我们在运行容器的时候&#xff0c;产生的数据都是保存在容器内部的。如果使用Docker来运行mysql容器&#xff0c;数据…

网络性能优化工具

网络优化是 IT 行业的一个重要方面&#xff0c;网络很复杂&#xff0c;管理员努力保持其平稳运行&#xff0c;然而&#xff0c;网络环境也是不可预测和动态的&#xff0c;任何未受监控的问题都可能像滚雪球一样变成中断。 优化网络性能需要引入&#xff1a; 新设备和应用程序…

Axure RP 10:让原型设计更快、更直观、更智能 mac版

Axure RP 10是一款强大的原型设计工具&#xff0c;它能够帮助设计师快速创建高保真、交互式的原型&#xff0c;从而更好地展示和测试设计方案。这款软件凭借其直观易用的界面和丰富的功能&#xff0c;已经成为了许多设计师的首 选工具。 Axure RP 10 for Mac版软件获取 首先&a…

还在使用 RESTful API ? 试一试 GraphQL

前言 GraphQL 和 RESTful API 是两种不同的网络通信接口设计理念&#xff0c;它们都可以用于客户端和服务器之间的数据交换&#xff0c;但是有着不同的工作方式和特点。 各自的特点以及优缺点 GraphQL&#xff1a; 特点&#xff1a; 查询语言: GraphQL 是一个查询语言&…

【MySQL 系列】MySQL 架构篇

在我们开始了解 MySQL 核心功能之前&#xff0c;首先我们需要站在一个全局的视角&#xff0c;来看 SQL 是如何运作执行的。通过这种方式&#xff0c;我们可以在头脑中构建出一幅 MySQL 各组件之间的协同工作方式&#xff0c;有助于我们加深对 MySQL 服务器的理解。 文章目录 1、…

DEYO: DETR with YOLO for End-to-End Object Detection论文翻译

DEYO&#xff1a;DETR与YOLO用于端到端目标检测 摘要 DETR的训练范式在很大程度上取决于在ImageNet数据集上预训练其骨干。然而&#xff0c;由图像分类任务和一对一匹配策略提供的有限监督信号导致DETR的预训练不充分的颈部。此外&#xff0c;在训练的早期阶段匹配的不稳定性会…

利用Cocos游戏开发中的跑马灯祝女神们节日快乐

点击上方亿元程序员+关注和★星标 引言 Cocos游戏开发中的跑马灯广播效果 大家好,今天是国际劳动妇女节,也就是我们如今熟知的女神节。 今天打算通过游戏开发中的跑马灯广播这最直接的方式祝女神们节日快乐! 跑马灯作为游戏中常见的UI元素,通常被用来展示重要的信息或者…

Gafana Redis Overview dashboard

1. 简介 根据提供的 Redis 监控仪表盘 JSON 文件,包含的监控指标及其简要描述如下: redis_uptime_in_seconds: Redis 实例的运行时间(秒)。 redis_connected_clients: 当前连接到 Redis 实例的客户端数量。 redis_memory_used_bytes: Redis 实例使用的内存量(字节)。 redis_m…

Qt + mqtt对接阿里云平台(一)

一、阿里云平台 官网&#xff1a;点击跳转 二、创建产品与设备 1、“公共实例” 2、“设备管理”->“产品”->“创建产品” 3、“产品名称”->“自定义品类”->"确认" 4、“前往添加” 5、“添加设备” 6、摄入DeviceName和备注名称 7、"前往查…

css-vxe-form-item中输入框加自定义按钮(校验位置错误)

1.浮动错误效果 提示内容不对 2.不使用浮动&#xff0c;使用行内块元素 代码如下 <vxe-form-item title"yoyo:" field"assembleWorkNo" span"8"><template #default><vxe-input style"width:70%;display:inline-block;&quo…

Linux之cd、pwd、mkdir 命令

cd命令&#xff0c;切换目录 1&#xff09;当Linux终端&#xff08;命令行&#xff09;打开的时候&#xff0c;会默认以用户的HOME目录作为当前的工作目录。 2&#xff09;我们可以通过cd命令&#xff0c;更改当前所在的工作目录。 3&#xff09;cd命令来自英文&#xff1a;C…

基于FPGA的PSRAM接口设计与实现

一 PSRAM与HyperRAM 1、概述 2、异同 待完善 二 PSRAM分析 1、特性 1、关键点 待完善 三 PSRAM方案设计与验证 待完善 1、整体方案设计 2、验证 仿真工具采用VCSVerdi&#xff0c;PSRAM接口控制IPAPS6408L model进行验证。 四 结论 备注&#xff1a;以AP公司的APS6408L…

IP传输方式——组播

组播作为IP传输三种方式之一&#xff0c;指的是报文从一个源发出&#xff0c;被转发到一组特定的接收者&#xff0c;相同的报文在每条链路上最多有一份。相较于传统的单播和广播&#xff0c;组播可以有效地节约网络带宽、降低网络负载&#xff0c;所以被广泛应用于IPTV、实时数…

mysql如何开启远程访问?

MySQL是一种常见的关系型数据库管理系统&#xff0c;广泛应用于各行各业。默认情况下&#xff0c;MySQL仅允许本地访问&#xff0c;即只能在本地主机上进行数据库操作。有时候我们需要通过远程连接访问MySQL数据库&#xff0c;以便实现更灵活的管理和操作。本文将介绍如何在MyS…

HTML静态网页成品作业(HTML+CSS)——原神介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

如何恢复未保存的Word文档

Microsoft Word 是世界上最流行的软件之一。它不仅是各行业提高生产力的利器&#xff0c;而且广泛应用于我们的日常生活中。因此&#xff0c;当您发现自己工作了数小时和数天的word doc文档被意外未保存、删除或丢失时&#xff0c;大多数人可能都知道恐慌和绝望。 今天我们将向…

HelpLook VS GitBook:知识库优劣详解

在信息爆炸的时代&#xff0c;企业要保持竞争优势&#xff0c;就必须善于管理和利用内部的知识资产。企业知识库作为一种集中存储和共享知识的工具&#xff0c;正在成为现代企业不可或缺的一部分。 HelpLook和Gitbook是提供专业知识库的两个平台&#xff0c;也被大众熟知。它们…

Spring Boot 配置热部署

前言 对于 Spring Boot 项目之中, 在刚开始学习的时候, 每当代码进行变动的时候, 想要生效那就必须要手动重启. 为什么要重启呢 ? 原因在于写的代码是依靠运行之后的 class 文件运行的, 当我们的代码更新以后, 如果不去手动重启, 那么就无法生成新的 class 文件, 执行的就是旧…

Python与FPGA——图像锐化

文章目录 前言一、图像锐化二、Python robert锐化三、Python sobel锐化四、Python laplacian锐化五、FPGA sobel锐化总结 前言 在增强图像之前一般会先对图像进行平滑处理以减少或消除噪声&#xff0c;图像的能量主要集中在低频部分&#xff0c;而噪声和图像边缘信息的能量主要…

结构体:位段(C语言进阶)(二)

目录 前言 2、位段 2.1 什么是位段 2.2 位段的内存分配 2.3 位段的跨平台问题 2.4 位段的应用 总结 前言 C语言除了有其内置类型&#xff0c;还有自定义类型。因为在实际运用中&#xff0c;我们可能会遇到一类数据&#xff0c;它的内容是由多种数据组成的&#xff0c;例如&…