-
Notifications
You must be signed in to change notification settings - Fork 3
Description
I open this issue to discuss the new format proposed by Anders in cf-convention/discuss#37 (comment)
Here is a copy of the CDL for the VIIRS example:
dimensions :
// VIIRS M-Band (750 m resolution imaging)
m_track = 768 ;
m_scan = 3200 ;
m_channel = 16 ;
// VIIRS I-Band (375 m resolution imaging)
i_track = 1536 ;
i_scan = 6400 ;
i_channel = 5 ;
// Tie points and interpolation zones (shared between VIIRS M-Band and I-Band)
tp_track = 96 ;
tp_scan = 205 ;
track_interpolation_zone = 48 ;
scan_interpolation_zone = 200 ;
variables:
// VIIRS M-Band
float m_radiance(m_track, m_scan, m_channel) ;
// VIIRS I-Band
float i_radiance(i_track, i_scan, i_channel) ;
// Tie point based interpolation container for location, supporting both VIIRS M-Band and I-Band
char tp_interpolation ;
tp_interpolation : dimensions = "tp_track (tie_point) - m_track (location) - i_track (location) tp_scan (tie_point) - m_scan (location) - i_scan (location)" // association of grid dimensions and definition of grid functions (location or cell boundary)
tp_interpolation : offset = "m_track - tp_track = 0.5 m_scan - tp_scan = 0.5 i_track - tp_track = 0.5 i_scan - tp_scan = 0.5" // definition of grid offset in units of cells
tp_interpolation : interpolation_indices = "m_track: m_track_indices m_scan:m_scan_indices i_track: i_track_indices i_scan:i_scan_indices" ; // associate dimensions with indices
tp_interpolation : interpolation_name = "bi_quadratic" ;
tp_interpolation : interpolation_coefficients = "expansion_coefficient_track alignment_coefficient_track expansion_coefficient_scan alignment_coefficient_scan" ;
tp_interpolation : interpolation_flags = "interpolation_zone_flags" ;
tp_interpolation : location_tie_points = "lat lon" ;
// Interpolation indices
int m_track_indices(tp_track) ;
int m_scan_indices(tp_scan) ;
int i_track_indices(tp_track) ;
int i_scan_indices(tp_scan) ;
// Tie points
float lat(tp_track, tp_scan) ;
lat : standard_name = "latitude" ;
lat : units = "degrees_north" ;
float lon(tp_track, tp_scan) ;
lon : standard_name = "longitude" ;
lon : units = "degrees_east" ;
// Interpolation coefficients and flags
short expansion_coefficient_track(track_interpolation_zone, tp_scan) ;
short alignment_coefficient_track(track_interpolation_zone, tp_scan) ;
short expansion_coefficient_scan(tp_track, scan_interpolation_zone) ;
short alignment_coefficient_scan(tp_track, scan_interpolation_zone) ;
byte interpolation_zone_flags(track_interpolation_zone, scan_interpolation_zone) ;
interpolation_zone_flags:valid_range = "1b, 7b" ;
interpolation_zone_flags:flag_masks = "1b, 2b, 4b" ;
interpolation_zone_flags:flag_meanings = "location_use_cartesian sensor_direction_use_cartesian solar_direction_use_cartesian" ;
And the relevant comments from the meeting minutes cf-convention/discuss#37 (comment):
CDL approach
@AndersMS proposes using implicit references as outlined in NUG to associate field constructs with coordinates. This utilised shared dimensions to imply connections. In our case, the field construct shares the full resolution dimension with the interpolation container variable, whereas the interpolation container variable shares the compacted dimension with the tie-points.
@erget posits that this has no impact on the CF Data Model because the full set of coordinates can be reconstructed for every data point, so that the lack of explicitly encoded coordinates in the netCDF file can be described logically as an encoding issue.
@oceandatalab would prefer explicit to implicit references. Also noted: Explicit references would require potentially cumbersome updates and store information redundantly. There is a trade-off here between explicitness & conciseness.
In all cases, the proposed approach allows coordinates to be reconstructed without having to unpack a complete field construct, thus fulfilling one of the use cases that we had not known exactly how to address before.