⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddsnc.m

📁 matlacb程序包
💻 M
字号:
function desc = ddsnc(file)% DDSNC returns information about a netcdf file or DODS/OPEnDAP dataset%%    function desc = ddsnc(file)%% DESCRIPTION:%  ddsnc is a non-interactive function that returns information about a%  netcdf file or DODS dataset.% INPUT:%  file may be the name of a netCDF file with or it may be the URL of a%  DODS/OPEnDAP dataset. %% OUTPUT:%  desc is a matlab structure. For an OPEnDAP data set desc will contain all%  of the information in the DDS (Dataset Description Structure). For a%  netCDF file desc will be almost identical.%% EXAMPLE:% Information about the Reynolds data set can be found as follows:% >> file = 'http://www.marine.csiro.au/dods/nph-dods/dods-data/climatology-netcdf/sst.wkmean.1981-1989.nc';% >> desc = ddsnc(file)%% desc has 2 fields - variable and dimension. Looking at one element we see% >> desc.variable(4) =%%              type: 'Int16'%              name: 'sst'%     dim_statement: {'time = 427'  'lat = 180'  'lon = 360'}%        dim_idents: [3x1 double]%% The first 2 fields tell us that the variable is named 'sst' and is a 2 byte% integer. The dim_statement field tells us that the sst variable has 3% dimensions in the order given. For dim_idents we see% >> desc.variable(4).dim_idents = % >>            [3 1 2]'.%% These integers refer to the dimensions of the sst array. Looking at% >> desc.dimension(3) =%       name: 'time'%     length: 427%% we see that index 3 points us to the 3rd dimension, time and it has length% 427. A generic program could then retrieve the information by setting:% >> ii = desc.variable(4).dim_idents(1);%% and then referring to desc.dimension(ii).%% Notes% 1) Different functions are called for netcdf and opendap files. Also the% netcdf data model does not map exactly onto the opendap model. As a result the% information in desc may be arranged differently according to whether a file is% accessed as a local netcdf file or an opendap data set. Specifically, the% dimensions may be in a different order in desc and so the values in dim_idents% will be different.% 2) If file is a URL then desc will simply be the structure returned by% get_dods_dds.% $Id: ddsnc.m Mon, 03 Jul 2006 17:16:40 $% Copyright J. V. Mansbridge, CSIRO, Wed Dec 14 15:02:57 EST 2005% Check the input argumentsif nargin < 1   help ddsnc   returnend% InitialisationCSIRO_add_jar_file_maybe;[mex_name, full_name, desc_das, file_status, exe_name] = ...    choose_mexnc_opendap(file);switch mex_name case 'mexnc'    % I make mexnc calls to find the integers that specify the attribute  % types  nc_byte = mexnc('parameter', 'nc_byte'); %1  nc_char = mexnc('parameter', 'nc_char'); %2  nc_short = mexnc('parameter', 'nc_short'); %3  nc_long = mexnc('parameter', 'nc_long'); %4  nc_float = mexnc('parameter', 'nc_float'); %5  nc_double = mexnc('parameter', 'nc_double'); %6  % Store the type information in a form that refers to the dods data types.    data_type{nc_byte} = 'Byte';  data_type{nc_char} = 'String';  data_type{nc_short} = 'Int16';  data_type{nc_long} = 'Int32';  data_type{nc_float} = 'Float32';  data_type{nc_double} = 'Float64';    % Open the netcdf file.    [cdfid, rcode] = mexnc('ncopen', full_name, 'nowrite');  if rcode < 0    error(['mexnc: ncopen: rcode = ' int2str(rcode)])  end  % Don't print out netcdf warning messages  mexnc('setopts', 0);  % Collect information about the cdf file.  [num_dims, nvars, ngatts, recdim, rcode] =  mexnc('ncinquire', cdfid);  if rcode < 0    error([ 'mexnc: ncinquire: rcode = ' int2str(rcode) ])  end    % Initialise    desc.variable = [];  desc.dimension = [];    % Step through each dimension adding the appropriate parts to the desc  % structure    for ii = 1:num_dims    [dimnam, dimsiz, rcode] = mexnc('ncdiminq', cdfid, (ii - 1));    desc.dimension(ii).name = dimnam;    desc.dimension(ii).length = dimsiz;  end  % Step through each variable adding the appropriate parts to the desc  % structure    for ii = 1:nvars    [varnam, vartyp, nvdims, vdims, nvatts, rcode] = mexnc('ncvarinq', ...						  cdfid, (ii - 1));    desc.variable(ii).type = data_type{vartyp};    desc.variable(ii).name = varnam;    if nvdims == 0      desc.variable(ii).dim_statement = [];    else      for jj = 1:nvdims	str = [desc.dimension(vdims(jj) + 1).name ' = ' ...	       num2str(desc.dimension(vdims(jj) + 1).length)];	desc.variable(ii).dim_statement{jj} = str;      end    end    desc.variable(ii).dim_idents = vdims(:) + 1;  end    % Close the netcdf file.    [rcode] = mexnc('ncclose', cdfid);  if rcode < 0    error(['** ERROR ** ncclose: rcode = ' num2str(rcode)])  end   case {'loaddap', 'loaddods'}    [dds_text, desc] = get_dods_dds(full_name, exe_name);  %[desc_text, status] = urlread([full_name '.dds']);  %if ~status  %  error(['couldn''t get the dds of ' full_name])  %end case 'java'  switch file_status   case 4    [dds_text, status] = urlread([full_name '.dds']);    if ~status      error(['couldn''t get the dds of ' file])    end    desc = CSIRO_organise_dds_output(dds_text);   otherwise    try      ncdJ = ucar.nc2.dataset.NetcdfDataset.openDataset(full_name);    catch      error(['The file ' file ' is not accessible'])    end    % Initialise      desc.variable = [];    desc.dimension = [];      % Step through each dimension adding the appropriate parts to the desc    % structure      dimensions_list = ncdJ.getDimensions();    num_dims = dimensions_list.size();    for ii = 1:num_dims      dim = dimensions_list.get(ii - 1);      desc.dimension(ii).name = char(dim.getName());      desc.dimension(ii).length = dim.getLength();    end        % Step through each variable adding the appropriate parts to the desc    % structure      variables_list = ncdJ.getVariables();    nvars = variables_list.size();    for ii = 1:nvars      var = variables_list.get(ii - 1);      desc.variable(ii).type = char(var.getDataType());      desc.variable(ii).name = char(var.getName());      dim_list = var.getDimensions;      nvdims = dim_list.size();      vdims = zeros(1, nvdims);      if nvdims == 0	desc.variable(ii).dim_statement = [];      else	for jj = 1:nvdims	  dim_val = dim_list.get(jj - 1);	  name_comp = char(dim_val.getName);	  for kk = 1:num_dims	    if strcmp(desc.dimension(kk).name, name_comp)	      vdims(jj) = kk;	      break	    end	  end	end		for jj = 1:nvdims	  str = [desc.dimension(vdims(jj)).name ' = ' ...		 num2str(desc.dimension(vdims(jj)).length)];	  desc.variable(ii).dim_statement{jj} = str;	end      end      desc.variable(ii).dim_idents = vdims(:);    end    ncdJ.close();  endend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -