当前位置: 首页 > 知识库问答 >
问题:

使用lat和Long s作为引用从netcdf文件中提取数据子域

孙德宇
2023-03-14

我正在尝试从“tasmax”变量中提取特定的数据子域,从基于纬度和经度的 netcdf 文件中。我的提取标准是:纬度在纬度44到50度之间;以及经度 5 到 -5 度(法国)之间。

我的“lat”变量是105乘102(维度:rlon,rlat,其中rlon和rlat是旋转lat-long的向量),覆盖整个欧洲。

我的'lon'变量也是105 x 102(尺寸:rlon,又是rlat)。lat和lon变量都是规则的lat/长,即不旋转。

由于我只有常规的lat-long数据作为提取数据的标准,我相信我必须使用lat和lon的网格(与rlat和rlon的矢量相反)来提取数据。

%首先,我从 .nc 文件中提取了纬度、lon 和数据变量:

lat=ncread(file.nc,'lat');
lon=ncread(file.nc,'lon');
data=ncread(file.nc,'tasmax');

%tasmax为105*102*366(一年的日数据)

%以下for循环只存在,所以我最终可以为其他地区自动执行此过程

for r=1;

%创建一个纬度/纬度网格大小的3D变量,并用NaN填充它。所以最终,其中唯一的数据将是我感兴趣的区域 domainrun=NaN(105,102,size(data,3));

%区域坐标

 ylat_north = [50]';
 ylat_south = [44]';
 xlon_east = [5]';
 xlon_west = [-5]';

icounter=0;
for j=1:size(lat,2);
for i = 1:size(lat,1);

%如果逐个元素lat和lons位于为区域指定的lat和lens内,则每个点的索引保存在idxi和idxj中,而实际数据本身写入“domainrun”矩阵(之前完全用NaN填充)。这导致该区域的矩阵,仅包含该特定子域的数据以及其他地方的NaN

if lat(i,j)<=ylat_north(r) && lat(i,j)>=ylat_south(r) && lon(i,j)>=xlon_west(r) &&       lon(i,j)<=xlon_east(r);

        icounter=icounter+1;

        idxi(icounter,1)=i;
        idxj(icounter,1)=j;
        domainrun(idxi(icounter,1),idxj(icounter,1),:)=data(idxi(icounter,1),idxj(icounter,1),:);

%idxij提供了用于从属性域中提取数据的I和j索引:这些索引对于此处的lat和lon变量是相同的,因为它们是基于描述所提取区域内的xy区域的前提而创建的。

        idxij=horzcat(idxi,idxj);

%testlat和testlon包含子区域的实际lat和lon

        testlat(i,j)=lat(i,j);
        testlon(i,j)=lon(i,j);

    else
        testlat(i,j)=NaN;
        testlon(i,j)=NaN;
    end
end

结束

%虽然这段代码有效,但我认为它极其混乱。我想要的是一种使用nc命令,基于常规lat lon标准提取tasmax数据的方法...或者更简单的。这个问题与stackoverflow上的其他问题不同,因为所有其他问题都是处理lat和lon的向量,这将更容易用于使用nc命令从tasmax提取数据(而不是lat lons的网格)。任何帮助都将不胜感激。

共有1个答案

骆鸿运
2023-03-14

如果您不介意我提供非matlab解决方案,可以使用cdo从命令行中选择一个区域:

cdo sellonlatbox,-5,5,44,50 input_data.nc france.nc 

然后你可以把它读入matlab。

CDO很容易在Ubuntu中安装

sudo apt-get install cdo 

现在ubuntu也可以在windows 10下使用…

 类似资料:
  • 这是我第一次使用堆栈溢出,我的编码技术非常糟糕,我正在使用一个历史tos的NetCDF文件。我想提取特定lat和lon的tos数据。我有一个三维数组中的tos数据,lon和lat分别在一个二维矩阵中。问题是,我选择的lon和lat的行列组合与tos数组的行-列组合不一致。下面是我目前掌握的代码 我被困在这里,因为我的纬度和纬度矩阵的行和列数与 tos day1 数组的行和列号不对应。 如果你不明白

  • 我有海洋pH、o2等的全球4D NetCDF文件。每个文件有1个变量和4个维度(时间、经度、纬度和深度)。我希望从不包含NA的每个单元格的最底部深度提取数据。我尝试使用带有负超实验室的NCO的nks: 但是,这只为我提供了最深的箱(即-5700米深度箱)的数据,输出了海洋中所有较浅区域的NaN。有没有办法以类似的方式提取数据,但指定我想要每个单元格最深的非 NaN 值? 我能够使用 R、CDO 或

  • 我有一个R代码,它从单个. nc4文件中提取每个月的每日值。我有49个netcdf文件。我想使用循环从所有这些文件中提取数据并将它们写入唯一的csv文件中。 我有一个文件的代码,但我需要多个文件的帮助。

  • 一个与R有关的新手问题。如何使用R从netdcf文件中提取特定位置的时间序列数据。例如,下面的快照显示位置(1、2)的时间序列为13、28、43。 提前谢谢。

  • 我有许多坐标(大约20000),我需要从许多NetCDF文件中提取数据,每个文件大约有30000个时间步(未来的气候场景)。使用这里的解决方案效率不高,原因是每个i,j将“dsloc”转换为“dataframe”所花费的时间(请看下面的代码)。**可以从这里下载NetCDF文件示例** 结果是: 这意味着每个i、j需要大约9秒来处理。考虑到大量的坐标和netcdf文件以及大量的时间步长,我想知道是

  • 我有一个大约350个坐标的列表,这些坐标是指定区域内的坐标,我想使用Xarray从netCDF文件中提取这些坐标。如果它是相关的,我试图从一个特定的地表模型中提取SWE(雪水当量)数据。 我的问题是这个 for 循环需要永远遍历列表中的每个项目并获取相关的时间序列数据。也许在某种程度上这是不可避免的,因为我必须从每个坐标的 netCDF 文件中实际加载数据。我需要帮助的是以任何可能的方式加速代码。