NC文件读取及批量转为TIFF-史上最详细讲解-含代码(ArcGIS/MATLAB)

博客主要围绕NC文件展开,介绍其为网络通用数据格式,包含变量、维、属性等结构。讲解了用MATLAB查看NC结构,还分别介绍ArcGIS和MATLAB读取NC文件的方法,重点阐述用MATLAB批量读取NC并保存成TIFF格式,最后验证了导出结果的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

何为NC文件,如何读取,如何批量转为TIFF(ArcGIS/MATLAB)


前言

相信有好多遥感、地信、地理的同学经常会用到全球月均降水数据/气温等数据,而该类数据常以NC文件保存,大家拿到手后常常会迷惑,这是一种什么数据格式,如何读取,又如何转为我们熟悉的栅格数据。今天来为大家答疑解惑。

一、NC文件的介绍

NetCDF全称为network Common Data Format,中文译法为“网络通用数据格式”;netcdf文件开始的目的是用于存储气象科学中的数据,现在已经成为许多数据采集软件的生成文件的格式。

一个Netcdf文件的结构包括以下对象:
● 变量(Variables) :变量对应着真实的物理数据;
● 维(dimension):一个维对应着函数中的某个自变量,或者说函数图象中的一个坐标轴;
● 属性(Attribute) :属性是对变量值和维的具体物理含义进行注释。

从数学上来说,netcdf存储的数据就是一个多自变量的单值函数。用公式来说就是f(x,y,z,…)=value;
●自变量x,y,z等在netcdf中叫做维(dimension) 或坐标轴(axix);
●value在netcdf中叫做变量(Variables)。

二、查看NC结构

使用MATLAB查看
●使用函数ncdisp
使用方法:
ncFilePath = [‘E:\个人文档1\项目\数据\2000-2020_tmp\tmp_2000_2002.nc’]; %设定NC路径
ncdisp(ncFilePath);
●读取结果
以下为该NC文件的结构,包含类型、维度、和变量;其中变量中又含有经度、纬度、时间、pre(这也就是我们需要的变量);
我们可以形象的理解为:经纬度是它的平面坐标,时间是它的维度,构成一个三维空矩阵,然后将pre分别填充到该矩阵中,就形成了这样的一个数据结构。
●注意:进行这一步操作,直白点就是看它的数据结构以及该文件的介绍,其次是为了确定维度和变量的名称,后续需要用到。
这里例如,经度的名称为lon,纬度的为lat,时间为time,变量为tmp.

在这里插入图片描述

三、读取NC

这里分为两个软件来讲解,arcgis带有读取NC文件功能,但是仅能读取单个文件,如果数量够多,无疑消耗大量的时间,这里我们使用MATLAB进行批量读取并转换为TIFF。

3.1 ArcGIS读取

1.打开ArcGIS,点击工具箱,找到多维工具,点击下方的创建NetCDF栅格图层。

在这里插入图片描述

2.弹出如下界面,输入netCDF文件,然后会自动加载如下变量,维度值可以选择time,然后在下面的表格time后面的值中填入相应的日期,即可加载你想读取的NC中某一时间维度的数据,不进行处理的话默认加载维度的第一个值。然后点击确认。
注意:注意该路径不能含有中文,否则不能自动加载以下变量,而且会报错。

在这里插入图片描述

  1. 结果如下,即读取成功,保存栅格图层即可。
    注意:但是这种方法只能导出一个时间点的栅格数据,nc一般都是多维度时间,那如何批量导出呢?接着看下面。

在这里插入图片描述

3.2 Matlab读取

  1. 先读取任意一组维度的数据来看看,使用一下代码。设置一下自己的路径
clc
clear
ncFilePath = ['E:\个人文档1\项目\数据\2000-2020_tmp\tmp_2000_2002.nc']; %设定NC路径
ncdisp(ncFilePath); %查看NC结构
data1=ncread(ncFilePath,'tmp'); 读取NC文件中的变量,注意要设置正确的变量名,该数据集变量名为tmp,怎么查看,参考上文开始的讲解
data3=data1(:,:,1); %读取该数据集维度中的第1个时间序列数据
  1. 结果如下所示:可以发现data1显示7680471736,前面两个也就是我们说的经纬度,后面36也就是时间序列(该NC含3年数据,3*12月=36月),data3就是读取的2000年1月份的tmp数据。

在这里插入图片描述

  1. 显示data3。选择data3,点击绘图工具,选择imagesc显示该数据,炸一看有点奇怪,仔细一看是一个鸡的形状(中国),但是它是显示的方向不对。应该先逆时针旋转90°,再镜像一下(翻转)。

在这里插入图片描述

  1. 我们加上如下代码,一个是逆时针,一个是翻转。发现中国地形正常了。
 data4=rot90(data3); %逆时针旋转90°
 data5=flipud(data4); %矩阵的翻转
 imagesc(data5);

在这里插入图片描述

四、批量读取NC并保存成TIFF格式

  1. MATLAB中将数据保存成TIFF格式牵扯到地理坐标系的问题。两种做法:一是利用Matlab中的georasterref函数来创建tif的地理坐标系,二是读取一个现成tiff文件,当做参考地理坐标系。由于第一种方法可能会出现偏移或者出错,为了保证数据的准确性,我们使用第二种方法。
  1. 同第三节的Arcgis读取操作,先读取NC中的某一期数据。然后定义投影,投影操作如下。

在这里插入图片描述

  1. 查看属性,如果空间参考中有坐标系,即定义成功,如果定义了后还是没有,进行下一步操作。

在这里插入图片描述

  1. 如图选中图层,右击选择属性,设定图层的坐标系。

在这里插入图片描述

  1. 点击导出数据。将栅格数据集(原始)更改为数据框(当前),即可发现空间参考中有坐标系了,设置下保存路径,点击保存即可。

在这里插入图片描述
在这里插入图片描述

  1. 保存成功后结果如下所示。

在这里插入图片描述

4.2 批量保存为TIFF格式

1.废话不多说,直接上代码。将下面代码copy可直接用,需要调整的地方在文中已进行标注(需要调整),更改下文件路径即可,再有就是循环的地方,根据自己需求进行调整。

clc
clear
%%  导入NC数据集
ncFilePath = ['E:\个人文档1\项目数据\2000-2020_pre\2000-2020\pre_2020.nc']; %设定NC路径**需要调整**
ncdisp(ncFilePath); %查看NC数据结构
%% 导入TIFF影像的坐标信息
[A,R]=geotiffread('E:\li\pre_2018.tif');%该处路径为上述Arcgis中导出带坐标系的TIFF文件**需要调整**
info=geotiffinfo('E:\li\pre_2018.tif'); %该处路径为上述Arcgis中导出带坐标系的TIFF文件 **需要调整**
%% 读取pre数据
data=ncread(ncFilePath,'pre');  
%% 批量处理
for year=2000:2020  %年循环**需要调整**
        data1=data(:,:,1+12*(year-2000):12*(year-1999)); %得到每年的12个月数据。注意,第一个减去的时间与循环的起始时间相同,第二个减去的时间在起始时间的基础上减1。如该处的20001999**需要调整**
        data3=sum(data1,3)/12; %表示沿X轴的第3维求和,求年平均数据
        data4=rot90(data3); %使矩阵逆时针旋转90°
        data5=flipud(data4); %矩阵的翻转
        filename=strcat('E:\个人文档1\项目\数据\NC_TO_TIFF\pre\year\中国',int2str(year),'年pre.tif'); %**需要调整**
        geotiffwrite(filename,data5,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
    for mon=1:12  %月循环
        data2=data1(:,:,mon);  %读取月数据
        data4=rot90(data2);%使矩阵逆时针旋转90°
        data5=flipud(data4); %矩阵的翻转
        filename=strcat('E:\个人文档1\项目数据\NC_TO_TIFF\pre\month\中国',int2str(year),'_',int2str(mon),'月pre.tif'); **需要调整**
        geotiffwrite(filename,data5,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
    end
end

2.导出成功。

在这里插入图片描述

4.3 导出结果验证

选取2000年1月份的结果,在ARCGIS中打开,发现数值在-32768-2339之间;在MATLAB中调出该期NC原始数据,提取最大最小值提取,可以发现和该数据99%接近,至于有细微的个位数误差,是由于将TIFF影像导入到ARcgis中进行了金字塔重采样。说明导出的结果是没问题的。

在这里插入图片描述

在这里插入图片描述

Ending

好了,以上就是本次讲解的内容了,希望能给大家带来帮助,有问题也欢迎在下方留言探讨。

MATLAB中处理NC文件数据并将其导入到ArcGIS进行可视化,需要经过几个步骤: 1. **加载NC文件**: 使用`ncopen`函数打开NC文件,然后通过`ncread`函数读取数据。例如,假设你想读取名为`data.nc`文件中的`temperature`变量: ```matlab fid = ncopen('data.nc'); temperature_data = ncread(fid, 'temperature'); fclose(fid); ``` 2. **换数据格式**: 确保数据适合在ArcGIS中使用,比如可能需要将数据换成栅格数据(Raster),如果原始数据已经是栅格形式,则无需此步骤。 3. **保存数据到文件**: 将MATLAB中的数据换成地理信息系统(GIS)格式,如栅格文件(.tif)。你可以使用`imsave`函数保存图像数据,或者使用`geotiffwrite`等GIS专用工具。 ```matlab % 假设temperature_data是二维数组,lon和lat是经纬度坐标 [X,Y] = meshgrid(lon,lat); RasterData = geotiffwrite('temperature.tif', temperature_data, X, Y); % 或者imsave('temperature.tiff', im2double(temperature_data)); ``` 4. **在ArcGIS中打开数据**: - 打开ArcGIS Desktop,选择"Add Data",找到刚创建的`temperature.tif`文件- 可能需要在属性表中设置正确的投影和地理参考信息。 5. **绘制地图和添加图层**: 在ArcMap中创建新的图层,将温度数据作为栅格图层显示出来。你可以调整颜色编码、比例尺等以更好地展示数据。 6. **地图可视化**: 使用ArcGIS的各种绘图工具(如图层叠加、热点图、矢量图层等)对数据进行分析和可视化。
评论 73
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值