Matlab 使用lat和long作为引用从netcdf文件中提取数据的子域

Matlab 使用lat和long作为引用从netcdf文件中提取数据的子域,matlab,latitude-longitude,subset,netcdf,Matlab,Latitude Longitude,Subset,Netcdf,我试图从一个基于纬度和经度的netcdf文件中的“tasmax”变量中提取一个特定的子域数据;经度在5到-5度之间(法国) 我的“lat”变量是105 x 102(维度:rlon,rlat,其中rlon和rlat是旋转lat长度的向量),覆盖整个欧洲 我的‘lon’变量也是105乘102(维度:rlon,还是rlat)。 lat和lon变量都是规则的lat/LONG,即不旋转 由于我只有常规的lat-long数据作为提取数据的标准,我相信我必须使用lat和lon的网格(与rlat和rlon的向量

我试图从一个基于纬度和经度的netcdf文件中的“tasmax”变量中提取一个特定的子域数据;经度在5到-5度之间(法国)

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

我的‘lon’变量也是105乘102(维度:rlon,还是rlat)。 lat和lon变量都是规则的lat/LONG,即不旋转

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

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

lat=ncread(file.nc,'lat');
lon=ncread(file.nc,'lon');
data=ncread(file.nc,'tasmax');
%tasmax为105*102*366(一年的每日数据)

%下面的for循环只是为了让我最终能够为其他区域自动化这个过程

for r=1;
%创建一个三维变量,大小为lat/lon网格,并用NAN填充。因此,最终,其中唯一的数据将是我感兴趣的区域 domainrun=NaN(105102,大小(数据,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和LON位于为该区域指定的lat和LON范围内,则每个点的索引保存在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),:);
%testlat和testlon包含 次区域

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

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


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

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

cdo sellonlatbox,-5,5,44,50 input_data.nc france.nc 
然后可以读入matlab

cdo很容易在ubuntu中安装

sudo apt-get install cdo 

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

即使你的LAT-LON不是向量,它们是否正常?i、 e“tasmax”中各点之间的间距是否一致?如果是这样的话,它基本上包含与向量相同的信息(但其中一个在行中重复,另一个在列中重复)。您可以使用NCREAD的start/count语法仅读取所需的部分。我会看看是否能在今天晚些时候发布一个例子。@ashishuthama。谢谢你的回复。不,网格正方形之间的间距不一致。它们是否至少严格按递增顺序排列?i、 你想从“矩形”中提取的区域是什么?如果不是的话,我想你所拥有的将是最好的。如果是,核心逻辑将与代码类似,您可以先读取lat和lon,找到左上和右下索引,然后使用NCREAD的START,COUNT语法选项。我不清楚如何存储数据来创建虚拟文件/示例代码。@Ashish Uthama。我想要的区域不会形成矩形,因为网格正方形会朝着极点改变大小。我将尝试上传明天要展示给大家的lat-lon数据。谢谢你的输入。@Ashish Uthama:我在这里包括了到lat lons的链接。*********************
sudo apt-get install cdo