Unidata - To provide the data services, tools, and cyberinfrastructure leadership that advance Earth system science, enhance educational opportunities, and broaden participation. Unidata
         
  advanced  
 

Standard Coordinate Transforms


A Transform is defined by creating a Coordinate Transform Variable (see Example and Reference). A variable is a Coordinate Transform Variable if one (or both) of these is true:

  1. It has a _CoordinateTransformType or _CoordinateAxisTypes attribute.
  2. It is listed in a _CoordinateTransforms attribute from any variable in the file.

Any Variable can be Coordinate Transform Variable, as it is just a container for attributes, i.e. does not use the data values of the Variable. It is common to use a vertical coordinate to be a Coordinate Transform Variable, and a dummy variable (with no useful data in it) is also common. The example here are done with dummy variables.

The CF CoordSysBuilder will add the _CoordinateTransformType attribute upon recognizing a standard_name, so adding that is optional if you are using CF Conventions. CF also requires that you use the vertical coordinate as the Coordinate Transform Variable, so that the transform will be added to any Coordinate System that uses that vertical coordinate. The CF CoordSysBuilder will thus add the _CoordinateAxes = "vertCoordName" attribute to indicate this.

The attributes of the Coordinate Transform Variable become the parameters of the transform. The following are the currently implemented transforms, and the attributes required for each. These follow the CF-1.0 Conventions Appendix D (Vertical Transforms) and Appendix F (Projections). See that document for details on the meanings of the formula terms. The algorithms are mostly taken from John Snyder, Map Projections used by the USGS, Bulletin 1532, 2nd edition (1983).

Standard Projections

These are examples of using a dummy Coordinate Transform Variable. If you are using CF Conventions, you do not have to add the _Coordinate attributes, as they will be added automatically in the CoordSysBuilder.

albers_conical_equal_area

   char Albers_Projection;
:grid_mapping_name = "albers_conical_equal_area";
:standard_parallel = 20.0, 60.0;
:longitude_of_central_meridian = -32.0;
:latitude_of_projection_origin = 40.0;
:false_easting = 0.0; :false_northing = 0.0; :_CoordinateTransformType = "Projection";
:_CoordinateAxisTypes = "GeoX GeoY";

This uses a spherical earth. See Snyder, p 98.

flat_earth

   char Flat_Earth;
:grid_mapping_name = "flat_earth";
:longitude_of_projection_origin = -132.0;
:latitude_of_projection_origin = 40.0;
:_CoordinateTransformType = "Projection";
:_CoordinateAxisTypes = "GeoX GeoY";

This is not a standard CF projection. It is used when a "flat earth" assumption is acceptable.

lambert_azimuthal_equal_area

   char Lambert_azimuth_Projection;
:grid_mapping_name = "lambert_azimuthal_equal_area"; :longitude_of_projection_origin = -32.0;
:latitude_of_projection_origin = 90.0;
:false_easting = 0.0; // km (optional) :false_northing = 0.0; // km (optional) :units = "km"; // units of false_easting, false_northing if not km :_CoordinateTransformType = "Projection";
:_CoordinateAxisTypes = "GeoX GeoY";

This uses a spherical earth. See Snyder, p 184.

lambert_conformal_conic

   char Lambert_Conformal;
:grid_mapping_name = "lambert_conformal_conic";
:standard_parallel = 33.0, 45.0; // one or two
:longitude_of_central_meridian = -97.0;
:latitude_of_projection_origin = 40.0; :false_easting = 0.0; :false_northing = 0.0;
:_CoordinateTransformType = "Projection";
:_CoordinateAxisTypes = "GeoX GeoY";

This uses a spherical earth. See Snyder, p 101.

mcidas_area

   char McIDAS_Projection;
:grid_mapping_name = "mcidas_area";
:AreaHeader = 33.0, 45.0, ...; // an integer array
:NavHeader = -97.0, ...; // an integer array
:_CoordinateTransformType = "Projection";
:_CoordinateAxisTypes = "GeoX GeoY";

The headers are read from a McIDAS Area file, and placed in the attributes as int arrays. This is not a standard CF projection.

mercator

  char Mercator_Projection;
:grid_mapping_name = "mercator";
:longitude_of_projection_origin = 110.0;
:latitude_of_projection_origin = -25.0;
:standard_parallel = 0.02;
:_CoordinateTransformType = "Projection"; :_CoordinateAxisTypes = "GeoX GeoY";

This is not a standard CF projection. This uses a spherical earth. See Snyder, p 47.

orthographic

  char Orthographic_Projection;
:grid_mapping_name = "orthographic";
:longitude_of_projection_origin = 110.0;
:latitude_of_projection_origin = -25.0;
:_CoordinateTransformType = "Projection"; :_CoordinateAxisTypes = "GeoX GeoY";

This is not a standard CF projection. This uses a spherical earth. See Snyder, p 145.

rotated_pole

 char rotated_pole;
 	 :grid_mapping_name = "rotated_latitude_longitude";
   :grid_north_pole_latitude = 37.0f; // float
   :grid_north_pole_longitude = -153.0f; // float
   :_CoordinateTransformType = "Projection";
   :_CoordinateAxisTypes = "GeoX GeoY";

The rotated latitude and longitude coordinates are identified by the standard_name attribute values grid_latitude and grid_longitude respectively. Example:

 float rlat(rlat=84);
:standard_name = "grid_latitude";
:long_name = "rotated latitude";
:units = "degrees";
:_CoordinateAxisType = "GeoY";
float rlon(rlon=90);
:standard_name = "grid_longitude";
:long_name = "rotated longitude";
:units = "degrees";
:_CoordinateAxisType = "GeoX";

The rotated longitude coordinate must be in the range [-180,180] (so there will be a problem when it crosses the dateline). Code contributed by Robert Schmunk. Added in version 4.0.

polar_stereographic

   char Polar_Stereographic;
:grid_mapping_name = "polar_stereographic";
:straight_vertical_longitude_from_pole = -32.0;
:latitude_of_projection_origin = 90.0;
:scale_factor_at_projection_origin = 0.9330127018922193;
:_CoordinateTransformType = "Projection";
:_CoordinateAxisTypes = "GeoX GeoY";

The Polar Stereographic is the Stereographic projection with origin at the north or south pole.

stereographic

   char Stereographic;
:grid_mapping_name = "stereographic";
:longitude_of_projection_origin = -32.0; // double
:latitude_of_projection_origin = 90.0; // double
:scale_factor_at_projection_origin = 0.9330127018922193; // double
:_CoordinateTransformType = "Projection"; :_CoordinateAxisTypes = "GeoX GeoY";

This uses a spherical earth. See Snyder, p 153.

transverse_mercator

   char Transverse_mercator;
:grid_mapping_name = "transverse_mercator";
:longitude_of_central_meridian = -32.0;
:latitude_of_projection_origin = 40.0;
:scale_factor_at_central_meridian = 0.9330127018922193;
:_CoordinateTransformType = "Projection"; :_CoordinateAxisTypes = "GeoX GeoY";

This uses a spherical earth. See Snyder, p 53.

UTM (Universal Transverse Mercator)

   char UTM_Projection;
:grid_mapping_name = "UTM";
:utm_zone_number = 22;
:semimajor_axis = 90.0;
:inverse_flattening = 0.9330127018922193;
:_CoordinateTransformType = "Projection"; :_CoordinateAxisTypes = "GeoX GeoY";

UTM uses an ellipsoidal earth. Code contributed from the GeoTransform package by Dan Toms, SRI International.

vertical_perspective

   char vertical_perspective_Projection;
:grid_mapping_name = "vertical_perspective";
:longitude_of_projection_origin = -97.0;
:latitude_of_projection_origin = 40.0; :height_above_earth = 0.0; // km :earth_radius = 0.0; // km (optional) :false_easting = 0.0; // optional :false_northing = 0.0; // optional
:_CoordinateTransformType = "Projection"; :_CoordinateAxisTypes = "GeoX GeoY";

This is not a standard CF projection. This uses a spherical earth. See Snyder, p 176.

Standard Vertical Transforms

These are examples of placing the Coordinate Transform parameters on the corresponding vertical coordinate (required by CF). If you are using CF Conventions, you do not have to add the _Coordinate attributes, as they will be added automatically in the CoordSysBuilder.

atmosphere_hybrid_height_coordinate

  double lev(lev=26);
:long_name = "hybrid hybrid height coordinate"; :units = "m";
:positive = "up";
:_CoordinateAxisType = "GeoZ";
:_CoordinateZisPositive = "down; :standard_name = "atmosphere_hybrid_height_coordinate";
:formula_terms = "a: varA b: varB orog: orography";
:_CoordinateTransformType = "Vertical";
:_CoordinateAxes = "lev";

atmosphere_hybrid_sigma_pressure_coordinate

  double lev(lev=26);
:long_name = "hybrid level at midpoints (1000*(A+B))"; :units = "";
:positive = "down";
:_CoordinateAxisType = "GeoZ";
:_CoordinateZisPositive = "down; :standard_name = "atmosphere_hybrid_sigma_pressure_coordinate";
:formula_terms = "a: hyam b: hybm p0: P0 ps: PS";
:_CoordinateTransformType = "Vertical";
:_CoordinateAxes = "lev";

atmosphere_sigma_coordinate

   float level(level=2);
:units = "";
:long_name = "sigma at layer midpoints";
:positive = "down"; :_CoordinateAxisType = "GeoZ";
:_CoordinateZisPositive = "down";
:standard_name = "atmosphere_sigma_coordinate";
:formula_terms = "sigma: level ps: PS ptop: PTOP";
:_CoordinateTransformType = "Vertical";
:_CoordinateAxes = "level";

ocean_s_coordinate

  double s_rho(s_rho=20);
:long_name = "S-coordinate at RHO-points";
:units = ""; :positive = "up"; :_CoordinateAxisType = "GeoZ";
:_CoordinateZisPositive = "up";
:standard_name = "ocean_s_coordinate";
:formula_terms = "s: s_rho eta: zeta depth: h a: theta_s b: theta_b depth_c: hc";
:_CoordinateTransformType = "Vertical";
:_CoordinateAxes = "s_rho";

ocean_sigma_coordinate

   float zpos(zpos=22);
:long_name = "Sigma Layer";
:units = "";
:positive = "up"; :_CoordinateAxisType = "GeoZ";
:_CoordinateZisPositive = "up";
:standard_name = "ocean_sigma_coordinate";
:formula_terms = "sigma: zpos eta: elev depth: depth";
:_CoordinateTransformType = "Vertical";
:_CoordinateAxes = "zpos";

explicit_field

  char ExplicitField;
    :standard_name = "explicit_field";  // canonical transform name
    :existingDataField = "ght_hybr";  // must be a 3 or 4D pressure / height / geopotential height field
:_CoordinateTransformType = "vertical"; // unambiguouly identifies it as vertical transform
:_CoordinateAxes = "hybr"; // attach transform to any coord sys with the "hbyr" axis.

This is not part of CF, but a way to mark an existing 3D (4D if time dependent) field as the vertical coordinate.


This document is maintained by John Caron and was last updated on May 05, 2008

 

 
 
  Contact Us     Site Map     Search     Terms and Conditions     Privacy Policy     Participation Policy
 
National Science Foundation (NSF) UCAR Office of Programs University Corporation for Atmospheric Research (UCAR)   Unidata is a member of the UCAR Office of Programs, is managed by the University Corporation for Atmospheric Research, and is sponsored by the National Science Foundation.
P.O. Box 3000     Boulder, CO 80307-3000 USA     Tel: 303-497-8643     Fax: 303-497-8690