libdap::GridGeoConstraint Class Reference

#include <GridGeoConstraint.h>

Inheritance diagram for libdap::GridGeoConstraint:
Inheritance graph
[legend]
Collaboration diagram for libdap::GridGeoConstraint:
Collaboration graph
[legend]

List of all members.

Public Types

enum  LatitudeSense { unknown_sense, normal, inverted }
enum  Notation { unknown_notation, pos, neg_pos }

Public Member Functions

virtual void apply_constraint_to_data ()
virtual Gridget_constrained_grid () const
void set_bounding_box (double left, double top, double right, double bottom)
virtual ~GridGeoConstraint ()
Accessors/Mutators



char * get_array_data () const
int get_array_data_size () const
bool get_bounding_box_set () const
set< string > get_coards_lat_units () const
set< string > get_coards_lon_units () const
double * get_lat () const
Array::Dim_iter get_lat_dim () const
int get_lat_length () const
set< string > get_lat_names () const
int get_latitude_index_bottom () const
int get_latitude_index_top () const
LatitudeSense get_latitude_sense () const
double * get_lon () const
Array::Dim_iter get_lon_dim () const
int get_lon_length () const
set< string > get_lon_names () const
int get_longitude_index_left () const
int get_longitude_index_right () const
Notation get_longitude_notation () const
bool get_longitude_rightmost () const
void set_lat (double *lat)
void set_lat_dim (Array::Dim_iter lat)
void set_lat_length (int len)
void set_latitude_index_bottom (int bottom)
void set_latitude_index_top (int top)
void set_latitude_sense (LatitudeSense l)
void set_lon (double *lon)
void set_lon_dim (Array::Dim_iter lon)
void set_lon_length (int len)
void set_longitude_index_left (int left)
void set_longitude_index_right (int right)
void set_longitude_notation (Notation n)
void set_longitude_rightmost (bool state)
Constructors



 GridGeoConstraint (Grid *grid)
 Initialize GeoConstraint with a Grid.

Protected Member Functions

virtual LatitudeSense categorize_latitude () const
Notation categorize_notation (double left, double right) const
void find_latitude_indeces (double top, double bottom, LatitudeSense sense, int &latitude_index_top, int &latitude_index_bottom) const
void find_longitude_indeces (double left, double right, int &longitude_index_left, int &longitude_index_right) const
virtual bool is_bounding_box_valid (double left, double top, double right, double bottom) const
virtual void reorder_data_longitude_axis (Array &a)
virtual void reorder_longitude_map (int longitude_index_left)
void transform_constraint_to_pos_notation (double &left, double &right) const
virtual void transform_longitude_to_neg_pos_notation ()
virtual void transform_longitude_to_pos_notation ()

Friends

class GridGeoConstraintTest

Detailed Description

Geographical constraint applied to a grid.

Author:
James Gallagher

Definition at line 48 of file GridGeoConstraint.h.


Member Enumeration Documentation

Most of the time, latitude starts at the top of an array with positive values and ends up at the bottom with negative ones. But sometimes... the world is upside down.

Enumerator:
unknown_sense 
normal 
inverted 

Definition at line 118 of file GeoConstraint.h.

The longitude extents of the constraint bounding box can be expressed two ways: using a 0/359 notation and using a -180/179 notation. I call the 0/359 notation 'pos' and the -180/179 notation 'neg_pos'.

Enumerator:
unknown_notation 
pos 
neg_pos 

Definition at line 109 of file GeoConstraint.h.


Constructor & Destructor Documentation

libdap::GridGeoConstraint::GridGeoConstraint ( Grid grid  ) 
Todo:
Remove ds_name. 10/2/08
Parameters:
grid Set the GeoConstraint to use this Grid variable. It is the caller's responsibility to ensure that the value grid is a valid Grid variable.
ds_name The name of the dataset. Passed to BaseType::read().

Definition at line 65 of file GridGeoConstraint.cc.

References libdap::Array::dimensions(), libdap::Grid::get_array(), and libdap::BaseType::name().

Here is the call graph for this function:

virtual libdap::GridGeoConstraint::~GridGeoConstraint (  )  [inline, virtual]

Definition at line 69 of file GridGeoConstraint.h.


Member Function Documentation

void libdap::GridGeoConstraint::apply_constraint_to_data (  )  [virtual]

Once the bounding box is set use this method to apply the constraint. This modifies the data values in the Grid so that the software in Vector::serialize() will work correctly. Vector::serialize() assumes that the BaseType::read() method is called after the projection is applied to the data. That is, the projection is applied, then data are read. but geogrid() first reads all the data values and then computes the projection. To make Vector::serialize() work, this method uses the projection information recorded in the Grid by set_bounding_box() to arrange data so that the information to be sent is all that is held by the Grid. Call this after applying any 'Grid selection expressions' of the sort that can be passed to the grid() function.

Note:
Why do this here? The grid() function uses the standard logic in Vector and elsewhere to read data that's to be sent. The problem is that the data values need to be reordered using information only this object has. If this were implemented as a 'selection function' (i.e., if the code was run by ConstraintExpression::eval() then we might be able to better optimize how data are read, but in this case we have read all the data and may have alredy reorganized it. Set up the internal buffers so they hold the correct values and mark the Grid's array and lat/lon maps as read.

Implements libdap::GeoConstraint.

Definition at line 205 of file GridGeoConstraint.cc.

References libdap::Array::add_constraint(), libdap::Array::dim_begin(), libdap::Grid::get_array(), libdap::GeoConstraint::get_array_data(), libdap::GeoConstraint::get_array_data_size(), libdap::GeoConstraint::get_bounding_box_set(), libdap::GeoConstraint::get_lat(), libdap::GeoConstraint::get_lat_dim(), libdap::GeoConstraint::get_latitude_index_bottom(), libdap::GeoConstraint::get_latitude_index_top(), libdap::GeoConstraint::get_latitude_sense(), libdap::GeoConstraint::get_lon(), libdap::GeoConstraint::get_lon_dim(), libdap::GeoConstraint::get_lon_length(), libdap::GeoConstraint::get_longitude_index_left(), libdap::GeoConstraint::get_longitude_index_right(), libdap::GeoConstraint::get_longitude_notation(), libdap::GeoConstraint::inverted, libdap::GeoConstraint::neg_pos, libdap::BaseType::read(), libdap::GeoConstraint::reorder_data_longitude_axis(), libdap::GeoConstraint::reorder_longitude_map(), libdap::set_array_using_double(), libdap::GeoConstraint::set_latitude_index_bottom(), libdap::GeoConstraint::set_latitude_index_top(), libdap::GeoConstraint::set_longitude_index_left(), libdap::GeoConstraint::set_longitude_index_right(), libdap::Grid::set_read_p(), libdap::GeoConstraint::transform_longitude_to_neg_pos_notation(), and libdap::Vector::val2buf().

Here is the call graph for this function:

GeoConstraint::LatitudeSense libdap::GeoConstraint::categorize_latitude (  )  const [protected, virtual, inherited]

Take a look at the latitude vector values and record whether the world is normal or upside down.

Returns:
normal or inverted.

Definition at line 315 of file GeoConstraint.cc.

References libdap::GeoConstraint::inverted, and libdap::GeoConstraint::normal.

Referenced by libdap::GeoConstraint::set_bounding_box().

GeoConstraint::Notation libdap::GeoConstraint::categorize_notation ( double  left,
double  right 
) const [protected, inherited]

A private method that determines if the longitude part of the bounding box uses 0/359 or -180/179 notation. This class only supports latitude constriants which use 90/-90 notation, so there's no need to figure out what sort of notation they use.

Note:
This function assumes that if one of the two values is negative, then the notation is or the -180/179 form, otherwise not. If the user asks for 30 degrees to 50 degress (or 50 to 30, for that matter), there's no real way to tell which notation they are using.
Parameters:
left The left side of the bounding box, in degrees
right The right side of the boubding box
Returns:
The notation (pos or neg_pos)

Definition at line 109 of file GeoConstraint.cc.

References libdap::GeoConstraint::neg_pos, and libdap::GeoConstraint::pos.

Referenced by libdap::GeoConstraint::set_bounding_box().

void libdap::GeoConstraint::find_latitude_indeces ( double  top,
double  bottom,
LatitudeSense  sense,
int &  latitude_index_top,
int &  latitude_index_bottom 
) const [protected, inherited]

Scan from the top to the bottom, and the bottom to the top, looking for the top and bottom bounding box edges, respectively.

Parameters:
top The top edge of the bounding box
bottom The bottom edge
sense Does the array/grid store data with larger latitudes at the starting indices or are the latitude 'upside down?'
latitude_index_top Value-result parameter that holds the index in the grid's latitude map of the top bounding box edge. Uses a closed interval for the test.
latitude_index_bottom Value-result parameter for the bottom edge index.

Definition at line 272 of file GeoConstraint.cc.

References libdap::GeoConstraint::normal.

Referenced by libdap::GeoConstraint::set_bounding_box().

void libdap::GeoConstraint::find_longitude_indeces ( double  left,
double  right,
int &  longitude_index_left,
int &  longitude_index_right 
) const [protected, inherited]

Scan from the left to the right, and the right to the left, looking for the left and right bounding box edges, respectively.

Parameters:
left The left edge of the bounding box
right The right edge
longitude_index_left Value-result parameter that holds the index in the grid's longitude map of the left bounding box edge. Uses a closed interval for the test.
longitude_index_right Value-result parameter for the right edge index.

Definition at line 182 of file GeoConstraint.cc.

References DBG2.

Referenced by libdap::GeoConstraint::set_bounding_box().

char* libdap::GeoConstraint::get_array_data (  )  const [inline, inherited]
int libdap::GeoConstraint::get_array_data_size (  )  const [inline, inherited]
bool libdap::GeoConstraint::get_bounding_box_set (  )  const [inline, inherited]
set<string> libdap::GeoConstraint::get_coards_lat_units (  )  const [inline, inherited]

Definition at line 349 of file GeoConstraint.h.

set<string> libdap::GeoConstraint::get_coards_lon_units (  )  const [inline, inherited]

Definition at line 353 of file GeoConstraint.h.

virtual Grid* libdap::GridGeoConstraint::get_constrained_grid (  )  const [inline, virtual]

Definition at line 74 of file GridGeoConstraint.h.

double* libdap::GeoConstraint::get_lat (  )  const [inline, inherited]

Definition at line 233 of file GeoConstraint.h.

Referenced by apply_constraint_to_data().

Array::Dim_iter libdap::GeoConstraint::get_lat_dim (  )  const [inline, inherited]
int libdap::GeoConstraint::get_lat_length (  )  const [inline, inherited]

Definition at line 250 of file GeoConstraint.h.

set<string> libdap::GeoConstraint::get_lat_names (  )  const [inline, inherited]

Definition at line 358 of file GeoConstraint.h.

int libdap::GeoConstraint::get_latitude_index_bottom (  )  const [inline, inherited]
int libdap::GeoConstraint::get_latitude_index_top (  )  const [inline, inherited]
LatitudeSense libdap::GeoConstraint::get_latitude_sense (  )  const [inline, inherited]
double* libdap::GeoConstraint::get_lon (  )  const [inline, inherited]

Definition at line 237 of file GeoConstraint.h.

Referenced by apply_constraint_to_data().

Array::Dim_iter libdap::GeoConstraint::get_lon_dim (  )  const [inline, inherited]
int libdap::GeoConstraint::get_lon_length (  )  const [inline, inherited]
set<string> libdap::GeoConstraint::get_lon_names (  )  const [inline, inherited]

Definition at line 362 of file GeoConstraint.h.

int libdap::GeoConstraint::get_longitude_index_left (  )  const [inline, inherited]
int libdap::GeoConstraint::get_longitude_index_right (  )  const [inline, inherited]
Notation libdap::GeoConstraint::get_longitude_notation (  )  const [inline, inherited]

Definition at line 332 of file GeoConstraint.h.

Referenced by apply_constraint_to_data().

bool libdap::GeoConstraint::get_longitude_rightmost (  )  const [inline, inherited]

Definition at line 323 of file GeoConstraint.h.

Referenced by libdap::GeoConstraint::reorder_data_longitude_axis().

bool libdap::GeoConstraint::is_bounding_box_valid ( double  left,
double  top,
double  right,
double  bottom 
) const [protected, virtual, inherited]

Definition at line 150 of file GeoConstraint.cc.

References libdap::GeoConstraint::normal.

Referenced by libdap::GeoConstraint::set_bounding_box().

void libdap::GeoConstraint::reorder_data_longitude_axis ( Array a  )  [protected, virtual, inherited]

Reorder the data values relative to the longitude axis so that the reordered longitude map (see GeoConstraint::reorder_longitude_map()) and the data values match.

Note:
This method should set the d_array_data and d_array_data_size fields. If those are set, apply_constraint_to_data() will use those values.
First set all the other constraints, including the latitude and then make this call. Other constraints, besides latitude, will be simple range constraints. Latitude might require that values be inverted, but that can be done _after_ the longitude reordering takes place. The latitude constraint can be imposed by inverting the top and bottom indices if the sense of the grid is inverted, before data are read in this method. Then apply the longitude constraint, then invert the result of the merge, if needed.
Todo:
Fix this code so that it works with latitude as the rightmost map

Definition at line 400 of file GeoConstraint.cc.

References libdap::Array::add_constraint(), libdap::Vector::buf2val(), DBG, DBG2, libdap::GeoConstraint::get_lon_length(), libdap::GeoConstraint::get_longitude_index_left(), libdap::GeoConstraint::get_longitude_index_right(), libdap::GeoConstraint::get_longitude_rightmost(), libdap::Vector::length(), libdap::Array::print_val(), libdap::BaseType::read(), libdap::Vector::set_read_p(), libdap::Vector::value(), libdap::Vector::var(), and libdap::BaseType::width().

Referenced by apply_constraint_to_data(), and libdap::ArrayGeoConstraint::apply_constraint_to_data().

Here is the call graph for this function:

void libdap::GeoConstraint::reorder_longitude_map ( int  longitude_index_left  )  [protected, virtual, inherited]

Reorder the elements in the longitude map so that the longitude constraint no longer crosses the edge of the map's storage. The d_lon field is modified.

Note:
The d_lon vector always has double values regardless of the type of d_longitude.
Parameters:
longitude_index_left The left edge of the bounding box.

Definition at line 360 of file GeoConstraint.cc.

Referenced by apply_constraint_to_data().

void libdap::GeoConstraint::set_bounding_box ( double  left,
double  top,
double  right,
double  bottom 
) [inherited]

Set the bounding box for this constraint. After calling this method the object has values for the indexes for the latitude and longitude extent as well as the sense of the latitude (south pole at the top or bottom of the Array or Grid). These are used by the apply_constraint_to_data() method to actually constrain the data.

Parameters:
left The left side of the bounding box.
right The right side
top The top
bottom The bottom

Definition at line 549 of file GeoConstraint.cc.

References libdap::GeoConstraint::categorize_latitude(), libdap::GeoConstraint::categorize_notation(), DBG, libdap::double_to_string(), libdap::GeoConstraint::find_latitude_indeces(), libdap::GeoConstraint::find_longitude_indeces(), libdap::GeoConstraint::is_bounding_box_valid(), libdap::GeoConstraint::neg_pos, libdap::GeoConstraint::transform_constraint_to_pos_notation(), and libdap::GeoConstraint::transform_longitude_to_pos_notation().

Here is the call graph for this function:

void libdap::GeoConstraint::set_lat ( double *  lat  )  [inline, inherited]

Definition at line 241 of file GeoConstraint.h.

void libdap::GeoConstraint::set_lat_dim ( Array::Dim_iter  lat  )  [inline, inherited]

Definition at line 279 of file GeoConstraint.h.

void libdap::GeoConstraint::set_lat_length ( int  len  )  [inline, inherited]

Definition at line 258 of file GeoConstraint.h.

void libdap::GeoConstraint::set_latitude_index_bottom ( int  bottom  )  [inline, inherited]
void libdap::GeoConstraint::set_latitude_index_top ( int  top  )  [inline, inherited]
void libdap::GeoConstraint::set_latitude_sense ( LatitudeSense  l  )  [inline, inherited]

Definition at line 344 of file GeoConstraint.h.

void libdap::GeoConstraint::set_lon ( double *  lon  )  [inline, inherited]

Definition at line 245 of file GeoConstraint.h.

void libdap::GeoConstraint::set_lon_dim ( Array::Dim_iter  lon  )  [inline, inherited]

Definition at line 275 of file GeoConstraint.h.

void libdap::GeoConstraint::set_lon_length ( int  len  )  [inline, inherited]

Definition at line 262 of file GeoConstraint.h.

void libdap::GeoConstraint::set_longitude_index_left ( int  left  )  [inline, inherited]
void libdap::GeoConstraint::set_longitude_index_right ( int  right  )  [inline, inherited]
void libdap::GeoConstraint::set_longitude_notation ( Notation  n  )  [inline, inherited]

Definition at line 340 of file GeoConstraint.h.

void libdap::GeoConstraint::set_longitude_rightmost ( bool  state  )  [inline, inherited]

Definition at line 327 of file GeoConstraint.h.

void libdap::GeoConstraint::transform_constraint_to_pos_notation ( double &  left,
double &  right 
) const [protected, inherited]

Definition at line 120 of file GeoConstraint.cc.

Referenced by libdap::GeoConstraint::set_bounding_box().

void libdap::GeoConstraint::transform_longitude_to_neg_pos_notation (  )  [protected, virtual, inherited]

Given that the Grid has a longitude map that uses the 'pos' notation, transform it to the 'neg_pos' notation. This method modifies the d_longitude Array.

Definition at line 144 of file GeoConstraint.cc.

Referenced by apply_constraint_to_data().

void libdap::GeoConstraint::transform_longitude_to_pos_notation (  )  [protected, virtual, inherited]

Given that the Grid has a longitude map that uses the 'neg_pos' notation, transform it to the 'pos' notation. This method modifies the d_longitude Array.

Definition at line 132 of file GeoConstraint.cc.

Referenced by libdap::GeoConstraint::set_bounding_box().


Friends And Related Function Documentation

friend class GridGeoConstraintTest [friend]

Reimplemented from libdap::GeoConstraint.

Definition at line 61 of file GridGeoConstraint.h.


The documentation for this class was generated from the following files:

Generated on Sat Dec 5 12:26:20 2009 for libdap++ by  doxygen 1.6.1