40 #include <boost/algorithm/string.hpp> 
   41 #include <boost/foreach.hpp> 
   42 #include <boost/format.hpp> 
   43 #include <boost/property_tree/json_parser.hpp> 
   44 #include <boost/property_tree/ptree.hpp> 
   57   m_uomsIdxByName.clear();
 
   65   if(it != m_uoms.end())
 
   68   m_uoms.insert(std::pair<unsigned int, UnitOfMeasurePtr>(uom->getId(),uom));
 
   70   std::string upstr = boost::to_upper_copy(uom->getName());
 
   71   m_uomsIdxByName.insert(std::pair<std::string, unsigned int>(upstr,uom->getId()));
 
   78   for(std::size_t i=0; i<alternativeNames.size(); ++i)
 
   80     std::string upstr = boost::to_upper_copy(alternativeNames[i]);
 
   81     m_uomsIdxByName.insert(std::pair<std::string, unsigned int>(upstr,uom->getId()));
 
   89   iterator it = m_uoms.find(uom->getId());
 
   90   if (it == m_uoms.end())
 
   95   for (std::map<std::string, unsigned int>::iterator itn = m_uomsIdxByName.begin(); itn != m_uomsIdxByName.end();)
 
   97     if (itn->second == uom->getId())
 
   98       m_uomsIdxByName.erase(itn++);
 
  108   if (it == m_uoms.end())
 
  117   std::string upstr = boost::to_upper_copy(name);
 
  119   std::map<std::string, unsigned int>::const_iterator it = m_uomsIdxByName.find(upstr);
 
  121   if(it != m_uomsIdxByName.end())
 
  124     if (it2 != m_uoms.end())
 
  135   while (it != m_uoms.end())
 
  137     if (it->second->getSymbol() == symbol)
 
  146   std::map<std::string, unsigned int>::const_iterator it = m_uomsIdxByName.begin();
 
  147   while (it != m_uomsIdxByName.end()) 
 
  149     if (it->second == uom->getId())
 
  150       names.push_back(it->first);
 
  160   if (uFrom->getType() != uTo->getType())
 
  161     throw Exception(
TE_TR(
"There is not conversion between units for different types of measures."));
 
  163   if (uFrom->getBaseUnitId() == uTo->getId()) 
 
  165     return (uFrom->getConversionValue());
 
  167   else if (uTo->getBaseUnitId() == uFrom->getId())  
 
  171     uTo->getConversionFactors(a,b,c,d);
 
  172     return ((b-d)/(c-a));
 
  182   if (uFrom->getType() != uTo->getType())
 
  185   if ((uFrom->getBaseUnitId() == uTo->getId()) ||
 
  186       (uTo->getBaseUnitId() == uFrom->getId()))
 
  195     throw Exception(
TE_TR(
"The unit of measure manager is already initialized!"));
 
  200     throw Exception(
TE_TR(
"The unit of measure JSON file could not be found!"));
 
  202   boost::property_tree::ptree pt;
 
  204   boost::property_tree::json_parser::read_json(uom_file, pt);
 
  206   BOOST_FOREACH(boost::property_tree::ptree::value_type& v, pt.get_child(
"units"))
 
  208     unsigned int id = v.second.get<
unsigned int>(
"id");
 
  209     std::string name = v.second.get<std::string>(
"name");
 
  210     std::string symbol = v.second.get<std::string>(
"symbol");
 
  211     std::string stype = v.second.get<std::string>(
"type");
 
  212     std::string description = v.second.get<std::string>(
"description");
 
  213     unsigned int targetUOM = v.second.get<
unsigned int>(
"target_uom");
 
  214     double a = v.second.get<
double>(
"factor_a");
 
  215     double b = v.second.get<
double>(
"factor_b");
 
  216     double c = v.second.get<
double>(
"factor_c");
 
  217     double d = v.second.get<
double>(
"factor_d");
 
  221     if(stype == 
"length")
 
  223     else if(stype == 
"area")
 
  225     else if(stype == 
"volume")
 
  227     else if(stype == 
"angle")
 
  229     else if(stype == 
"scale")
 
  231     else if(stype == 
"time")
 
  233     else if(stype == 
"speed")
 
  237       throw Exception((boost::format(
TE_TR(
"Invalid unit of measure type: %1%!")) % stype).str());
 
void remove(UnitOfMeasurePtr &uom)
Removes a unit of measure from the manager. 
 
void insert(UnitOfMeasurePtr &uom)
Inserts a new unit of measure to be managed. 
 
void init()
It initializes the list of well kown units of measure. 
 
TECOMMONEXPORT std::string FindInTerraLibPath(const std::string &p)
Returns the path relative to a directory or file in the context of TerraLib. 
 
A singleton class for dealing with units-of-measure. 
 
UnitOfMeasurePtr findBySymbol(const std::string &symbol) const 
Returns a unit of measure identified by its symbol. 
 
void clear()
Removes all units from the catalogue. 
 
#define TE_TR(message)
It marks a string in order to get translated. 
 
void getNames(UnitOfMeasurePtr &uom, std::vector< std::string > &names) const 
Retrieves the alternative names for a unit of measure. 
 
std::map< unsigned int, UnitOfMeasurePtr >::const_iterator const_iterator
 
mydialect insert("+", new te::da::BinaryOpEncoder("+"))
 
A class for representing a unit of measure. 
 
double getConversion(const std::string &unitFromName, const std::string &unitToName) const 
Calculates a multiplicative factor to convert from a given unit to its base unit and vice-versa...
 
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
 
This class is designed for dealing with multi-language text translation in TerraLib. 
 
boost::shared_ptr< UnitOfMeasure > UnitOfMeasurePtr
 
MeasureType
Defines the possible types of unit of measurements. 
 
A class to represent units of measure. 
 
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
 
bool areConvertible(const std::string &unitFromName, const std::string &unitToName) const 
Check if two units of measure are compatible. 
 
Utility functions for dealing with strings. 
 
UnitOfMeasurePtr find(unsigned int id) const 
Returns a unit of measure identified by its identificaton. 
 
UnitsOfMeasureManager()
It initializes the Singleton. 
 
~UnitsOfMeasureManager()
Destructor. 
 
This file contains several utility functions for dealing with STL containers. 
 
std::map< unsigned int, UnitOfMeasurePtr >::iterator iterator