cdtdim documentation

The cdtdim gives the approximate dimensions of each cell in a lat,lon grid assuming an ellipsoidal Earth. This function is similar to cdtarea.

Back to Climate Data Tools Contents

Contents

Syntax

[dx,dy] = cdtdim(lat,lon)
[dx,dy] = cdtdim(lat,lon,'km')

Description

[dx,dy] = cdtdim(lat,lon) gives an approximate dimensions in meters of each grid cell given by the geographical coordinate grids lat,lon. Inputs lat and lon must have matching dimensions, as if they were created by meshgrid.

[dx,dy] = cdtdim(lat,lon,'km') gives grid cell sizes in kilometers rather than the default meters.

Example 1: Cell size of a 10 degree grid

Given a 10 degree global grid made by cdtgrid.

[lat,lon] = cdtgrid(10);

Each grid cell has these dimensions:

[dx,dy] = cdtdim(lat,lon,'km');

If you look at the values of dy, you'll notice they are all the same. That's because lines of latitude are always equally spaced (one degree of latitude is about 111 km). So for our 10 degree grid, all the grid cells are unsurprisingly

unique(dy(:))
ans =
   1.0e+03 *
   -1.1132
   -1.1129
   -1.1125
   -1.1120
   -1.1113
   -1.1107
   -1.1101
   -1.1097
   -1.1095

about 1111 km apart. In the x-direction, however, each grid cell sizes depend on latitude. Here's a look at how the x dimensions of grid cells vary across the globe:

p = pcolor(lon,lat,dx);
axis image
ylabel('latitude')
xlabel('longitude')
cb = colorbar;
ylabel(cb,'grid cell zonal width (km)')

If you look closely at the map above, you may notice that the values at the top of the world do not appear to match the values at the bottom of the world. That's due to an unfortunate behavior of pcolor, which discards a row and a column of data. That behavior can be fixed by using interpolated shading or by using imagesc instead of pcolor, but I used pcolor above because it's an easy way to include grid lines.

Example 2: Visualizing grid cell sizes with global data

Here's another way to look at how grid cell sizes are calculated by cdtdim. Start by loading a sea surface temperature dataset which has a grid resolution of 0.75 degrees.

load global_sst

And currently lat and lon are vectors, so turn them into matrices the same size as sst using meshgrid:

[lon,lat] = meshgrid(lon,lat);

Now just like in Example 1, calculate the sizes dx and dy of each grid cell:

[dx,dy] = cdtdim(lat,lon,'km');

This time, instead of displaying grid cell size on an unprojected grid of lats and lons, let's turn dx and dy into effective x and y values by taking the cumulative sum of dx's and dy's:

x = cumsum(dx,2);
y = cumsum(dy,1);

We can plot the x and y locations as simply the cumulative sums starting from zero, but it's not gonna be pretty:

plot(x,y,'b.')
axis equal

It makes more sense to center those values about the origin, which can be done by removing the mean x and y values. If you have a post-2016b version of Matlab you can simply subtract x-mean(x,2) which performs implicit expansion, but us plebians with old versions of Matlab have to use bsxfun to subtract:

x = bsxfun(@minus,x,mean(x,2));
y = bsxfun(@minus,y,mean(y,1));

With the means removed, we see the grid cell calculation performed by cdtdim and cdtarea resembles a sinusoidal map projection:

pcolor(x,y,sst)
shading interp
axis image
xlabel('x distance (km)')
ylabel('y distance (km)')
cmocean 'thermal'

Author Info

This function was written by Chad A. Greene of the University of Texas Institute for Geophysics (UTIG).