/** * @file grid_info.hpp * * @date June 24, 2010 * @author Aditya Gadre (agadre@vt.edu) * * $Id$ * $Author$ * $Rev$ * * grid_info.hpp defines class that manages * size information for grids in EF coordinate frame. * */ #ifndef GRIDINFO_HPP_ #define GRIDINFO_HPP_ #include #include #include #include #include "riverine/core/datatypes.hpp" #include "riverine/core/tagged.hpp" #include "riverine/third_party/moos/MOOSGeodesy.h" /** * @class grid_info */ class grid_info : public tagged { // Types public: typedef uuid tag_type; // Methods public: grid_info(); grid_info(const double& nl, const double& el, const unsigned int& r, const unsigned int& c); grid_info(const double& lat, const double& lon, const double& northlen, const double& eastlen, const unsigned int& rows, const unsigned int& columns); virtual ~grid_info(); // Utility bool valid() const; void reset(); // Initialization void init(const double& northlen, const double& eastlen, const unsigned int& rows, const unsigned int& columns); void init_with_origin_latlon( const double& lat, const double& lon, const double& north_len, const double& east_len, const int& rows, const int& columns); void set_utm(const bool& utm); bool get_utm() const; void configure(const boost::property_tree::ptree& pt); void configure(const boost::property_tree::ptree& pt, const std::string& node); // Coordinate conversion grid_coord grid_coord_from_local(const double& north, const double& east); grid_coord grid_coord_from_local(const local_coord& coord); local_coord local_coord_from_latlon(const double& lat, const double& lon); local_coord local_coord_from_latlon(const lla_coord& coord); local_coord local_coord_from_grid(const int& row, const int& column); local_coord local_coord_from_grid(const grid_coord& coord); lla_coord latlon_from_local(const double& north, const double& east); lla_coord latlon_from_local(const local_coord& coord); // Check coordinate validity bool is_coord_valid(const int& row, const int& col) const; bool is_coord_valid(const double& north, const double& east) const; // Get functions double row_size() const; double column_size() const; int columns() const; int rows() const; double east_length() const; double north_length() const; double origin_lat() const; double origin_lon() const; std::string print() const; std::string serialize(const std::string& delim = ",") const; private: friend class boost::serialization::access; template void save(Archive& ar, const unsigned int version) const { ar << north_length_; ar << east_length_; ar << rows_; ar << columns_; ar << origin_lat_; ar << origin_lon_; ar << utm_; ar << tag_; } template void load(Archive& ar, const unsigned int version) { ar >> north_length_; ar >> east_length_; ar >> rows_; ar >> columns_; ar >> origin_lat_; ar >> origin_lon_; if(!valid()) // if not valid, no initialization done reset(); else // if valid, then original grid info has been initialized init_with_origin_latlon(origin_lat_, origin_lon_, north_length_, east_length_, rows_, columns_); ar >> utm_; ar >> tag_; } BOOST_SERIALIZATION_SPLIT_MEMBER(); // Implementation protected: /// North length double north_length_; /// East length double east_length_; /// Number of rows int rows_; /// Number of columns int columns_; /// Origin latitude double origin_lat_; /// Origin longitude double origin_lon_; private: /// Row size double row_size_; /// Column size double column_size_; /// Geodesy object from MOOS CMOOSGeodesy geo_; /// UTM or local grid bool utm_; }; #endif /* GRIDINFO_HPP_ */