matlab netcdf 栅格,用matlab生成GMT可以使用的netcdf文件

用matlab生成GMT可以使用的netcdf文件

作者:Kelsey Jordahl

function

grdwrite2(x,y,z,file);

%GRDWRITE2 Write a GMT grid

file

%

% Uses

built-in NetCDF capability (MATLAB R2008b or later) to

% write a

COARDS-compliant netCDF grid file

%

Duplicates (some) functionality of the program grdwrite (which

requires

%

compilation as a mexfile-based function on each architecture)

using

% Matlab

2008b (and later) built-in NetCDF functionality

% instead

of GMT libraries.

%

%

GRDWRITE2(X,Y,Z,'filename') will create a grid file containing

the

% data in

the matrix Z. X and Y should be

either vectors with

%

dimensions that match the size of Z or two-component

vectors

%

containing the max and min values for each.

%

% See also

GRDREAD2, GRDINFO2

% For more

information on GMT grid file formats, see:

%

http://www.soest.hawaii.edu/gmt/gmt/doc/gmt/html/GMT_Docs/node70.html

% Details

on Matlab's native netCDF capabilities are at:

%

http://www.mathworks.com/access/helpdesk/help/techdoc/ref/netcdf.html

% Kelsey

Jordahl

%

Marymount Manhattan College

%

http://marymount.mmm.edu/faculty/kjordahl/software.html

%

Time-stamp: 6 16:37:11 EST

2010>

% Version

1.1.1, 6-Jan-2010

% first

released on MATLAB Central

if nargin

< 4,

help(mfilename);

return,

end

% check

for appropriate Matlab version (>=7.7)

V=regexp(version,'[ \.]','split');

if

(str2num(V{1})<7) | (str2num(V{1})==7 &

str2num(V{2})<7),

ver

error('grdread2: Requires Matlab R2008b or later!');

end

ncid =

netcdf.create(file, 'CLASSIC_MODEL');

if

isempty(ncid),

return,

end

% set

descriptive variables

conv='COARDS/CF-1.0';

title=file;

history='File written by MATLAB function

grdwrite2.m';

desc=['Created ' datestr(now)];

vers='4.x';

% is "x" OK?

% check X

and Y

if

(~isvector(x) | ~isvector(y)),

error('X and Y must be vectors!');

end

if

(length(x) ~= size(z,2)),

% number of columns don't match size of x

minx=min(x); maxx=max(x);

dx=(maxx-minx)/(size(z,2)-1);

x=minx:dx:maxx;

% write as a vector

end

if

(length(y) ~= size(z,1)),

% number of rows don't match size of y

miny=min(y); maxy=max(y);

dy=(maxy-miny)/(size(z,1)-1);

y=miny:dy:maxy;

%

write as a vector

end

% match

Matlab class to NetCDF data type

switch

class(z)

case

'single'

nctype='NC_FLOAT';

nanfill=single(NaN);

case

'double'

nctype='NC_DOUBLE';

nanfill=double(NaN);

case 'int8'

nctype='NC_BYTE';

nanfill=intmin(class(z));

disp(['Warning: ''No data'' fill value set to '

num2str(nanfill)])

case

'int16'

nctype='NC_SHORT';

nanfill=intmin(class(z));

disp(['Warning: ''No data'' fill value set to '

num2str(nanfill)])

case

'int32'

nctype='NC_INT';

nanfill=intmin(class(z));

disp(['Warning: ''No data'' fill value set to '

num2str(nanfill)])

otherwise

error(['Don''t know how to handle data of class ''' class(z)

'''. Try

converting to a supported data type (int8, int16, int32, single or

double).'])

end

%

global

netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Conventions',conv);

netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'title',title);

netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'history',history);

netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'description',desc);

netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'GMT_version',vers);

%

X

dimid =

netcdf.defDim(ncid,'x',length(x));

varid =

netcdf.defVar(ncid,'x','double',dimid);

netcdf.putAtt(ncid,varid,'long_name','x');

netcdf.putAtt(ncid,varid,'actual_range',[min(x)

max(x)]);

netcdf.endDef(ncid);

netcdf.putVar(ncid,varid,x);

%

Y

netcdf.reDef(ncid);

dimid =

netcdf.defDim(ncid,'y',length(y));

varid =

netcdf.defVar(ncid,'y','double',dimid);

netcdf.putAtt(ncid,varid,'long_name','y');

netcdf.putAtt(ncid,varid,'actual_range',[min(y)

max(y)]);

netcdf.endDef(ncid);

netcdf.putVar(ncid,varid,y);

%

Z

netcdf.reDef(ncid);

varid =

netcdf.defVar(ncid,'z',nctype,[0 1]);

netcdf.putAtt(ncid,varid,'long_name','z');

netcdf.putAtt(ncid,varid,'_FillValue',nanfill);

netcdf.putAtt(ncid,varid,'actual_range',[min(z(:))

max(z(:))]);

netcdf.endDef(ncid);

netcdf.putVar(ncid,varid,z');

% close

file

netcdf.close(ncid);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值