Changes between Version 5 and Version 6 of PointObservationConventions


Ignore:
Timestamp:
10/26/09 08:46:14 (9 years ago)
Author:
caron
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • PointObservationConventions

    v5 v6  
    1 = 5.8 Point Observation Data =
     1= Chapter 9 Point Observation Data =
    22
    33Section 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.
    44
    5 == Overview ==
    6 
    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 feature types:
     5== 9.1 Overview ==
     6
     7A '''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
     9Point 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:
    1010
    1111    * '''point''': one or more parameters measured at one point in time and space
     
    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     * '''stationProfileTimeSeries''': a time-series of profiles at a named location
     15    * '''stationProfile''': a time-series of profiles at a named location
    1616    * '''section''':  a collection of profiles which originate along a trajectory.
    1717
     
    2020All point data must have lat, lon and time coordinate or auxiliary coordinate variables, which are identified according to section 4 of this document. Some feature types allow the vertical coordinate to be optional, and some require it.
    2121
    22 There are several ways to represent point data in the classic netCDF model:
    23 
    24     * multidimensional (rectangular array) representation
    25     * contiguous ragged array representation
    26     * non-contiguous ragged array representation
     22There are two main ways to represent point data in the classic netCDF model:
     23
     24    * the '''multidimensional (rectangular array) representation''' is simpler but requires that the same amount of space be reserved for each feature stored in the file
     25    * the '''ragged array representation''' allows different features to be stored with different lengths in the file
    2726
    2827The following subsections detail each point feature types and show examples of the possible representations of each.
    2928
    30 Some assumption are common to all representations:
     29Certain assumption are common to all representations:
    3130 
    32     * lat, lon and time coordinates must always exist
     31    * the lat, lon and time coordinates must always exist; a vertical coordinate may exist
     32    * coordinates are identified with the "coordinates" attribute on the data variables, as specified in Chapter 5
     33    * coordinates may use missing values, but must do so in a consistent way
    3334    * index numbering, if used, is always 0 based
    3435    * variables are associated together by having a common, outer dimension
    3536
    36 == 5.8.1 Point Data ==
    37 
    38 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 height auxiliary coordinate variables.
     37
     38== 9.2 Point Data ==
     39
     40To 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.
    3941
    4042{{{
     
    7173In this example, the humidity(i) and temp(i) data are associated with the coordinate values time(i), lat(i), lon(i), and optionally alt(i). The obs dimension may use the unlimited dimension or not. If the time coordinate is ordered, the obs dimension may be named time (making time a coordinate variable rather than an auxiliary variable).
    7274
    73 == 5.8.2 Time series of Station Data ==
     75
     76== 9.3 Time series of Station Data ==
    7477
    7578Point 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 time series data at named locations called stations.
     
    8083   * All variables that have the station dimension as their outer dimension are considered to be station information, and are called 'station variables'.
    8184   * There must always be a station variable (of any type) with standard_name attribute "'''station_id'''", whose values uniquely identify the station.
    82 
    83 === 5.8.2.1 Multidimensional representation ===
     85   * The station_id variable may use missing values. This allows one to reserve more space than is needed for stations.
     86   * There may be station variables with standard_name attribute "'''station_desc'''", "'''station_altitude'''", and "'''station_wmoid'''"..
     87
     88=== 9.3.1 Multidimensional representation ===
    8489
    8590When the number of observations at each station is the same, one can use the multidimensional representation.
     
    127132The 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.
    128133
    129 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 each station, you may use time(obs) or time(time) to indicate this.
     134The 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.
    130135
    131136Note that this is a generalization of Example 5.4, which assumes that all the stations have observations with the same time coordinates.
    132137
    133 === 5.8.2.2 Ragged array (contiguous) representation ===
     138=== 9.3.2 Ragged array (contiguous) representation ===
    134139
    135140When 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 '''rowSize''' 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.
     
    190195The rowSize variable contains the number of observations for each station, and is identified by having a standard_name of "'''ragged_rowSize'''". It must have the station dimension as its single dimension.
    191196
    192 The outer 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.
    193 
    194 === 5.8.2.3 Ragged array (non-contiguous) representation ===
    195 
    196 When the number of observations at each station vary, and the observations cannot be written in order, one can use the 'non-contiguous ragged array' representation. Add a '''parentIndex''' observation variable specifying the station index that the observation belongs to:
     197The 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.
     198
     199=== 9.3.3 Ragged array (indexed) representation ===
     200
     201When 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 '''parentIndex''' observation variable specifying the station index that the observation belongs to:
    197202
    198203{{{
     
    239244The 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_parentIndex'''".  It must have the obs dimension as its single dimension.
    240245
    241 The outer 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.
    242 
    243 === 5.8.2.4 Single station ===
    244 
    245 When there is a single station in the file, one can can use any of the above representations 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.
     246The 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.
     247
     248=== 9.3.4 Single station ===
     249
     250When 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; in this case it must be a scalar (or 1D char).
    246251
    247252{{{
     
    282287}}}
    283288
    284 === 5.8.2.5 Flattened representation ===
    285 
    286 When factoring out the station information is not needed, one may use a 'flattened representation', in which the station information is repeated for each observation. A station_id variable is required to associate the observations into a time series.
     289=== 9.3.5 Flattened representation ===
     290
     291When factoring out the station information is not needed, one may use a 'flattened representation', in which the station information is repeated for each observation. The station_id variable is used to associate the observations into a time series.
    287292
    288293{{{
     
    321326}}}
    322327
    323 
    324 The humidity(i) and temp(i) data are associated with the coordinate values time(i), lat(i), lon(i), and optionally alt(i). There must be a variable (of any type) with the observation dimension as its outer dimension, with a standard_name attribute "'''station_id'''", whose values uniquely identify the station. All observations with the same station_id are assumed to belong to that station.
    325 
    326 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, 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 5.8.2.1, 5.8.2.2, and 5.8.2.3, and also putting location information into the observation record, as in the flattened representation in 5.8.2.5.
    327 
    328 == 5.8.3 Trajectory Data ==
     328The 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.
     329
     330In 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.
     331
     332
     333== 9.4 Trajectory Data ==
    329334
    330335Point data may be taken along a flight path or ship path, constituting a connected set of points called a trajectory.
    331336
    332 === 5.8.3.1 Single Trajectory ===
    333 
    334 When a single trajectory is stored in a file, the representation is straightforward:
    335 
    336 
    337 {{{
    338 dimensions:
    339   time = 1000 ;
    340 
    341 variables:
     337Some assumption are common to all trajectory representations:
     338
     339   * There must always be a variable (of any type) with standard_name attribute "'''trajectory_id'''", whose values uniquely identify the trajectory.
     340   * The outer dimension of the trajectory_id variable is the 'trajectory dimension'.
     341   * All variables that have the trajectory dimension as their single dimension are considered to be information about that trajectory
     342   * The trajectory_id variable may use missing values. This allows one to reserve more space than is needed.
     343 
     344=== 9.4.1 Multidimensional representation ===
     345
     346When storing multiple trajectories in the same file, and the number of observations in each trajectory is the same, one can use the multidimensional representation:
     347
     348{{{
     349dimensions:
     350  obs = 1000 ;
     351  trajectory = 77 ;
     352
     353variables:
     354  char trajectory(trajectory, name_strlen) ;
     355   trajectory:standard_name = "station_id";
     356   trajectory:long_name = "trajectory name" ;
     357  int trajectory_info(trajectory) ;
     358    trajectory_info:long_name = "some kind of trajectory info"
     359
     360  double time(trajectory, obs) ;
     361    time:long_name = "time" ;
     362    time:units = "days since 1970-01-01 00:00:00" ;
     363  float lon(trajectory, obs) ;
     364    lon:long_name = "longitude" ;
     365    lon:units = "degrees_east" ;
     366  float lat(trajectory, obs) ;
     367    lat:long_name = "latitude" ;
     368    lat:units = "degrees_north" ;
     369
     370  float z(trajectory, obs) ;
     371    z:long_name = "height above mean sea level" ;
     372    z:units = "km" ;
     373    z:positive = "up" ;
     374
     375  float O3(trajectory, obs) ;
     376    O3:long_name = "ozone concentration" ;
     377    O3:units = "1e-9" ;
     378    O3:coordinates = "time lon lat z" ;
     379
     380  float NO3(trajectory, obs) ;
     381    NO3:long_name = "NO3 concentration" ;
     382    NO3:units = "1e-9" ;
     383    NO3:coordinates = "time lon lat z" ;
     384
     385attributes:
     386  :CF\:featureType = "trajectory";
     387}}}
     388
     389The NO3(t,i) and O3(t,i) data are associated with the coordinate values time(t,i), lat(t,i), lon(t,i), and alt(t,i). The trajectory dimension may be the unlimited dimension or not. All variables that have trajectory as their only dimension are considered to be information about that trajectory.
     390
     391The time coordinate may use a missing value, which indicates that data is missing for that trajectory and obs index. This allows one to have a variable number of observations for different trajectories, at the cost of some wasted space. The data variables may also use missing data values.
     392
     393=== 9.4.2 Single Trajectory ===
     394
     395When a single trajectory is stored in a file, one can use a variation of the Multidimensional representation which removes the trajectory dimension:
     396
     397{{{
     398dimensions:
     399  time = 42;
     400
     401variables:
     402  char trajectory(name_strlen) ;
     403    trajectory:standard_name = "trajectory_id";
     404
    342405  double time(time) ;
    343406    time:long_name = "time" ;
     
    368431}}}
    369432
    370 
    371 The NO3(n) and O3(n) data is associated with the coordinate values time(n), z(n), lat(n), and lon(n). The time coordinate should be ordered, so it is appropriate to use a coordinate variable for time. The time dimension may be unlimited or not.
    372 
    373 Note that structurally this looks like unconnected point data as in example 5.8.1. The presence of the :CF\:featureType = "trajectory" global attribute indicates that in fact the points are connected along a trajectory.
     433The NO3(n) and O3(n) data is associated with the coordinate values time(n), z(n), lat(n), and lon(n). When the time coordinate is ordered, it is appropriate to use a coordinate variable for time, i.e. time(time). The time dimension may be unlimited or not.
     434
     435Note that structurally this looks like unconnected point data as in example 5.8.1. The presence of the CF:featureType = "trajectory" global attribute indicates that in fact the points are connected along a trajectory.
    374436
    375437Note that this is the same as Example 5.5.
    376438
    377 === 5.8.3.2 Multidimensional representation ===
    378 
    379 When storing multiple trajectories in the same file, and the number of observations in each trajectory is the same, one can use the multidimensional representation.
    380 
    381 
    382 {{{
    383 dimensions:
    384   obs = 1000 ;
    385   trajectory = 77 ;
    386 
    387 variables:
    388   char trajectory(trajectory, name_strlen) ;
    389     trajectory:long_name = "trajectory name" ;
    390   int trajectory_info(trajectory) ;
    391     trajectory_name:long_name = "some kind of trajectory info"
    392 
    393   double time(trajectory, obs) ;
    394     time:long_name = "time" ;
    395     time:units = "days since 1970-01-01 00:00:00" ;
    396   float lon(trajectory, obs) ;
    397     lon:long_name = "longitude" ;
    398     lon:units = "degrees_east" ;
    399   float lat(trajectory, obs) ;
    400     lat:long_name = "latitude" ;
    401     lat:units = "degrees_north" ;
    402 
    403   float z(trajectory, obs) ;
    404     z:long_name = "height above mean sea level" ;
    405     z:units = "km" ;
    406     z:positive = "up" ;
    407 
    408   float O3(trajectory, obs) ;
    409     O3:long_name = "ozone concentration" ;
    410     O3:units = "1e-9" ;
    411     O3:coordinates = "time lon lat z" ;
    412 
    413   float NO3(trajectory, obs) ;
    414     NO3:long_name = "NO3 concentration" ;
    415     NO3:units = "1e-9" ;
    416     NO3:coordinates = "time lon lat z" ;
    417 
    418 attributes:
    419   :CF\:featureType = "trajectory";
    420 }}}
    421 
    422 
    423 The NO3(t,i) and O3(t,i) data are associated with the coordinate values time(t,i), lat(t,i), lon(t,i), and alt(t,i). The trajectory dimension may be the unlimited dimension or not. All variables that have trajectory as their only dimension are considered to be information about that trajectory.
    424 
    425 The time coordinate may use a missing value, which indicates that data is missing for that trajectory and obs index. This allows one to have a variable number of observations for different trajectories, at the cost of some wasted space. The data variables may also use missing data values.
    426 
    427 === 5.8.3.3 Ragged array (contiguous) representation ===
     439
     440=== 9.4.3 Ragged array (contiguous) representation ===
    428441
    429442When the number of observations for each trajectory varies, one can use the contiguous ragged array representation. One stores the set of observation for each trajectory contiguously along the obs dimension, and adds a rowSize variable specifying the number of observations for each trajectory:
    430 
    431443
    432444{{{
     
    437449variables:
    438450  char trajectory(trajectory, name_strlen) ;
    439     trajectory:long_name = "trajectory name" ;
    440   int trajectory_info(trajectory) ;
    441     trajectory_name:long_name = "some kind of trajectory info" ;
    442 
     451     trajectory:standard_name = "trajectory_id";
    443452  int rowSize(trajectory) ;
    444453    rowSize:long_name = "number of obs for this trajectory " ;
    445454    rowSize:standard_name = "ragged_rowSize" ;
     455
    446456  double time(obs) ;
    447457    time:long_name = "time" ;
     
    477487The rowSize variable contains the number of observations for each trajectory, and is identified by having a standard_name of "ragged_rowSize". It must have the trajectory dimension as its single dimension.
    478488
    479 === 5.8.3.4 Ragged array (non-contiguous) representation ===
    480 
    481 When the number of observations at each trajectory vary, and the observations cannot be written in order, one can use the non-contiguous ragged array representation. Add a parentIndex field specifying the trajectory index that the observation belongs to:
    482 
     489=== 9.4.4 Ragged array (indexed) representation ===
     490
     491When 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 parentIndex field specifying the trajectory index that the observation belongs to:
    483492
    484493{{{
     
    489498variables:
    490499  char trajectory(trajectory, name_strlen) ;
    491     trajectory:long_name = "trajectory name" ;
    492   int trajectory_info(trajectory) ;
    493     trajectory_name:long_name = "some kind of trajectory info" ;
     500     trajectory:standard_name = "trajectory_id";
    494501
    495502  int trajectory_index(obs) ;
     
    525532
    526533
    527 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. 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.
     534The 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.
    528535
    529536The parentIndex variable is identified by having a standard_name of "ragged_parentIndex". It must have the obs dimension as its single dimension.
    530537
    531538 
    532 == 5.8.4 Profile Data ==
    533 
    534 A series of connected observations along a vertical line, like an atmospheric or ocean sounding, is called a profile.
    535 
    536 === 5.8.4.1 Single Profile ===
    537 
    538 When a single profile is stored in a file, the representation is straightforward:
    539 
     539== 9.5 Profile Data ==
     540
     541A series of connected observations along a vertical line, like an atmospheric or ocean sounding, is called a profile. The lat,lon locations are factored out into the profile.
     542
     543Some assumption are common to all profile representations:
     544
     545   * There must always be a variable (of any type) with standard_name attribute "'''profile_id'''", whose values uniquely identify the profile.
     546   * The outer dimension of the profile_id variable is the 'profiledimension'.
     547   * All variables that have the profile dimension as their single dimension are considered to be information about that profile
     548   * The profile_id variable may use missing values. This allows one to reserve more space than is needed.
     549
     550=== 9.5.1 Multidimensional representation ===
     551
     552When storing multiple profiles in the same file, and the numbers of vertical levels in each profile are the same, one can use the multidimensional representation:
    540553
    541554{{{
    542555dimensions:
    543556  z = 42 ;
    544 
    545 variables:
    546   float z(z) ;
    547     z:long_name = "height above mean sea level" ;
    548     z:units = "km" ;
    549     z:positive = "up" ;
    550 
     557  profile = 142 ;
     558
     559variables:
     560  int profile(profile) ;
     561     profile:standard_name = "profile_id";
     562  double time(profile);
     563    time:long_name = "time" ;
     564    time:units = "days since 1970-01-01 00:00:00" ;
     565  float lon(profile);
     566    lon:long_name = "longitude" ;
     567    lon:units = "degrees_east" ;
     568  float lat(profile);
     569    lat:long_name = "latitude" ;
     570    lat:units = "degrees_north" ;
     571
     572  float alt(profile, z) ;
     573    alt:long_name = "height above mean sea level" ;
     574    alt:units = "km" ;
     575    alt:positive = "up" ;
     576
     577  float pressure(profile, z) ;
     578    pressure:long_name = "pressure level" ;
     579    pressure:units = "hPa" ;
     580    pressure:coordinates = "time lon lat alt" ;
     581
     582  float temperature(profile, z) ;
     583    temperature:long_name = "skin temperature" ;
     584    temperature:units = "Celsius" ;
     585    temperature:coordinates = "time lon lat alt" ;
     586
     587  float humidity(profile, z) ;
     588    humidity:long_name = "relative humidity" ;
     589    humidity:units = "%" ;
     590    humidity:coordinates = "time lon lat alt" ;
     591
     592attributes:
     593  :CF\:featureType = "profile";
     594}}}
     595
     596The pressure(p,i), temperature(p,i), and humidity(p,i) data is associated with the coordinate values time(p), alt(p,i), lat(p), and lon(p). If the vertical coordinates are the same for all profiles, one can use z(z) instead of alt(profile,z). The time coordinate may depend on z also, eg time(profile,z).
     597
     598When there are a variable number of observations for different profiles, use alt(profile, z) with missing values.
     599
     600
     601=== 9.5.2 Single Profile ===
     602
     603When a single profile is stored in a file, one can use a variation of the Multidimensional representation which removes the profile dimension:
     604
     605{{{
     606dimensions:
     607  z = 42 ;
     608
     609variables:
     610
     611  int profile ;
     612    profile:standard_name = "profile_id";
    551613  double time;
    552614    time:long_name = "time" ;
     
    559621    lat:units = "degrees_north" ;
    560622
     623  float alt(z) ;
     624    alt:long_name = "height above mean sea level" ;
     625    alt:units = "km" ;
     626    alt:positive = "up" ;
     627
    561628  float pressure(z) ;
    562629    pressure:long_name = "pressure level" ;
     
    578645}}}
    579646
    580 
    581 The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time, z(i), lat, and lon. The z coordinate must be ordered. The time coordinate may depend on z also, eg may be time(z).
    582 
    583 === 5.8.4.2 Multidimensional representation ===
    584 
    585 When storing multiple profiles in the same file, and the vertical levels in each profile are the same, one can use the multidimensional representation:
    586 
    587 
    588 {{{
    589 dimensions:
    590   z = 42 ;
    591   profile = 142 ;
    592 
    593 variables:
    594   float z(z) ;
    595     z:long_name = "height above mean sea level" ;
    596     z:units = "km" ;
    597     z:positive = "up" ;
    598 
    599   double time(profile);
    600     time:long_name = "time" ;
    601     time:units = "days since 1970-01-01 00:00:00" ;
    602   float lon(profile);
    603     lon:long_name = "longitude" ;
    604     lon:units = "degrees_east" ;
    605   float lat(profile);
    606     lat:long_name = "latitude" ;
    607     lat:units = "degrees_north" ;
    608 
    609   float pressure(profile, z) ;
    610     pressure:long_name = "pressure level" ;
    611     pressure:units = "hPa" ;
    612     pressure:coordinates = "time lon lat z" ;
    613 
    614   float temperature(profile, z) ;
    615     temperature:long_name = "skin temperature" ;
    616     temperature:units = "Celsius" ;
    617     temperature:coordinates = "time lon lat z" ;
    618 
    619   float humidity(profile, z) ;
    620     humidity:long_name = "relative humidity" ;
    621     humidity:units = "%" ;
    622     humidity:coordinates = "time lon lat z" ;
    623 
    624 attributes:
    625   :CF\:featureType = "profile";
    626 }}}
    627 
    628 
    629 The pressure(p,i), temperature(p,i), and humidity(p,i) data is associated with the coordinate values time(p), z(i), lat(p), and lon(p). If the vertical coordinates differ for each profile, but the number of levels are the same, one can use z(profile, z), but the z coordinate must be ordered for each profile.
    630 
    631 The profile dimension may be the unlimited dimension or not. All variables that have profile as their only dimension are considered to be profile information.
    632 
    633 
    634 The time coordinate may depend on z also, eg time(p,z). The time coordinate may use a missing value, which indicates that data is missing for that profile and obs index. This allows one to have a variable number of observations for different profiles, at the cost of some wasted space. The data variables may also use missing data values.
    635 
    636 === 5.8.4.3 Ragged array (contiguous) representation ===
     647The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time, alt(i), lat, and lon. The time coordinate may depend on z also, eg may be time(z).
     648
     649
     650=== 9.5.3 Ragged array (contiguous) representation ===
    637651
    638652When 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 rowSize variable specifying the number of observations for each profile:
    639 
    640653
    641654{{{
     
    645658
    646659variables:
     660  int profile(profile) ;
     661    profile:standard_name = "profile_id";
    647662  double time(profile);
    648663    time:long_name = "time" ;
     
    682697}}}
    683698
    684 
    685 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=profile_index(i). The time coordinate may depend on z also, eg time(p,z).
    686 
    687 === 5.8.4.4 Ragged array (non-contiguous) representation ===
    688 
    689 When the number of vertical levels for each profile varies, and one cant write them contiguously, one can use the non-contiguous ragged array representation. Add a parentIndex field specifying the profile index that the observation belongs to:
    690 
     699The 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, eg time(p,z).
     700
     701=== 9.5.4 Ragged array (indexed) representation ===
     702
     703When 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 parentIndex field specifying the profile index that the observation belongs to:
    691704
    692705{{{
     
    696709
    697710variables:
     711  int profile(profile) ;
     712    profile:standard_name = "profile_id";
    698713  double time(profile);
    699714    time:long_name = "time" ;
     
    705720    lat:long_name = "latitude" ;
    706721    lat:units = "degrees_north" ;
     722
    707723  int parentIndex(obs) ;
    708724    parentIndex:long_name = "index of profile " ;
     
    733749}}}
    734750
    735 
    736751The 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=parentIndex(i). The time coordinate may depend on z also, eg time(p,z).
    737752
    738 == 5.8.5 Station Profile Data ==
    739 
    740 When profiles are taken at a set of stations, one gets a time series of profiles at each station, called a stationProfileTimeSeries.
    741 
    742 === 5.8.5.1 Profile time series at a single station ===
    743 
    744 If there is only one station in a file, and the vertical levels are the same for each profile, one can use a representation that is a variant of Example 5.8.4.2:
    745 
    746 
    747 {{{
    748 dimensions:
    749   z = 42 ;
    750   time = UNLIMITED ;
    751 
    752 variables:
    753   float z(z) ;
    754     z:long_name = "height above mean sea level" ;
    755     z:units = "km" ;
    756     z:positive = "up" ;
    757 
    758   double time(time);
    759     time:long_name = "time" ;
    760     time:units = "days since 1970-01-01 00:00:00" ;
    761   float lon;
    762     lon:long_name = "longitude" ;
    763     lon:units = "degrees_east" ;
    764   float lat;
    765     lat:long_name = "latitude" ;
    766     lat:units = "degrees_north" ;
    767 
    768   float pressure(time, z) ;
    769     pressure:long_name = "pressure level" ;
    770     pressure:units = "hPa" ;
    771     pressure:coordinates = "time lon lat z" ;
    772 
    773   float temperature(time, z) ;
    774     temperature:long_name = "skin temperature" ;
    775     temperature:units = "Celsius" ;
    776     temperature:coordinates = "time lon lat z" ;
    777 
    778   float humidity(time, z) ;
    779     humidity:long_name = "relative humidity" ;
    780     humidity:units = "%" ;
    781     humidity:coordinates = "time lon lat z" ;
    782 
    783 attributes:
    784   :CF\:featureType = "stationProfileTimeSeries";
    785 }}}
    786 
    787 
    788 The pressure(i,j), temperature(i,j), and humidity(i,j) data are associated with the coordinate values time(i), z(j), lat, and lon.
    789 
    790 === 5.8.5.2 Multidimensional representation ===
    791 
    792 When storing time series of profiles at multiple stations in the same file, if there are the same number of time points and vertical levels for every profile, one can use the multidimensional representation.
    793 
     753
     754== 9.6 Station Profile Data ==
     755
     756When profiles are taken at a set of stations, one gets a time series of profiles at each station, called a stationProfile.
     757
     758The same assumptions are made as with stationTimeSeries data:
     759
     760   * The outer dimension of the latitude and longitude coordinates (which must agree) is the 'station dimension'.
     761   * All variables that have the station dimension as their outer dimension are considered to be station information, and are called 'station variables'.
     762   * There must always be a station variable (of any type) with standard_name attribute "'''station_id'''", whose values uniquely identify the station.
     763   * The station_id variable may use missing values. This allows one to reserve more space than is needed for stations.
     764   * There may be station variables with standard_name attribute "'''station_desc'''", "'''station_altitude'''", and "'''station_wmoid'''"..
     765
     766=== 9.6.1 Multidimensional representation ===
     767
     768When 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 te same number of vertical levels for every profile, one can use the multidimensional representation:
    794769
    795770{{{
    796771dimensions:
    797772  station = 22 ;
    798   time = 30 ;
     773  profile = 3002 ;
    799774  z = 42 ;
    800775
     
    811786    station_name:long_name = "some kind of station info" ;
    812787
    813   float z(z) ;
    814     z:long_name = "height above mean sea level" ;
    815     z:units = "km" ;
    816     z:positive = "up" ;
    817 
    818   double time(station, time) ;
     788  float alt(station, profile , z) ;
     789    alt:long_name = "height above mean sea level" ;
     790    alt:units = "km" ;
     791    alt:positive = "up" ;
     792
     793  double time(station, profile ) ;
    819794    time:long_name = "time of measurement" ;
    820795    time:units = "days since 1970-01-01 00:00:00" ;
    821796    time:missing_value = -999.9;
    822797
    823   float pressure(station, time, z) ;
     798  float pressure(station, profile , z) ;
    824799    pressure:long_name = "pressure level" ;
    825800    pressure:units = "hPa" ;
    826     pressure:coordinates = "time lon lat z" ;
    827 
    828   float temperature(station, time, z) ;
     801    pressure:coordinates = "time lon lat alt" ;
     802
     803  float temperature(station, profile , z) ;
    829804    temperature:long_name = "skin temperature" ;
    830805    temperature:units = "Celsius" ;
    831     temperature:coordinates = "time lon lat z" ;
    832 
    833   float humidity(station, time, z) ;
     806    temperature:coordinates = "time lon lat alt" ;
     807
     808  float humidity(station, profile , z) ;
    834809    humidity:long_name = "relative humidity" ;
    835810    humidity:units = "%" ;
    836     humidity:coordinates = "time lon lat z" ;
    837 
    838 attributes:
    839  :CF\:featureType = "stationProfileTimeSeries";
    840 }}}
    841 
    842 
    843 The pressure(s,p,i), temperature(s,p,i), and humidity(s,p,i) data is associated with the coordinate values time(s,p), z(i), lat(s), and lon(s).
    844 
    845 === 5.8.5.3 Ragged array of multidimensional profiles ===
    846 
    847 When the number of profiles for each station varies, one can use (continguous or non-contiguous) ragged arrays for the time series. If each profile has the same number of vertical levels, a multidimensional profile representation can be usedd. Here is the contiguous form:
    848 
    849 
    850 {{{
    851 dimensions:
    852   station = 22 ;
    853   profile = UNLIMITED ;
     811    humidity:coordinates = "time lon lat alt" ;
     812
     813attributes:
     814 :CF\:featureType = "stationProfile";
     815}}}
     816
     817The pressure(s,p,i), temperature(s,p,i), and humidity(s,p,i) data is associated with the coordinate values time(s,p), z(s,p,i), lat(s), and lon(s).
     818
     819The time coordinate may depend on z also, eg time(station,profile,z). If all of the profiles use the same z coordinate, alt(station, profile, z) may be factored out into z(z).
     820
     821When there are varying number of profiles for different stations, use time(station, profile) with missing values. When there are varying number of levels for different profiles, use alt(station, profile, z) with missing values.
     822
     823=== 9.6.2 Profile time series at a single station ===
     824
     825If there is only one station in a file, one can use a variation of the Multidimensional representation which removes the station dimension:
     826
     827{{{
     828dimensions:
     829  profile = 30 ;
    854830  z = 42 ;
    855831
    856832variables:
    857   float z(z) ;
    858     z:long_name = "height above mean sea level" ;
    859     z:units = "km" ;
    860     z:positive = "up" ;
    861 
     833  float lon ;
     834    lon:long_name = "station longitude";
     835    lon:units = "degrees_east";
     836  float lat ;
     837    lat:long_name = "station latitude" ;
     838    lat:units = "degrees_north" ;
     839  char station_name(name_strlen) ;
     840    station_name:long_name = "station name" ;
     841  int station_info(station) ;
     842    station_name:long_name = "some kind of station info" ;
     843
     844  float alt(profile , z) ;
     845    alt:long_name = "height above mean sea level" ;
     846    alt:units = "km" ;
     847    alt:positive = "up" ;
     848
     849  double time(profile ) ;
     850    time:long_name = "time of measurement" ;
     851    time:units = "days since 1970-01-01 00:00:00" ;
     852    time:missing_value = -999.9;
     853
     854  float pressure(profile , z) ;
     855    pressure:long_name = "pressure level" ;
     856    pressure:units = "hPa" ;
     857    pressure:coordinates = "time lon lat alt" ;
     858
     859  float temperature(profile , z) ;
     860    temperature:long_name = "skin temperature" ;
     861    temperature:units = "Celsius" ;
     862    temperature:coordinates = "time lon lat alt" ;
     863
     864  float humidity(profile , z) ;
     865    humidity:long_name = "relative humidity" ;
     866    humidity:units = "%" ;
     867    humidity:coordinates = "time lon lat alt" ;
     868
     869attributes:
     870 :CF\:featureType = "stationProfile";
     871}}}
     872
     873The 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, eg time(profile,z). If all of the profiles use the same z coordinate, alt(profile, z) may be factored out into z(z).
     874
     875=== 9.6.3 Ragged array of station profile time series ===
     876
     877When 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):
     878
     879{{{
     880dimensions:
     881  obs = UNLIMITED ;
     882  profiles = 1420 ;
     883  stations = 42;
     884
     885variables:
    862886  float lon(station) ;
    863887    lon:long_name = "station longitude";
     
    866890    lat:long_name = "station latitude" ;
    867891    lat:units = "degrees_north" ;
     892  float alt(station) ;
     893    alt:long_name = "altitude above MSL" ;
     894    alt:units = "m" ;
    868895  char station_name(station, name_strlen) ;
    869896    station_name:long_name = "station name" ;
     897    station_name:standard_name = "station_id";
    870898  int station_info(station) ;
    871     station_name:long_name = "some kind of station info" ;
    872   int rowSize(station) ;
    873     rowSize:long_name = "number of profiles for this station " ;
    874     rowSize:standard_name = "ragged_rowSize" ;
     899    station_info:long_name = "some kind of station info" ;
     900
     901  int profile(profile) ;
     902    profile:standard_name = "profile_id";
    875903  double time(profile);
    876904    time:long_name = "time" ;
    877     time:units = "days since 1970-01-01 00:00:00" ;
     905    time:units = "days since 1970-01-01 00:00:00" ;
     906  float lon(profile);
     907    lon:long_name = "longitude" ;
     908    lon:units = "degrees_east" ;
     909  float lat(profile);
     910    lat:long_name = "latitude" ;
     911    lat:units = "degrees_north" ;
     912  int stationIndex(profile) ;
     913    stationIndex:long_name = "which station this obs is for" ;
     914    stationIndex:standard_name = "ragged_parentIndex" ;
     915  int rowSize(profile) ;
     916    rowSize:long_name = "number of obs for this profile " ;
     917    rowSize:standard_name = "ragged_rowSize" ;
     918
     919  float z(obs) ;
     920    z:long_name = "height above mean sea level" ;
     921    z:units = "km" ;
     922    z:positive = "up" ;
     923
     924  float pressure(obs) ;
     925    pressure:long_name = "pressure level" ;
     926    pressure:units = "hPa" ;
     927    pressure:coordinates = "time lon lat z" ;
     928
     929  float temperature(obs) ;
     930    temperature:long_name = "skin temperature" ;
     931    temperature:units = "Celsius" ;
     932    temperature:coordinates = "time lon lat z" ;
     933
     934  float humidity(obs) ;
     935    humidity:long_name = "relative humidity" ;
     936    humidity:units = "%" ;
     937    humidity:coordinates = "time lon lat z" ;
     938
     939attributes:
     940  :CF\:featureType = "stationProfile";
     941}}}
     942
     943The profile is associated with a station using the stationIndex(profile). For each profile, the observations must be written contiguously.
     944
     945The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(s), and lon(s). The time coordinate may depend on z also, eg time(obs) instead of time(profile).
     946
     947=== 9.6.4 Flattened representation of multidimensional profiles ===
     948
     949A variation of multidimensional profiles (9.5.1) allows these to be associated into a station time series. The station information (lat, lon, id) is repeated in each profile:
     950
     951{{{
     952dimensions:
     953  z = 42 ;
     954  profile = 142 ;
     955
     956variables:
     957  int profile(profile) ;
     958     profile:standard_name = "profile_id";
     959  double time(profile);
     960    time:long_name = "time" ;
     961    time:units = "days since 1970-01-01 00:00:00" ;
     962  float lon(profile);
     963    lon:long_name = "longitude" ;
     964    lon:units = "degrees_east" ;
     965  float lat(profile);
     966    lat:long_name = "latitude" ;
     967    lat:units = "degrees_north" ;
     968  char station_name(profile, name_strlen) ;
     969    station_name:long_name = "station name" ;
     970    station_name:standard_name = "station_id";
     971
     972  float alt(profile, z) ;
     973    alt:long_name = "height above mean sea level" ;
     974    alt:units = "km" ;
     975    alt:positive = "up" ;
     976
    878977  float pressure(profile, z) ;
    879978    pressure:long_name = "pressure level" ;
    880979    pressure:units = "hPa" ;
    881     pressure:coordinates = "time lon lat z" ;
     980    pressure:coordinates = "time lon lat alt" ;
    882981
    883982  float temperature(profile, z) ;
    884983    temperature:long_name = "skin temperature" ;
    885984    temperature:units = "Celsius" ;
    886     temperature:coordinates = "time lon lat z" ;
     985    temperature:coordinates = "time lon lat alt" ;
    887986
    888987  float humidity(profile, z) ;
    889988    humidity:long_name = "relative humidity" ;
    890989    humidity:units = "%" ;
    891     humidity:coordinates = "time lon lat z" ;
    892 
    893 attributes:
    894   :CF\:featureType = "stationProfileTimeSeries";
    895 }}}
    896 
    897 
    898 The pressure(p,z), temperature(p,z), and humidity(p,z) data is associated with the coordinate values time(p), z(z), lat(s), and lon(s).
    899 
    900 === 5.8.5.4 Ragged array of ragged array ===
    901 
    902 If the number of vertical levels for the profiles also varies significantly, one can also turn the profiles into a ragged array. Here we show the non-contiguous form:
    903 
     990    humidity:coordinates = "time lon lat alt" ;
     991
     992attributes:
     993  :CF\:featureType = "stationProfile";
     994}}}
     995
     996This 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.
     997
     998== 9.7 Section Profile Data ==
     999
     1000When 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 the trajectory.
     1001
     1002=== 9.7.1 Multidimensional representation ===
     1003
     1004If 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:
     1005
     1006{{{
     1007dimensions:
     1008  section = 22 ;
     1009  profile = 33;
     1010  z = 42 ;
     1011
     1012variables:
     1013  float lon(section, profile) ;
     1014    lon:units = "degrees_east";
     1015  float lat(section, profile) ;
     1016    lat:long_name = "station latitude" ;
     1017    lat:units = "degrees_north" ;
     1018  int section(section) ;
     1019    section:standard_name = "section id" ;
     1020
     1021  float alt(section, profile , z) ;
     1022    alt:long_name = "height above mean sea level" ;
     1023    alt:units = "km" ;
     1024    alt:positive = "up" ;
     1025
     1026  double time(section, profile ) ;
     1027    time:long_name = "time of measurement" ;
     1028    time:units = "days since 1970-01-01 00:00:00" ;
     1029    time:missing_value = -999.9;
     1030
     1031  float pressure(section, profile , z) ;
     1032    pressure:long_name = "pressure level" ;
     1033    pressure:units = "hPa" ;
     1034    pressure:coordinates = "time lon lat alt" ;
     1035
     1036  float temperature(section, profile , z) ;
     1037    temperature:long_name = "skin temperature" ;
     1038    temperature:units = "Celsius" ;
     1039    temperature:coordinates = "time lon lat alt" ;
     1040
     1041  float humidity(section, profile , z) ;
     1042    humidity:long_name = "relative humidity" ;
     1043    humidity:units = "%" ;
     1044    humidity:coordinates = "time lon lat alt" ;
     1045
     1046attributes:
     1047 :CF\:featureType = "section";
     1048}}}
     1049
     1050The 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).
     1051
     1052The 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).
     1053
     1054When 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.
     1055
     1056=== 9.7.2 Single section in the file ===
     1057
     1058If there is only one section in the file, one can use a variation of the Multidimensional representation which removes the section dimension:
     1059
     1060{{{
     1061dimensions:
     1062  profile = 33;
     1063  z = 42 ;
     1064
     1065variables:
     1066  float lon(profile) ;
     1067    lon:units = "degrees_east";
     1068  float lat(profile) ;
     1069    lat:long_name = "station latitude" ;
     1070    lat:units = "degrees_north" ;
     1071  int section ;
     1072    section:standard_name = "section id" ;
     1073
     1074  float alt(profile , z) ;
     1075    alt:long_name = "height above mean sea level" ;
     1076    alt:units = "km" ;
     1077    alt:positive = "up" ;
     1078
     1079  double time(profile ) ;
     1080    time:long_name = "time of measurement" ;
     1081    time:units = "days since 1970-01-01 00:00:00" ;
     1082    time:missing_value = -999.9;
     1083
     1084  float pressure(profile , z) ;
     1085    pressure:long_name = "pressure level" ;
     1086    pressure:units = "hPa" ;
     1087    pressure:coordinates = "time lon lat alt" ;
     1088
     1089  float temperature(profile , z) ;
     1090    temperature:long_name = "skin temperature" ;
     1091    temperature:units = "Celsius" ;
     1092    temperature:coordinates = "time lon lat alt" ;
     1093
     1094  float humidity(profile , z) ;
     1095    humidity:long_name = "relative humidity" ;
     1096    humidity:units = "%" ;
     1097    humidity:coordinates = "time lon lat alt" ;
     1098
     1099attributes:
     1100 :CF\:featureType = "section";
     1101}}}
     1102
     1103
     1104=== 9.7.3 Ragged array of sections ===
     1105
     1106When 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):
    9041107
    9051108{{{
    9061109dimensions:
    9071110  obs = UNLIMITED ;
    908   station = 142 ;
     1111  profiles = 1420 ;
     1112  stations = 42;
    9091113
    9101114variables:
     
    9201124  char station_name(station, name_strlen) ;
    9211125    station_name:long_name = "station name" ;
     1126    station_name:standard_name = "station_id";
    9221127  int station_info(station) ;
    923     station_name:long_name = "some kind of station info" ;
    924   int stationIndex(profile) ;
    925     stationIndex:long_name = "station index for this profile" ;
    926     stationIndex:standard_name = "ragged_parentIndex" ;
     1128    station_info:long_name = "some kind of station info" ;
     1129
     1130  int profile(profile) ;
     1131    profile:standard_name = "profile_id";
    9271132  double time(profile);
    9281133    time:long_name = "time" ;
    929     time:units = "days since 1970-01-01 00:00:00" ;
    930   int profileIndex(obs) ;
    931     profileIndex:long_name = "profile index for this level" ;
    932     profileIndex:standard_name = "ragged_parentIndex" ;
     1134    time:units = "days since 1970-01-01 00:00:00" ;
     1135  float lon(profile);
     1136    lon:long_name = "longitude" ;
     1137    lon:units = "degrees_east" ;
     1138  float lat(profile);
     1139    lat:long_name = "latitude" ;
     1140    lat:units = "degrees_north" ;
     1141  int stationIndex(profile) ;
     1142    stationIndex:long_name = "which station this obs is for" ;
     1143    stationIndex:standard_name = "ragged_parentIndex" ;
     1144  int rowSize(profile) ;
     1145    rowSize:long_name = "number of obs for this profile " ;
     1146    rowSize:standard_name = "ragged_rowSize" ;
    9331147
    9341148  float z(obs) ;
     
    9531167
    9541168attributes:
    955   :CF\:featureType = "stationProfileTimeSeries";
    956 }}}
    957 
    958 
    959 The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(s), and lon(s), where p = profileIndex(i), and s = stationIndex(p).
    960 
    961 == 5.8.6 Section Profile Data ==
    962 
    963 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 5.8.4.2), except that the profile location are a connected set of points along a trajectory.
    964 
    965 === 5.8.6.1 Multidimensional representation ===
     1169  :CF\:featureType = "stationProfile";
     1170}}}
     1171
     1172The profile is associated with a station using the stationIndex(profile). For each profile, the observations must be written contiguously.
     1173
     1174The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(s), and lon(s). The time coordinate may depend on z also, eg time(obs) instead of time(profile).
     1175
     1176=== 9.6.4 Flattened representation of multidimensional profiles ===
     1177
     1178A variation of multidimensional profiles (9.5.1) allows these to be associated into a station time series. The station information (lat, lon, id) is repeated in each profile:
     1179
     1180{{{
     1181dimensions:
     1182  z = 42 ;
     1183  profile = 142 ;
     1184
     1185variables:
     1186  int profile(profile) ;
     1187     profile:standard_name = "profile_id";
     1188  double time(profile);
     1189    time:long_name = "time" ;
     1190    time:units = "days since 1970-01-01 00:00:00" ;
     1191  float lon(profile);
     1192    lon:long_name = "longitude" ;
     1193    lon:units = "degrees_east" ;
     1194  float lat(profile);
     1195    lat:long_name = "latitude" ;
     1196    lat:units = "degrees_north" ;
     1197  char station_name(profile, name_strlen) ;
     1198    station_name:long_name = "station name" ;
     1199    station_name:standard_name = "station_id";
     1200
     1201  float alt(profile, z) ;
     1202    alt:long_name = "height above mean sea level" ;
     1203    alt:units = "km" ;
     1204    alt:positive = "up" ;
     1205
     1206  float pressure(profile, z) ;
     1207    pressure:long_name = "pressure level" ;
     1208    pressure:units = "hPa" ;
     1209    pressure:coordinates = "time lon lat alt" ;
     1210
     1211  float temperature(profile, z) ;
     1212    temperature:long_name = "skin temperature" ;
     1213    temperature:units = "Celsius" ;
     1214    temperature:coordinates = "time lon lat alt" ;
     1215
     1216  float humidity(profile, z) ;
     1217    humidity:long_name = "relative humidity" ;
     1218    humidity:units = "%" ;
     1219    humidity:coordinates = "time lon lat alt" ;
     1220
     1221attributes:
     1222  :CF\:featureType = "stationProfile";
     1223}}}
     1224
     1225This 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.
     1226
     1227== 9.7 Section Profile Data ==
     1228
     1229When 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 a connected set of points along a trajectory.
     1230
     1231=== 9.7.1 Multidimensional representation ===
    9661232
    9671233If the vertical levels are the same for each profile, one can use a multidimensional representation:
    968 
    9691234
    9701235{{{