Changes between Version 16 and Version 17 of PointObservationConventions


Ignore:
Timestamp:
05/24/10 19:00:15 (10 years ago)
Author:
caron
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • PointObservationConventions

    v16 v17  
    1 = Chapter 9 Point Observation Data =
    2 
    3 Chapter 5 explains how to specify Coordinate Systems using coordinate variables and auxiliary coordinate variables. This section extends and modifies that framework for point observational data, and sections 5.4 and 5.5 are deprecated.
     1= Chapter 9 Discrete Sampling Geometries =
     2
     3Chapter 5 explains how to specify Coordinate Systems using coordinate variables and auxiliary coordinate variables. This section extends and modifies that framework for data with discrete sampling geometries, previously called "point observation data".
    44
    55== 9.1 Overview ==
    66
    7 A '''point observation''' is a data measurement at a specific time and location. Each kind of measured data is placed in a data variable. The time and location values are placed into coordinate variables and auxiliary coordinate variables.
    8 
    9 Point data files contain collections of point observation data of one of the following '''point feature types''', which reflect the connectedness of common observational datasets in the earth sciences:
     7A '''discrete sampled observation''' is a data measurement at a specific time and location. Each type of measured data ('''parameter''') is placed in a netCDF data variable. The time and location values of the observation are placed into coordinate variables and auxiliary coordinate variables.
     8
     9The intent of Chapter 9 is to define mechanisms for storing collections of discrete sampled observations in a single file.  The types of collections, called '''feature types''' that are specified here are:
    1010
    1111    * '''point''': one or more parameters measured at a set of points in time and space
    12     * '''stationTimeSeries''': a time-series of data points at the same location, with varying time
     12    * '''timeSeries''': a time-series of data points at the same location, with varying time
    1313    * '''trajectory''': a connected set of data points along a 1D curve in time and space
    1414    * '''profile''': a set of data points along a vertical line
    15     * '''stationProfile''': a time-series of profiles at a named location
    16     * '''section''':  a collection of profiles which originate along a trajectory.
    17 
    18 You cannot mix multiple types of data in the same file. A global attribute CF:featureType indicates the feature type used in a particular file, and its value must be one of the above names in order to be correctly processed as point observation data. (The use of the prefix CF: assumes that TRAC ticket #27 passes, will be removed/changed if needed)
    19 
    20 All point data must have lat, lon and time coordinate or auxiliary coordinate variables, which are identified according to Chapter 4 and 5 of this document. Some feature types allow the vertical coordinate to be optional, and some require it.
    21 
    22 There are two main ways to represent point data in the classic netCDF model:
     15    * '''timeSeriesProfile''': a time-series of profiles at a named location
     16    * '''trajectoryProfile''':  a collection of profiles which originate along a trajectory.
     17
     18This version of CF is restricted to a single feature type per file. Future versions of CF may generalize this to allow multiple feature types. The feature type is specified by a global attribute CF:featureType, and must have a value of one of the above feature types.
     19
     20For CF-1.5, the global attribute CF:featureType is required except to allow backwards compatibility with previous examples (see section ??).  New file writers are strongly encouraged to add CF:featureType in all cases.
     21
     22There are two main ways to represent discrete data in the classic netCDF model:
    2323
    2424    * the '''multidimensional (rectangular array) representation''' is simpler but requires that the same amount of space be reserved for each feature stored in the file
    2525    * the '''ragged array representation''' allows different features to be stored with different lengths in the file
    2626
    27 The following subsections detail each point feature types and show examples of the possible representations of each.
    28 
    29 Certain assumption are common to all representations:
     27The following subsections detail each discrete feature type and show examples of the possible representations of each.
     28
     29== 9.1.1 Coordinates ==
    3030 
    31     * the lat, lon and time coordinates must always exist; a vertical coordinate may exist
    32     * auxiliary coordinates may use missing values to indicate that the point observation should be skipped.
    33     * coordinates are identified with the "coordinates" attribute on the data variables, as specified in Chapter 4 and 5
    34     * index numbering, if used, is always 0 based
    35     * variables are associated together by having a common, outer dimension
     31It is required that observations can be geospatially and time located by information self-contained in the file, therefore:
     32        1. The coordinates attribute must identify the variables needed to geospatially position and time locate the observation. The lat, lon and time coordinates must always exist; a vertical coordinate may exist.
     33        2. The geospatial/time location must be unambiguous, and so the coordinates attribute must not point to multiple lat, lon, alt/depth or time coordinates. 
     34        3. The coordinates attribute may optionally include other station info, such as station name and other metadata.
     35        4. If a useful station name exists, that name should be included as a station variable and the attribute standard_name = "station_id" should be included on this variable.
     36
     37The vertical coordinate is optional but strongly recommended. It must be identified as specified in chapter 4.3. The use of the attribute axis="Z" is recommended for clarity. A standard_name attribute that clarifies the reference surface is recommended, e.g.  "altitude", "height", "height_above_reference_ellipsoid", "geopotential_height". See CF Standard Name Table for details.
     38
     39For coordinates that are connected, coordinate bounds are specified following section 7.1 "Bounds for 1-D coordinate variables". For coordinates that are not connected, follow section 7.1 "Bounds for 2-D coordinate variables with 4-sided cells" and "Bounds for multi-dimensional coordinate variables with p-sided cells".
     40
     41== 9.1.2 Missing Data ==
     42
     43Auxiliary coordinates may use missing values to indicate that the observation should be skipped. The data variables that use these coordinates should also have missing values wherever the auxiliary coordinate does, although a reader may check just the coordinate values to infer missing data.
    3644
    3745
    3846== 9.2 Point Data ==
    3947
    40 To represent data at scattered, unconnected points, both data and coordinates use the same, single dimension. The 'coordinates' attribute is used on the data variables to unambiguously identify the time, lat, lon, and vertical auxiliary coordinate variables.
     48To represent data at scattered, unconnected locations, both data and coordinates use the same, single dimension. The 'coordinates' attribute is used on the data variables to unambiguously identify the time, lat, lon, and vertical auxiliary coordinate variables.
    4149
    4250{{{
     
    5563    lat:units = "degrees_north" ;
    5664  float alt(obs) ;
    57     alt:long_name = "altitude above MSL" ;
     65    alt:long_name = "vertical distance above the surface" ;
     66    alt:standard_name = "height" ;
    5867    alt:units = "m";
    5968    alt:positive = "up";
     69    alt:axis = "Z";
    6070
    6171  float humidity(obs) ;
     
    7686
    7787
    78 == 9.3 Time series of Station Data ==
    79 
    80 Point data may be taken at a set of named locations called stations. The set of observations at a particular station, if ordered by time, is a time series, and the file contains a collection of stationTimeSeries features.
    81 
    82 Some assumption are common to all stationTimeSeries representations:
     88== 9.3 Time Series Data ==
     89
     90Discrete data may be taken at a set of named locations called stations. The set of observations at a particular station, if ordered by time, is a time series, and the file contains a collection of timeSeries features.
     91
     92Some assumption are common to all timeSeries representations:
    8393
    8494   * The outer dimension of the latitude and longitude coordinates (which must agree) is the 'station dimension'.
    8595   * All variables that have the station dimension as their outer dimension are considered to be station information, and are called 'station variables'.
    86    * There must always be a station variable (of any type) with standard_name attribute "'''station_id'''", whose values uniquely identify the station.
     96   * It is strongly recommended that there always be a station variable (of any type) with standard_name attribute "'''station_id'''", whose values uniquely identify the station.
    8797   * The station_id variable may use missing values. This allows one to reserve more space than is needed for stations.
    88    * There may be station variables with standard_name attribute "'''station_desc'''", "'''station_altitude'''", and "'''station_WMO_id'''"..
     98   * It is recommended to add station variables with standard_name attribute "'''station_desc'''", "'''surface_altitude'''", and "'''station_WMO_id'''" when applicable.
    8999
    90100=== 9.3.1 Multidimensional representation ===
    91101
    92 When the numbers of observations at each station are the same, one can use the multidimensional representation:
     102When the numbers of observations at each location are the same, one can use the multidimensional representation:
    93103
    94104{{{
     
    105115    lat:units = "degrees_north" ;
    106116  float alt(station) ;
    107     alt:long_name = "altitude above MSL" ;
    108     alt:units = "m" ;
    109     alt:positive= "up" ;
     117    alt:long_name = "vertical distance above the surface" ;
     118    alt:standard_name = "height" ;
     119    alt:units = "m";
     120    alt:positive = "up";
     121    alt:axis = "Z";
    110122  char station_name(station, name_strlen) ;
    111123    station_name:long_name = "station name" ;
     
    113125  int station_info(station) ;
    114126    station_info:long_name = "any kind of station info" ;
     127  float station_elevation(station) ;
     128    alt:long_name = "height above the geoid" ;
     129    alt:standard_name = "surface_altitude" ;
     130    alt:units = "m";
    115131
    116132  double time(station, obs) ;
     
    129145
    130146attributes:
    131     :CF\:featureType = "stationTimeSeries";
     147    :CF\:featureType = "timeSeries";
    132148}}}
    133149
    134150The humidity(s,i) and temp(s,i) data are associated with the coordinate values time(s,i), lat(s), lon(s), and optionally vertical(s). The station dimension may be the unlimited dimension or not.
    135151
    136 The time coordinate may use a missing value, which indicates that data is missing for that station and obs index. This allows one to have a variable number of observations at different stations, at the cost of some wasted space. The data variables may also use missing data values, to indicate that just that data variable is missing. If all the time values are identical for all stations, you may use time(obs) or time(time) to indicate this.
    137 
    138 Note that this is a generalization of Example 5.4, which assumes that all the stations have observations with the same time coordinates.
     152The time coordinate may use a missing value, which indicates that data is missing for that location and obs index. This allows one to have a variable number of observations at different stations, at the cost of some wasted space. The data variables may also use missing data values, to indicate that just that data variable is missing. If all the time values are identical for all timeSeries, you may use time(obs) or time(time) to indicate this.
     153
     154Note that this is a generalization of Example 5.4, which assumes that all the timeSeries have observations with the same time coordinates.
    139155
    140156=== 9.3.2 Ragged array (contiguous) representation ===
    141157
    142 When the number of observations at each station vary, one can use the 'contiguous ragged array' representation if you are able to completely control the order in which the observations are written. Add a '''row_size''' station variable specifying the number of observations for each station. The observations for each station are stored sequentially, first for the station with index = 0, then the station with index = 1, etc.
     158When the number of observations at each location vary, one can use the 'contiguous ragged array' representation if you are able to completely control the order in which the observations are written. Add a '''CF:ragged_row_count''' station variable specifying the number of observations for each timeSeries. The observations for each timeSeries are stored sequentially, first for the timeSeries with index = 0, then the timeSeries with index = 1, etc.
    143159
    144160{{{
     
    155171    lat:units = "degrees_north" ;
    156172  float alt(station) ;
    157     alt:long_name = "altitude above MSL" ;
    158     alt:units = "m" ;
     173    alt:long_name = "vertical distance above the surface" ;
     174    alt:standard_name = "height" ;
     175    alt:units = "m";
     176    alt:positive = "up";
     177    alt:axis = "Z";
    159178  char station_name(station, name_strlen) ;
    160179    station_name:long_name = "station name" ;
     
    164183  int row_size(station) ;
    165184    row_size:long_name = "number of observations for this station " ;
    166     row_size:standard_name = "ragged_row_size" ;
     185    row_size:CF\:ragged_row_count = "obs" ;
    167186
    168187  double time(obs) ;
     
    180199
    181200attributes:
    182     :CF\:featureType = "stationTimeSeries";
    183 }}}
    184 
    185 Then for each station with index stn, its observations go from
     201    :CF\:featureType = "timeSeries";
     202}}}
     203
     204Then for each timeSeries with index stn, its observations go from
    186205
    187206{{{
     
    195214}}}
    196215
    197 The row_size variable contains the number of observations for each station, and is identified by having a standard_name of "'''ragged_row_size'''". It must have the station dimension as its single dimension, and must be type integer.
     216The row_size variable contains the number of observations for each timeSeries, and is identified by having an attribute with name "'''CF:ragged_row_count'''" whose value is the observation dimension being counted. It must have the station dimension as its single dimension, and must be type integer.
    198217
    199218The single dimension of the time coordinate is the obs dimension. All variables having the obs dimension as their outer dimension are observation variables. The obs dimension may use the unlimited dimension or not.
     
    201220=== 9.3.3 Ragged array (indexed) representation ===
    202221
    203 When the number of observations at each station vary, and the observations cannot be written in order, one can use the 'indexed ragged array' representation. Add a '''parent_index''' observation variable specifying the station index that the observation belongs to:
     222When the number of observations at each location vary, and the observations cannot be written in order, one can use the 'indexed ragged array' representation. Add a '''CF:ragged_row_index''' observation variable specifying the station index that the observation belongs to:
    204223
    205224{{{
     
    216235    lat:units = "degrees_north" ;
    217236  float alt(station) ;
    218     alt:long_name = "altitude above MSL" ;
    219     alt:units = "m" ;
     237    alt:long_name = "vertical distance above the surface" ;
     238    alt:standard_name = "height" ;
     239    alt:units = "m";
     240    alt:positive = "up";
     241    alt:axis = "Z";
    220242  char station_name(station, name_strlen) ;
    221243    station_name:long_name = "station name" ;
     
    226248  int stationIndex(obs) ;
    227249    stationIndex:long_name = "which station this obs is for" ;
    228     stationIndex:standard_name = "ragged_parent_index" ;
     250    stationIndex:CF\:ragged_row_index= "station" ;
    229251  double time(obs) ;
    230252    time:long_name = "time of measurement" ;
     
    241263
    242264attributes:
    243     :CF\:featureType = "stationTimeSeries";
    244 }}}
    245 
    246 The humidity(i) and temp(i) data are associated with the coordinate values time(i), lat(s), lon(s), and optionally alt(s), where s = stationIndex(i). The stationIndex variable is identified by having a standard_name of "'''ragged_parent_index'''".  It must have the obs dimension as its single dimension, and must be type integer.
     265    :CF\:featureType = "timeSeries";
     266}}}
     267
     268The humidity(i) and temp(i) data are associated with the coordinate values time(i), lat(s), lon(s), and optionally alt(s), where s = stationIndex(i). The stationIndex variable is identified by having an attribute with name of "'''CF:ragged_row_index'''" whose value is the parent dimension.  It must have the obs dimension as its single dimension, and must be type integer. The values in the stationIndex variable are the station indices that the observation belongs to. All indices are zero based.
    247269
    248270The single dimension of the time coordinate is the obs dimension. All variables having the obs dimension as their outer dimension are observation variables. The obs dimension may use the unlimited dimension or not.
    249271
    250 === 9.3.4 Single station ===
    251 
    252 When there is a single station in the file, one can can use the multidimensional representation with number of stations = 1. One can also use scalar coordinates. This case is identified when the lat and lon coordinates are scalar. In this case, no connecting variable between station and observations is required, since they all belong to the same station. However, the station_id variable is still required, and must be a scalar (or 1D char).
    253 
     272=== 9.3.4 Single timeSeries ===
     273
     274When there is a single timeSeries in the file, one can can use the multidimensional representation with number of stations = 1. One can also use scalar coordinates. This case is identified when the lat and lon coordinates are scalar. In this case, no connecting variable between station and observations is required, since they all belong to the same station.
    254275{{{
    255276dimensions:
     
    264285    lat:long_name = "station latitude" ;
    265286    lat:units = "degrees_north" ;
    266   float alt ;
    267     alt:long_name = "altitude above MSL" ;
    268     alt:units = "m" ;
     287  float alt(station) ;
     288    alt:long_name = "vertical distance above the surface" ;
     289    alt:standard_name = "height" ;
     290    alt:units = "m";
     291    alt:positive = "up";
     292    alt:axis = "Z";
    269293  char station_name(name_strlen) ;
    270294    station_name:long_name = "station name" ;
     
    286310
    287311attributes:
    288     :CF\:featureType = "stationTimeSeries";
     312    :CF\:featureType = "timeSeries";
    289313}}}
    290314
     
    304328    lat:long_name = "station latitude" ;
    305329    lat:units = "degrees_north" ;
    306   float alt(obs) ;
    307     alt:long_name = "altitude above MSL" ;
    308     alt:units = "m" ;
     330  float alt(station) ;
     331    alt:long_name = "vertical distance above the surface" ;
     332    alt:standard_name = "height" ;
     333    alt:units = "m";
     334    alt:positive = "up";
     335    alt:axis = "Z";
    309336  int station_id(obs) ;
    310337    station_name:long_name = "station" ;
     
    325352
    326353attributes:
    327     :CF\:featureType = "stationTimeSeries";
    328 }}}
    329 
    330 The humidity(i) and temp(i) data are associated with the coordinate values time(i), lat(i), lon(i), and optionally alt(i). All observations with the same station_id are assumed to belong to that station.
    331 
    332 In some observational networks, station location may change. However, for station feature types this should be infrequent and not overly consequential. In principle, a new station identifier should be assigned. In practice, occasional and small adjustments to station location may not matter for typical processing of data for visualization, and generic clients may not detect these changes, eg they may assume that the first location encountered is valid for all other observations at the same station. Specialized clients, of course, may be more careful in examining station location data, and nothing prevents data providers from using a factored representation as in 9.3.1, 9.3.2, and 9.3.3, and also putting location information into the observation record, as in the flattened representation in 9.3.5.
     354    :CF\:featureType = "timeSeries";
     355}}}
     356
     357The humidity(i) and temp(i) data are associated with the coordinate values time(i), lat(i), lon(i), and optionally alt(i). All observations with the same station_id are assumed to belong to that timeSeries.
     358
     359In some observational networks, station location may change. However, for timeSeries feature types this should be infrequent and not overly consequential. In principle, a new station identifier should be assigned. In practice, occasional and small adjustments to station location may not matter for typical processing of data for visualization, and generic clients may not detect these changes, eg they may assume that the first location encountered is valid for all other observations at the same station. Specialized clients, of course, may be more careful in examining station location data, and nothing prevents data providers from using a factored representation as in 9.3.1, 9.3.2, and 9.3.3, and also putting location information into the observation record, as in the flattened representation in 9.3.5.
    333360
    334361
     
    339366Some assumptions are common to all trajectory representations:
    340367
    341    * There must always be a variable (of any type) with standard_name attribute "'''trajectory_id'''", whose values uniquely identify the trajectory.
     368   * It is strongly recommended that there always be variable (of any data type) with standard_name attribute "'''trajectory_id'''", whose values uniquely identify the trajectory.
    342369   * The outer dimension of the trajectory_id variable is the 'trajectory dimension'.
    343370   * All variables that have the trajectory dimension as their only dimension are considered to be information about that trajectory
     
    374401    z:units = "km" ;
    375402    z:positive = "up" ;
     403    z:axis = "Z" ;
    376404
    377405  float O3(trajectory, obs) ;
     
    418446    z:units = "km" ;
    419447    z:positive = "up" ;
     448    z:axis = "Z" ;
    420449
    421450  float O3(time) ;
     
    442471=== 9.4.3 Ragged array (contiguous) representation ===
    443472
    444 When the number of observations for each trajectory varies, and one can control the order of writing, one can use the contiguous ragged array representation. One stores the set of observations for each trajectory contiguously along the obs dimension, and adds a row_size variable specifying the number of observations for each trajectory:
     473When the number of observations for each trajectory varies, and one can control the order of writing, one can use the contiguous ragged array representation. One stores the set of observations for each trajectory contiguously along the obs dimension, and adds a '''CF:ragged_row_count''' variable specifying the number of observations for each trajectory:
    445474
    446475{{{
     
    454483  int rowSize(trajectory) ;
    455484    rowSize:long_name = "number of obs for this trajectory " ;
    456     rowSize:standard_name = "ragged_row_size" ;
     485    rowSize:CF\:ragged_row_count = "obs" ;
    457486
    458487  double time(obs) ;
     
    469498    z:units = "km" ;
    470499    z:positive = "up" ;
     500    z:axis = "Z" ;
    471501
    472502  float O3(obs) ;
     
    487517The O3(i) and NO3(i) data are associated with the coordinate values time(i), lat(i), lon(i), and alt(i). All observations for one trajectory are contiguous along the obs dimension, and should be time ordered. All variables that have trajectory as their single dimension are considered to be information about that trajectory. The obs dimension may use the unlimited dimension or not.
    488518
    489 The row_size variable contains the number of observations for each trajectory, and is identified by having a standard_name of "ragged_row_size". It must have the trajectory dimension as its single dimension. The observations are associated with the trajectory using the same algorithm as in 9.3.2.
     519The row_size variable contains the number of observations for each trajectory, and is identified by having an attribute with name "'''CF:ragged_row_count'''" whose value is the observation dimension being counted. It must have the trajectory dimension as its single dimension, and must be type integer. The observations are associated with the trajectory using the same algorithm as in 9.3.2.
    490520
    491521=== 9.4.4 Ragged array (indexed) representation ===
    492522
    493 When the number of observations at each trajectory vary, and the observations cannot be written in order, one can use the indexed ragged array representation. Add a parent_index field specifying the trajectory index that the observation belongs to:
     523When the number of observations at each trajectory vary, and the observations cannot be written in order, one can use the indexed ragged array representation. Add a '''CF:ragged_row_index''' observation variable specifying the trajectory index that the observation belongs to:
    494524
    495525{{{
     
    500530variables:
    501531  char trajectory(trajectory, name_strlen) ;
    502      trajectory:standard_name = "trajectory_id";
     532    trajectory:standard_name = "trajectory_id";
    503533
    504534  int trajectory_index(obs) ;
    505535    trajectory_index:long_name = "index of trajectory this obs belongs to " ;
    506     trajectory_index:standard_name = "ragged_parent_index" ;
     536    trajectory_index:CF\:ragged_row_index= "trajectory" ;
    507537  double time(obs) ;
    508538    time:long_name = "time" ;
     
    517547    z:long_name = "height above mean sea level" ;
    518548    z:units = "km" ;
    519     z:positive = "up" ;
     549    z:positive = "up" ;
     550    z:axis = "Z" ; 
    520551
    521552  float O3(obs) ;
     
    534565
    535566
    536 The O3(i) and NO3(i) data are associated with the coordinate values time(i), lat(i), lon(i), and alt(i). All observations for one trajectory will have the same trajectory index value, and should be time ordered. The obs dimension may use the unlimited dimension or not.
    537 
    538 The parent_index variable is identified by having a standard_name of "ragged_parent_index". It must have the obs dimension as its single dimension.
     567The O3(i) and NO3(i) data are associated with the coordinate values time(i), lat(i), lon(i), and alt(i). All observations for one trajectory will have the same trajectory index value, and should be time ordered. The obs dimension may use the unlimited dimension or not. All indices are zero based.
     568
     569The trajectory_index variable is identified by having an attribute with name of "'''CF:ragged_row_index'''" whose value is the trajectory dimension name.
    539570
    540571 
     
    545576Some assumptions are common to all profile representations:
    546577
    547    * There must always be a variable (of any type) with standard_name attribute "'''profile_id'''", whose values uniquely identify the profile.
     578   * It is strongly recommended that there always be a variable (of any type) with standard_name attribute "'''profile_id'''", whose values uniquely identify the profile.
    548579   * The outer dimension of the profile_id variable is the 'profile dimension'.
    549580   * All variables that have the profile dimension as their only dimension are considered to be information about that profile
     
    576607    alt:units = "km" ;
    577608    alt:positive = "up" ;
     609    alt:axis = "Z" ; 
    578610
    579611  float pressure(profile, z) ;
     
    610642
    611643variables:
    612 
    613644  int profile ;
    614645    profile:standard_name = "profile_id";
     646
    615647  double time;
    616648    time:long_name = "time" ;
     
    627659    alt:units = "km" ;
    628660    alt:positive = "up" ;
     661    alt:axis = "Z" ; 
    629662
    630663  float pressure(z) ;
     
    652685=== 9.5.3 Ragged array (contiguous) representation ===
    653686
    654 When the number of vertical levels for each profile varies, one can use the contiguous ragged array representation. One stores the set of observation for each profile contiguously along the obs dimension, and adds a row_size variable specifying the number of observations for each profile:
     687When the number of vertical levels for each profile varies, one can use the contiguous ragged array representation. One stores the set of observation for each profile contiguously along the obs dimension, and adds a '''CF:ragged_row_count''' variable specifying the number of observations for each profile:
    655688
    656689{{{
     
    673706  int rowSize(profile) ;
    674707    rowSize:long_name = "number of obs for this profile " ;
    675     rowSize:standard_name = "ragged_row_size" ;
     708    rowSize:CF\:ragged_row_count = "obs" ;
    676709
    677710  float z(obs) ;
     
    679712    z:units = "km" ;
    680713    z:positive = "up" ;
     714    z:axis = "Z" ; 
    681715
    682716  float pressure(obs) ;
     
    699733}}}
    700734
    701 The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(p), and lon(p), where p is found by reading the rowSize variable values. The time coordinate may depend on z also, e.g. time(p,z).
     735The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(p), and lon(p), where p is found by reading the rowSize variable values as in 9.3.4. The time coordinate may depend on z also, e.g. time(p,z).
    702736
    703737=== 9.5.4 Ragged array (indexed) representation ===
    704738
    705 When the number of vertical levels for each profile varies, and one cant write them contiguously, one can use the indexed ragged array representation. Add a parent_index field specifying the profile index that the observation belongs to:
     739When the number of vertical levels for each profile varies, and one cant write them contiguously, one can use the indexed ragged array representation. Add a '''CF:ragged_row_index" field specifying the profile index that the observation belongs to:
    706740
    707741{{{
     
    725759  int parentIndex(obs) ;
    726760    parentIndex:long_name = "index of profile " ;
    727     parentIndex:standard_name = "ragged_parent_index" ;
    728 
     761    parentIndex:CF\:ragged_row_index= "profile" ;
     762 
    729763  float z(obs) ;
    730764    z:long_name = "height above mean sea level" ;
    731765    z:units = "km" ;
    732766    z:positive = "up" ;
     767    z:axis = "Z" ; 
    733768
    734769  float pressure(obs) ;
     
    751786}}}
    752787
    753 The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(p), and lon(p), where p=parent_index(i). The time coordinate may depend on z also, e.g. time(p,z).
    754 
    755 
    756 == 9.6 Station Profile Data ==
    757 
    758 When profiles are taken at a set of stations, one gets a time series of profiles at each station, called a stationProfile.
    759 
    760 The same assumptions are made as with stationTimeSeries data:
     788The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(p), and lon(p), where p=parent_index(i). The time coordinate may depend on z also, e.g. time(p,z).  All indices are zero based.
     789
     790
     791== 9.6 Time Series of Profiles ==
     792
     793When profiles are taken at a set of stations, one gets a time series of profiles at each station, called a timeSeriesProfile.
     794
     795The same assumptions are made as with timeSeries data:
    761796
    762797   * The outer dimension of the latitude and longitude coordinates (which must agree) is the 'station dimension'.
    763798   * All variables that have the station dimension as their outer dimension are considered to be station information, and are called 'station variables'.
    764    * There must always be a station variable (of any type) with standard_name attribute "'''station_id'''", whose values uniquely identify the station.
     799   * It is strongly recommended that there always be station variable (of any type) with standard_name attribute "'''station_id'''", whose values uniquely identify the station.
    765800   * The station_id variable may use missing values. This allows one to reserve more space than is needed for stations.
    766    * There may be station variables with standard_name attribute "'''station_desc'''", "'''station_altitude'''", and "'''station_WMO_id'''"..
     801   * There may be station variables with standard_name attribute "'''station_desc'''", "'''surface_altitude'''", and "'''station_WMO_id'''"..
    767802
    768803=== 9.6.1 Multidimensional representation ===
    769804
    770 When storing time series of profiles at multiple stations in the same file, if there are the same number of time points for all stations, and the same number of vertical levels for every profile, one can use the multidimensional representation:
     805When storing time series of profiles at multiple stations in the same file, if there are the same number of time points for all timeSeries, and the same number of vertical levels for every profile, one can use the multidimensional representation:
    771806
    772807{{{
     
    793828    alt:units = "km" ;
    794829    alt:positive = "up" ;
     830    alt:axis = "Z" ; 
    795831
    796832  double time(station, profile ) ;
     
    815851
    816852attributes:
    817  :CF\:featureType = "stationProfile";
     853 :CF\:featureType = "timeSeriesProfile";
    818854}}}
    819855
     
    843879    station_name:standard_name = "station_id" ;
    844880    station_name:long_name = "station name" ;
    845   int station_info(station) ;
     881  int station_info;
    846882    station_name:long_name = "some kind of station info" ;
    847883
     
    849885    alt:long_name = "height above mean sea level" ;
    850886    alt:units = "km" ;
     887    alt:axis = "Z" ; 
    851888    alt:positive = "up" ;
    852889
     
    872909
    873910attributes:
    874  :CF\:featureType = "stationProfile";
     911 :CF\:featureType = "timeSeriesProfile";
    875912}}}
    876913
    877914The pressure(i,j), temperature(i,j), and humidity(i,j) data are associated with the coordinate values time(p), alt(p,i), lat, and lon. The time coordinate may depend on z also, e.g. time(profile,z). If all of the profiles use the same z coordinate, alt(profile, z) may be factored out into z(z).
    878915
    879 === 9.6.3 Ragged array of station profile time series ===
     916=== 9.6.3 Ragged array of profile time series ===
    880917
    881918When the number of profiles and levels for each station varies, one can use the ragged array representation. This uses the contiguous ragged array representation for profiles (9.5.3), and adds the (factored out) station information with station indexes (9.2.4):
     
    910947  int station_index(profile) ;
    911948    station_index:long_name = "which station this obs is for" ;
    912     station_index:standard_name = "ragged_parent_index" ;
     949    station_index:CF\:ragged_row_index = "station" ;
    913950  int row_size(profile) ;
    914951    row_size:long_name = "number of obs for this profile " ;
    915     row_size:standard_name = "ragged_row_size" ;
     952    row_size:CF\:ragged_row_count = "obs" ;
    916953
    917954  float z(obs) ;
    918955    z:long_name = "height above mean sea level" ;
    919956    z:units = "km" ;
     957    z:axis = "Z" ; 
    920958    z:positive = "up" ;
    921959
     
    936974
    937975attributes:
    938   :CF\:featureType = "stationProfile";
     976  :CF\:featureType = "timeSeriesProfile";
    939977}}}
    940978
     
    943981The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(s), and lon(s), where s = station_index(p). The time coordinate may depend on z also, e.g. time(obs) instead of time(profile).
    944982
    945 === 9.6.4 Flattened representation of multidimensional profiles ===
    946 
    947 A variation of multidimensional profiles (9.5.1) allows these to be associated into a station time series of profiles. The station information (lat, lon, station_id) is repeated in each profile:
    948 
    949 {{{
    950 dimensions:
     983== 9.7 Trajectory of Profiles ==
     984
     985When profiles are taken along a trajectory, one gets a time series of profiles called a trajectoryProfile. This looks like a collection of profiles (see 9.5), except that the profile locations are assumed to be a connected set of points along a trajectory. A single file may contain one or more such trajectoryProfile features.
     986
     987Some assumptions are common to all trajectoryProfile representations:
     988
     989   * It is strongly recommended that there always be a variable (of any type) with standard_name attribute "'''trajectory_id'''", whose values uniquely identify the trajectory.
     990   * The outer dimension of the trajectory_id variable is the 'trajectory dimension'.
     991   * All variables that have the trajectory dimension as their only dimension are considered to be information about that trajectory
     992   * The trajectory_id variable may use missing values. This allows one to reserve more space than is needed.
     993
     994=== 9.7.1 Trajectory Profile multidimensional representation ===
     995
     996If there are the same number of profiles for all trajectories, and the same number of vertical levels for every profile, one can use the multidimensional representation:
     997
     998{{{
     999dimensions:
     1000  trajectory = 22 ;
     1001  profile = 33;
    9511002  z = 42 ;
    952   profile = 142 ;
    953 
    954 variables:
    955   int profile(profile) ;
    956      profile:standard_name = "profile_id";
    957   double time(profile);
    958     time:long_name = "time" ;
    959     time:units = "days since 1970-01-01 00:00:00" ;
    960   float lon(profile);
    961     lon:long_name = "longitude" ;
    962     lon:units = "degrees_east" ;
    963   float lat(profile);
    964     lat:long_name = "latitude" ;
    965     lat:units = "degrees_north" ;
    966   char station_name(profile, name_strlen) ;
    967     station_name:long_name = "station name" ;
    968     station_name:standard_name = "station_id";
     1003
     1004variables:
     1005  int trajectory (trajectory ) ;
     1006    trajectory:standard_name = "trajectory_id" ;
     1007
     1008  float lon(trajectory, profile) ;
     1009    lon:units = "degrees_east";
     1010  float lat(trajectory, profile) ;
     1011    lat:long_name = "station latitude" ;
     1012    lat:units = "degrees_north" ;
     1013
     1014  float alt(trajectory, profile , z) ;
     1015    alt:long_name = "height above mean sea level" ;
     1016    alt:units = "km" ;
     1017    alt:positive = "up" ;
     1018    alt:axis = "Z" ; 
     1019
     1020  double time(trajectory, profile ) ;
     1021    time:long_name = "time of measurement" ;
     1022    time:units = "days since 1970-01-01 00:00:00" ;
     1023    time:missing_value = -999.9;
     1024
     1025  float pressure(trajectory, profile , z) ;
     1026    pressure:long_name = "pressure level" ;
     1027    pressure:units = "hPa" ;
     1028    pressure:coordinates = "time lon lat alt" ;
     1029
     1030  float temperature(trajectory, profile , z) ;
     1031    temperature:long_name = "skin temperature" ;
     1032    temperature:units = "Celsius" ;
     1033    temperature:coordinates = "time lon lat alt" ;
     1034
     1035  float humidity(trajectory, profile , z) ;
     1036    humidity:long_name = "relative humidity" ;
     1037    humidity:units = "%" ;
     1038    humidity:coordinates = "time lon lat alt" ;
     1039
     1040attributes:
     1041 :CF\:featureType = "trajectoryProfile";
     1042}}}
     1043
     1044The pressure(s,p,i), temperature(s,p,i), and humidity(s,p,i) data is associated with the coordinate values time(s,p), alt(s,p,i), lat(s,p), and lon(s,p).
     1045
     1046The time coordinate may depend on z also, eg time(trajectory,profile,z). If all of the profiles use the same z coordinate, alt(trajectory, profile, z) may be factored out into z(z).
     1047
     1048When there are varying number of profiles for different trajectorys, use time(trajectory, profile) with missing values. When there are varying number of levels for different profiles, use alt(trajectory, profile, z) with missing values.
     1049
     1050=== 9.7.2 Single Trajectory in the file ===
     1051
     1052If there is only one trajectory in the file, one can use a variation of 9.7.1 which removes the trajectory dimension:
     1053
     1054{{{
     1055dimensions:
     1056  profile = 33;
     1057  z = 42 ;
     1058
     1059variables:
     1060  int trajectory;
     1061    trajectory:standard_name = "trajectory_id" ;
     1062
     1063  float lon(profile) ;
     1064    lon:units = "degrees_east";
     1065  float lat(profile) ;
     1066    lat:long_name = "station latitude" ;
     1067    lat:units = "degrees_north" ;
    9691068
    9701069  float alt(profile, z) ;
     
    9721071    alt:units = "km" ;
    9731072    alt:positive = "up" ;
     1073    alt:axis = "Z" ; 
     1074
     1075  double time(profile ) ;
     1076    time:long_name = "time of measurement" ;
     1077    time:units = "days since 1970-01-01 00:00:00" ;
     1078    time:missing_value = -999.9;
    9741079
    9751080  float pressure(profile, z) ;
     
    9891094
    9901095attributes:
    991   :CF\:featureType = "stationProfile";
    992 }}}
    993 
    994 This is the same as 9.5.1, except that a station_id variable is added for each profile, which associates the profile to a station. The station information is repeated for each profile and should be the same for all profiles with the same station_id. Note that there is no station dimension, but station description, altitude and wmo_id can be specified using the standard_name attributes "'''station_desc'''", "'''station_altitude'''", and "'''station_wmoid'''".
    995 
    996 == 9.7 Section Data ==
    997 
    998 When profiles are taken along a trajectory, one gets a time series of profiles called a section. This looks like a collection of profiles (see 9.5), except that the profile locations are assumed to be a connected set of points along a trajectory.
    999 
    1000 Some assumptions are common to all section representations:
    1001 
    1002    * There must be a variable (of any type) with standard_name attribute "'''section_id'''", whose values uniquely identify the section.
    1003    * The outer dimension of the section_id variable is the 'section dimension'.
    1004    * All variables that have the section dimension as their only dimension are considered to be information about that section
    1005    * The section_id variable may use missing values. This allows one to reserve more space than is needed.
    1006 
    1007 === 9.7.1 Section multidimensional representation ===
    1008 
    1009 If there are the same number of profiles for all trajectories, and the same number of vertical levels for every profile, one can use the multidimensional representation:
    1010 
    1011 {{{
    1012 dimensions:
    1013   section = 22 ;
    1014   profile = 33;
    1015   z = 42 ;
    1016 
    1017 variables:
    1018   int section(section) ;
    1019     section:standard_name = "section_id" ;
    1020   float lon(section, profile) ;
    1021     lon:units = "degrees_east";
    1022   float lat(section, profile) ;
    1023     lat:long_name = "station latitude" ;
    1024     lat:units = "degrees_north" ;
    1025 
    1026   float alt(section, profile , z) ;
    1027     alt:long_name = "height above mean sea level" ;
    1028     alt:units = "km" ;
    1029     alt:positive = "up" ;
    1030 
    1031   double time(section, profile ) ;
    1032     time:long_name = "time of measurement" ;
    1033     time:units = "days since 1970-01-01 00:00:00" ;
    1034     time:missing_value = -999.9;
    1035 
    1036   float pressure(section, profile , z) ;
    1037     pressure:long_name = "pressure level" ;
    1038     pressure:units = "hPa" ;
    1039     pressure:coordinates = "time lon lat alt" ;
    1040 
    1041   float temperature(section, profile , z) ;
    1042     temperature:long_name = "skin temperature" ;
    1043     temperature:units = "Celsius" ;
    1044     temperature:coordinates = "time lon lat alt" ;
    1045 
    1046   float humidity(section, profile , z) ;
    1047     humidity:long_name = "relative humidity" ;
    1048     humidity:units = "%" ;
    1049     humidity:coordinates = "time lon lat alt" ;
    1050 
    1051 attributes:
    1052  :CF\:featureType = "section";
    1053 }}}
    1054 
    1055 The pressure(s,p,i), temperature(s,p,i), and humidity(s,p,i) data is associated with the coordinate values time(s,p), alt(s,p,i), lat(s,p), and lon(s,p).
    1056 
    1057 The time coordinate may depend on z also, eg time(section,profile,z). If all of the profiles use the same z coordinate, alt(section, profile, z) may be factored out into z(z).
    1058 
    1059 When there are varying number of profiles for different sections, use time(section, profile) with missing values. When there are varying number of levels for different profiles, use alt(section, profile, z) with missing values.
    1060 
    1061 === 9.7.2 Single section in the file ===
    1062 
    1063 If there is only one section in the file, one can use a variation of 9.7.1 which removes the section dimension:
    1064 
    1065 {{{
    1066 dimensions:
    1067   profile = 33;
    1068   z = 42 ;
    1069 
    1070 variables:
    1071   int section ;
    1072     section:standard_name = "section_id" ;
    1073   float lon(profile) ;
    1074     lon:units = "degrees_east";
    1075   float lat(profile) ;
    1076     lat:long_name = "station latitude" ;
    1077     lat:units = "degrees_north" ;
    1078 
    1079   float alt(profile , z) ;
    1080     alt:long_name = "height above mean sea level" ;
    1081     alt:units = "km" ;
    1082     alt:positive = "up" ;
    1083 
    1084   double time(profile ) ;
    1085     time:long_name = "time of measurement" ;
    1086     time:units = "days since 1970-01-01 00:00:00" ;
    1087     time:missing_value = -999.9;
    1088 
    1089   float pressure(profile , z) ;
    1090     pressure:long_name = "pressure level" ;
    1091     pressure:units = "hPa" ;
    1092     pressure:coordinates = "time lon lat alt" ;
    1093 
    1094   float temperature(profile , z) ;
    1095     temperature:long_name = "skin temperature" ;
    1096     temperature:units = "Celsius" ;
    1097     temperature:coordinates = "time lon lat alt" ;
    1098 
    1099   float humidity(profile , z) ;
    1100     humidity:long_name = "relative humidity" ;
    1101     humidity:units = "%" ;
    1102     humidity:coordinates = "time lon lat alt" ;
    1103 
    1104 attributes:
    1105  :CF\:featureType = "section";
    1106 }}}
    1107 
    1108 === 9.7.3 Ragged array of section data ===
    1109 
    1110 When the number of profiles and levels for each station varies, one can use the ragged array representation. This uses the contiguous ragged array representation for profiles (9.5.3), and adds section information with section indexes:
     1096 :CF\:featureType = "trajectoryProfile";
     1097}}}
     1098
     1099=== 9.7.3 Ragged array of trajectoryProfile data ===
     1100
     1101When the number of profiles and levels for each trajectory varies, one can use the ragged array representation. This uses the contiguous ragged array representation for profiles (9.5.3), and adds trajectory information with trajectory indexes:
    11111102
    11121103{{{
     
    11171108
    11181109variables:
    1119   int section(section) ;
    1120     section:standard_name = "section_id" ;
     1110  int trajectory(trajectory) ;
     1111    section:standard_name = "trajectory_id" ;
    11211112
    11221113  double time(profile);
     
    11311122  int row_size(profile) ;
    11321123    row_size:long_name = "number of obs for this profile " ;
    1133     row_size:standard_name = "ragged_row_size" ;
    1134   int section_index(profile) ;
    1135     section_index:long_name = "which section this profile is for" ;
    1136     section_index:standard_name = "ragged_parent_index" ;
    1137 
     1124    row_size:CF\:ragged_row_count = "obs" ;
     1125  int trajectory_index(profile) ;
     1126    trajectory_index:long_name = "which trajectory this profile is for" ;
     1127    trajectory_index:CF\:ragged_row_index= "trajectory" ;
     1128 
    11381129  float z(obs) ;
    11391130    z:long_name = "height above mean sea level" ;
    11401131    z:units = "km" ;
    11411132    z:positive = "up" ;
     1133    z:axis = "Z" ; 
    11421134
    11431135  float pressure(obs) ;
     
    11571149
    11581150attributes:
    1159   :CF\:featureType = "section";
    1160 }}}
    1161 
    1162 The profile is associated with a section using the section_index(profile). For each profile, the observations must be written contiguously, and the number of obs in each profile is stored in row_size(profile).
     1151  :CF\:featureType = "trajectoryProfile";
     1152}}}
     1153
     1154The profile is associated with a trajectory using the trajectory_index(profile). The observations for each profile must be written contiguously, and the number of obs in each profile is stored in row_size(profile).
    11631155
    11641156The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(p), and lon(p). The time coordinate may depend on z also, eg time(obs) instead of time(profile).
    11651157
    1166 === 9.7.4 Flattened representation of multidimensional profiles ===
    1167 
    1168 A variation of multidimensional profiles (9.5.1) allows these to be associated into a section. The station information:
    1169 
    1170 {{{
    1171 dimensions:
    1172   z = 42 ;
    1173   profile = 142 ;
    1174 
    1175 variables:
    1176   int profile(profile) ;
    1177      profile:standard_name = "profile_id";
    1178   double time(profile);
    1179     time:long_name = "time" ;
    1180     time:units = "days since 1970-01-01 00:00:00" ;
    1181   float lon(profile);
    1182     lon:long_name = "longitude" ;
    1183     lon:units = "degrees_east" ;
    1184   float lat(profile);
    1185     lat:long_name = "latitude" ;
    1186     lat:units = "degrees_north" ;
    1187   int sectionId(profile) ;
    1188     sectionIndex:long_name = "which section this profile is for" ;
    1189     sectionIndex:standard_name = "section_id" ;
    1190 
    1191   float alt(profile, z) ;
    1192     alt:long_name = "height above mean sea level" ;
    1193     alt:units = "km" ;
    1194     alt:positive = "up" ;
    1195 
    1196   float pressure(profile, z) ;
    1197     pressure:long_name = "pressure level" ;
    1198     pressure:units = "hPa" ;
    1199     pressure:coordinates = "time lon lat alt" ;
    1200 
    1201   float temperature(profile, z) ;
    1202     temperature:long_name = "skin temperature" ;
    1203     temperature:units = "Celsius" ;
    1204     temperature:coordinates = "time lon lat alt" ;
    1205 
    1206   float humidity(profile, z) ;
    1207     humidity:long_name = "relative humidity" ;
    1208     humidity:units = "%" ;
    1209     humidity:coordinates = "time lon lat alt" ;
    1210 
    1211 attributes:
    1212   :CF\:featureType = "stationProfile";
    1213 }}}
    1214 
    1215 This is the same as 9.5.1, except that a section_id variable is added for each profile, which associates the profile to a section.
    12161158
    12171159= New standard names =
    1218 
    1219    * ragged_row_size
    1220    * ragged_parent_index
     1160 
    12211161   * station_id
    12221162   * station_desc
    1223    * station_altitude
    12241163   * station_WMO_id
    12251164   * profile_id
    12261165   * trajectory_id
    1227    * section_id
     1166
     1167= New variable attributes =
     1168
     1169    * '''CF:ragged_row_count''' whose value is the dimension being counted
     1170    * '''CF:ragged_row_index''' whose value is the dimension being indexed
    12281171
    12291172= New global attribute =
     
    12321175 
    12331176  * point
    1234   * stationTimeSeries
     1177  * timeSeries
    12351178  * trajectory
    12361179  * profile
    1237   * stationProfile
    1238   * section
     1180  * timeSeriesProfile
     1181  * trajectoryProfile
    12391182
    12401183= Other modifications =
     
    12461189to
    12471190
    1248 "The dimensions of an auxiliary coordinate variable must be a subset of the dimensions of the variable with which the coordinate is associated (with two exceptions: 1) label coordinates (see Section 6.1, “Labels”) contain a dimension for maximum string length, and 2) the Point Observation indexed and contiguous representations (see Section 9, “Point Observations”) allow special kinds of coordinates which are connected in a differrent way than by the dimension)"
     1191"The dimensions of an auxiliary coordinate variable must be a subset of the dimensions of the variable with which the coordinate is associated (with two exceptions: 1) label coordinates (see Section 6.1, “Labels”) contain a dimension for maximum string length, and 2) the Point Observation indexed and contiguous representations (see Section 9, “Point Observations”) allow special kinds of coordinates which are connected in a differrent way than by the dimension"
    12491192 
    12501193