When the coordinate variables for a horizontal grid are not longitude
and latitude, it is required that the true latitude and longitude
coordinates be supplied via the coordinates
attribute.
If in addition it is desired to describe the mapping between the
given coordinate variables and the true latitude and longitude
coordinates, the attribute grid_mapping
may be
used to supply this description. This attribute is attached to data
variables so that variables with different mappings may be present
in a single file. The attribute takes a string value which is the
name of another variable in the file that provides the description
of the mapping via a collection of attached attributes. This variable
is called a grid mapping variable and is of
arbitrary type since it contains no data. Its purpose is to act as
a container for the attributes that define the mapping. The one
attribute that all grid mapping variables must have is
grid_mapping_name
which takes a string value that
contains the mapping's name. The other attributes that define a
specific mapping depend on the value of
grid_mapping_name
. The valid values of
grid_mapping_name
along with the attributes
that provide specific map parameter values are
described in Appendix F, Grid Mappings.
When the coordinate variables for a horizontal grid are longitude
and latitude, a grid mapping variable with grid_mapping_name
of latitude_longitude
may be used to specify the
ellipsoid and prime meridian.
In order to make use of a grid mapping to directly calculate latitude
and longitude values it is necessary to associate the coordinate
variables with the independent variables of the mapping.
This is done by assigning a standard_name
to
the coordinate variable. The appropriate values of the
standard_name
depend on the grid mapping and
are given in Appendix F, Grid Mappings.
Example 5.6. Rotated pole grid
dimensions: rlon = 128 ; rlat = 64 ; lev = 18 ; variables: float T(lev,rlat,rlon) ; T:long_name = "temperature" ; T:units = "K" ; T:coordinates = "lon lat" ; T:grid_mapping = "rotated_pole" ; char rotated_pole rotated_pole:grid_mapping_name = "rotated_latitude_longitude" ; rotated_pole:grid_north_pole_latitude = 32.5 ; rotated_pole:grid_north_pole_longitude = 170. ; float rlon(rlon) ; rlon:long_name = "longitude in rotated pole grid" ; rlon:units = "degrees" ; rlon:standard_name = "grid_longitude"; float rlat(rlat) ; rlat:long_name = "latitude in rotated pole grid" ; rlat:units = "degrees" ; rlon:standard_name = "grid_latitude"; float lev(lev) ; lev:long_name = "pressure level" ; lev:units = "hPa" ; float lon(rlat,rlon) ; lon:long_name = "longitude" ; lon:units = "degrees_east" ; float lat(rlat,rlon) ; lat:long_name = "latitude" ; lat:units = "degrees_north" ;
A CF compliant application can determine that rlon and rlat are
longitude and latitude values in the rotated grid by
recognizing the standard names grid_longitude
and grid_latitude
. Note that the units
of the rotated longitude and latitude axes are given as
degrees
. This should prevent a COARDS
compliant application from mistaking the variables
rlon
and rlat
to be
actual longitude and latitude coordinates. The entries for these
names in the standard name table indicate the appropriate sign
conventions for the units of degrees
.
Example 5.7. Lambert conformal projection
dimensions: y = 228; x = 306; time = 41; variables: int Lambert_Conformal; Lambert_Conformal:grid_mapping_name = "lambert_conformal_conic"; Lambert_Conformal:standard_parallel = 25.0; Lambert_Conformal:longitude_of_central_meridian = 265.0; Lambert_Conformal:latitude_of_projection_origin = 25.0; double y(y); y:units = "km"; y:long_name = "y coordinate of projection"; y:standard_name = "projection_y_coordinate"; double x(x); x:units = "km"; x:long_name = "x coordinate of projection"; x:standard_name = "projection_x_coordinate"; double lat(y, x); lat:units = "degrees_north"; lat:long_name = "latitude coordinate"; lat:standard_name = "latitude"; double lon(y, x); lon:units = "degrees_east"; lon:long_name = "longitude coordinate"; lon:standard_name = "longitude"; int time(time); time:long_name = "forecast time"; time:units = "hours since 2004-06-23T22:00:00Z"; float Temperature(time, y, x); Temperature:units = "K"; Temperature:long_name = "Temperature @ surface"; Temperature:missing_value = 9999.0; Temperature:coordinates = "lat lon"; Temperature:grid_mapping = "Lambert_Conformal";
An application can determine that x
and
y
are the projection coordinates by
recognizing the standard names projection_x_coordinate
and projection_y_coordinate
. The grid mapping
variable Lambert_Conformal
contains the mapping
parameters as attributes, and is associated with
the Temperature
variable via its
grid_mapping attribute
.
Example 5.8. Latitude and longitude on a spherical Earth
dimensions:
lat = 18 ;
lon = 36 ;
variables:
double lat(lat) ;
double lon(lon) ;
float temp(lat, lon) ;
temp:long_name = "temperature" ;
temp:units = "K" ;
temp:grid_mapping = "crs" ;
int crs ;
crs:grid_mapping_name = "latitude_longitude"
crs:semi_major_axis = 6371000.0 ;
crs:inverse_flattening = 0 ;
Example 5.9. Latitude and longitude on the WGS 1984 datum
dimensions:
lat = 18 ;
lon = 36 ;
variables:
double lat(lat) ;
double lon(lon) ;
float temp(lat, lon) ;
temp:long_name = "temperature" ;
temp:units = "K" ;
temp:grid_mapping = "crs" ;
int crs ;
crs:grid_mapping_name = "latitude_longitude";
crs:longitude_of_prime_meridian = 0.0 ;
crs:semi_major_axis = 6378137.0 ;
crs:inverse_flattening = 298.257223563 ;
Example 5.10. British National Grid
dimensions:
lat = 648 ;
lon = 648 ;
y = 18 ;
x = 36 ;
variables:
double x(x) ;
x:standard_name = "projection_x_coordinate" ;
x:units = "m" ;
double y(y) ;
y:standard_name = "projection_y_coordinate" ;
y:units = "m" ;
double lat(y, x) ;
double lon(y, x) ;
float temp(y, x) ;
temp:long_name = "temperature" ;
temp:units = "K" ;
temp:coordinates = "lat lon" ;
temp:grid_mapping = "crs" ;
int crs ;
crs:grid_mapping_name = "transverse_mercator";
crs:semi_major_axis = 6377563.396 ;
crs:semi_minor_axis = 6356256.910 ;
crs:inverse_flattening = 299.3249646 ;
crs:latitude_of_projection_origin = 49.0 ;
crs:longitude_of_projection_origin = -2.0 ;
crs:false_easting = 400000.0 ;
crs:false_northing = -100000.0 ;
crs:scale_factor_at_projection_origin = 0.9996012717 ;