libdap++ Updated for version 3.8.2
|
00001 00002 // -*- mode: c++; c-basic-offset:4 -*- 00003 00004 // This file is part of libdap, A C++ implementation of the OPeNDAP Data 00005 // Access Protocol. 00006 00007 // Copyright (c) 2006 OPeNDAP, Inc. 00008 // Author: James Gallagher <jgallagher@opendap.org> 00009 // 00010 // This library is free software; you can redistribute it and/or 00011 // modify it under the terms of the GNU Lesser General Public 00012 // License as published by the Free Software Foundation; either 00013 // version 2.1 of the License, or (at your option) any later version. 00014 // 00015 // This library is distributed in the hope that it will be useful, 00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 // Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public 00021 // License along with this library; if not, write to the Free Software 00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00023 // 00024 // You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112. 00025 00026 #ifndef _geo_constraint_h 00027 #define _geo_constraint_h 1 00028 00029 #include <string> 00030 #include <sstream> 00031 #include <set> 00032 00033 #ifndef _basetype_h 00034 #include "BaseType.h" 00035 #endif 00036 00037 #ifndef _array_h 00038 #include "Array.h" 00039 #endif 00040 00041 #ifndef _grid_h 00042 #include "Grid.h" 00043 #endif 00044 00045 namespace libdap 00046 { 00047 00103 class GeoConstraint 00104 { 00105 public: 00109 enum Notation { 00110 unknown_notation, 00111 pos, 00112 neg_pos 00113 }; 00114 00118 enum LatitudeSense { 00119 unknown_sense, 00120 normal, 00121 inverted 00122 }; 00123 00124 private: 00125 char *d_array_data; //< Holds the Grid's data values 00126 int d_array_data_size; 00127 00128 double *d_lat; //< Holds the latitude values 00129 double *d_lon; //< Holds the longitude values 00130 int d_lat_length; //< How long is the latitude vector 00131 int d_lon_length; //< ... longitude vector 00132 00133 // These four are indexes of the constraint 00134 int d_latitude_index_top; 00135 int d_latitude_index_bottom; 00136 int d_longitude_index_left; 00137 int d_longitude_index_right; 00138 00139 bool d_bounding_box_set; //< Has the bounding box been set? 00140 bool d_longitude_rightmost; //< Is longitude the rightmost dimension? 00141 00142 Notation d_longitude_notation; 00143 LatitudeSense d_latitude_sense; 00144 00145 Array::Dim_iter d_lon_dim; //< References the longitude dimension 00146 Array::Dim_iter d_lat_dim; //< References the latitude dimension 00147 00148 // Sets of string values used to find stuff in attributes 00149 set<string> d_coards_lat_units; 00150 set<string> d_coards_lon_units; 00151 00152 set<string> d_lat_names; 00153 set<string> d_lon_names; 00154 00155 // Hide these three automatically provided methods 00156 GeoConstraint(const GeoConstraint ¶m); 00157 GeoConstraint &operator=(GeoConstraint &rhs); 00158 00159 protected: 00168 virtual bool build_lat_lon_maps() = 0; 00169 00180 virtual bool lat_lon_dimensions_ok() = 0; 00181 00182 Notation categorize_notation(double left, double right) const; 00183 void transform_constraint_to_pos_notation(double &left, double &right) const; 00184 virtual void transform_longitude_to_pos_notation(); 00185 virtual void transform_longitude_to_neg_pos_notation(); 00186 virtual bool is_bounding_box_valid(double left, double top, double right, 00187 double bottom) const; 00188 void find_longitude_indeces(double left, double right, 00189 int &longitude_index_left, 00190 int &longitude_index_right) const; 00191 #if 0 00192 virtual void set_bounding_box_longitude(double left, double right) ; 00193 #endif 00194 virtual void reorder_longitude_map(int longitude_index_left); 00195 00196 virtual LatitudeSense categorize_latitude() const; 00197 void find_latitude_indeces(double top, double bottom, LatitudeSense sense, 00198 int &latitude_index_top, 00199 int &latitude_index_bottom) const; 00200 #if 0 00201 virtual void set_bounding_box_latitude(double top, double bottom) ; 00202 #endif 00203 virtual void reorder_data_longitude_axis(Array &a); 00204 00205 00206 friend class GridGeoConstraintTest; // Unit tests 00207 00208 public: 00211 GeoConstraint(); 00213 00214 virtual ~GeoConstraint() 00215 { 00216 delete [] d_lat; 00217 delete [] d_lon; 00218 delete [] d_array_data; d_array_data = 0; 00219 } 00220 00223 // These are set in reorder_data_longitude_axis() 00224 char *get_array_data() const 00225 { 00226 return d_array_data; 00227 } 00228 int get_array_data_size() const 00229 { 00230 return d_array_data_size; 00231 } 00232 00233 double *get_lat() const 00234 { 00235 return d_lat; 00236 } 00237 double *get_lon() const 00238 { 00239 return d_lon; 00240 } 00241 void set_lat(double *lat) 00242 { 00243 d_lat = lat; 00244 } 00245 void set_lon(double *lon) 00246 { 00247 d_lon = lon; 00248 } 00249 00250 int get_lat_length() const 00251 { 00252 return d_lat_length; 00253 } 00254 int get_lon_length() const 00255 { 00256 return d_lon_length; 00257 } 00258 void set_lat_length(int len) 00259 { 00260 d_lat_length = len; 00261 } 00262 void set_lon_length(int len) 00263 { 00264 d_lon_length = len; 00265 } 00266 00267 Array::Dim_iter get_lon_dim() const 00268 { 00269 return d_lon_dim; 00270 } 00271 Array::Dim_iter get_lat_dim() const 00272 { 00273 return d_lat_dim; 00274 } 00275 void set_lon_dim(Array::Dim_iter lon) 00276 { 00277 d_lon_dim = lon; 00278 } 00279 void set_lat_dim(Array::Dim_iter lat) 00280 { 00281 d_lat_dim = lat; 00282 } 00283 00284 // These four are indexes of the constraint 00285 int get_latitude_index_top() const 00286 { 00287 return d_latitude_index_top; 00288 } 00289 int get_latitude_index_bottom() const 00290 { 00291 return d_latitude_index_bottom; 00292 } 00293 void set_latitude_index_top(int top) 00294 { 00295 d_latitude_index_top = top; 00296 } 00297 void set_latitude_index_bottom(int bottom) 00298 { 00299 d_latitude_index_bottom = bottom; 00300 } 00301 00302 int get_longitude_index_left() const 00303 { 00304 return d_longitude_index_left; 00305 } 00306 int get_longitude_index_right() const 00307 { 00308 return d_longitude_index_right; 00309 } 00310 void set_longitude_index_left(int left) 00311 { 00312 d_longitude_index_left = left; 00313 } 00314 void set_longitude_index_right(int right) 00315 { 00316 d_longitude_index_right = right; 00317 } 00318 00319 bool get_bounding_box_set() const 00320 { 00321 return d_bounding_box_set; 00322 } 00323 bool get_longitude_rightmost() const 00324 { 00325 return d_longitude_rightmost; 00326 } 00327 void set_longitude_rightmost(bool state) 00328 { 00329 d_longitude_rightmost = state; 00330 } 00331 00332 Notation get_longitude_notation() const 00333 { 00334 return d_longitude_notation; 00335 } 00336 LatitudeSense get_latitude_sense() const 00337 { 00338 return d_latitude_sense; 00339 } 00340 void set_longitude_notation(Notation n) 00341 { 00342 d_longitude_notation = n; 00343 } 00344 void set_latitude_sense(LatitudeSense l) 00345 { 00346 d_latitude_sense = l; 00347 } 00348 00349 set<string> get_coards_lat_units() const 00350 { 00351 return d_coards_lat_units; 00352 } 00353 set<string> get_coards_lon_units() const 00354 { 00355 return d_coards_lon_units; 00356 } 00357 00358 set<string> get_lat_names() const 00359 { 00360 return d_lat_names; 00361 } 00362 set<string> get_lon_names() const 00363 { 00364 return d_lon_names; 00365 } 00367 00368 void set_bounding_box(double left, double top, double right, double bottom); 00369 00372 virtual void apply_constraint_to_data() = 0; 00373 }; 00374 00375 } // namespace libdap 00376 00377 #endif // _geo_constraint_h 00378