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,每小时的数据储存在一个波段上
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库