ARCGIS中创建NetCDF栅格图层无法自动读取变量的解决方法(包括netCDF4包查看nc文件属性的操作流程)

下载了.nc后缀的文件,准备通过Arcgis转为tif栅格形式,但是出现了如下问题:

1.将nc文件拖入到输入栏后并不会自动提取变量、X维度、Y维度和输出栅格图层。

 在尝试解决的过程中,使用python的netCDF4包查看nc文件包含哪些标签,准备手动填写

复制代码
import numpy as np
import pandas as pd
import netCDF4 as nc

nf = nc.Dataset(r'xxx.nc','r')

#获取属性标签
label=nf.variables.keys()
print(label)
复制代码

运行后输出

输出:odict_keys(['longitude', 'latitude', 'time', 't2m'])

2.t2m是我需要的属性值,另外包括经纬度信息,将这些信息手动输入后点击确定,发现会报错,创建NetCDF栅格图层失败,原因是无法打开输入数据集

继续检查后发现nc文件的路径里包括了中文,尝试着将中文删掉

删掉后再将nc文件拖到输入栏中,发现可以自动识别出各属性了

 可以正常创建栅格,说明创建NetCDF栅格图层时输入路径不能带有中文

 

3.附:使用netCDF4包查看nc文件属性等详细信息的操作流程

由于我下载的是一天24小时的逐时数据,因此其还有一个维度用来表征时间,也就是前文查看标签时返回的“time”标签

(1)此时需要注意,上述1.2.所说的方法在处理完成后是没有时间维度特征的,为了在栅格中能区分24小时不同时间维度的数据,还是延续上文的代码来查看time标签的属性、值、并对其值进行转换,以确定数据日期时间的正确性(这一步其实可有可无)

#获取time属性的详细信息
time_label=nf.variables['time']
print(time_label)

#获取time标签下的值
time=nf.variables['time'][:]
print(time)
nf.variables['time']命令查看了time的详细属性,返回信息如下
<class 'netCDF4._netCDF4.Variable'>
int32 time(time)
    units: hours since 1900-01-01 00:00:00.0 #数据的分辨率(hours)以及是从什么时候开始的,这一信息后续还有用
    long_name: time
    calendar: gregorian
unlimited dimensions: 
current shape = (24,)
filling on, default _FillValue of -2147483647 used  #数据的缺省值是多少
time=nf.variables['time'][:]命令则查看了time标签下的所有值,返回信息如下
[1084152 1084153 1084154 1084155 1084156 1084157 1084158 1084159 1084160
 1084161 1084162 1084163 1084164 1084165 1084166 1084167 1084168 1084169
 1084170 1084171 1084172 1084173 1084174 1084175]

看起来毫无头绪,也并不是我们常见的时间表示方式,其实这需要与前面属性中的units:条目联系起来,前面的units条目内容是:hours since 1900-01-01 00:00:00.0

说明其值的表达方式是自1900年1月1日0时开始的小时总数

为了把它转换回我们熟悉的表示方法来确定时间是否正确,我们使用如下代码:

#对time值进行转换
time_trans = nc.num2date(nf.variables['time'][:],'hours since 1900-1-1 00:00:00').data   #这里需要注意,我输入了前面得到的units条目内容
 print(time_trans)

返回如下内容

复制代码
[cftime.DatetimeGregorian(2023, 9, 6, 0, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 1, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 2, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 3, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 4, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 5, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 6, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 7, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 8, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 9, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 10, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 11, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 12, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 13, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 14, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 15, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 16, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 17, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 18, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 19, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 20, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 21, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 22, 0, 0, 0, has_year_zero=False)
 cftime.DatetimeGregorian(2023, 9, 6, 23, 0, 0, 0, has_year_zero=False)]
复制代码

说明数据内的time包括了2023年9月6日0时-23时的逐时数据

(2)确定我们的数据是正确的之后,我们就需要考虑在gis中如何表达不同时间点的数据,这里需要在使用“创建NetCDF栅格图层”工具时选择‘time’为波段维度

 运行后出现了一个新图层,这时候在图层-属性-符号系统中选择“拉伸”

其波段出现了Band_1~Band_24,每小时的数据储存在一个波段上

 

 
posted @   Victooor_swd  阅读(2604)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示