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));
180 throw Exception(
TE_TR(
"The unit of measure manager is already initialized!"));
185 throw Exception(
TE_TR(
"The unit of measure JSON file could not be found!"));
187 boost::property_tree::ptree pt;
189 boost::property_tree::json_parser::read_json(uom_file, pt);
191 BOOST_FOREACH(boost::property_tree::ptree::value_type& v, pt.get_child(
"units"))
193 unsigned int id = v.second.get<
unsigned int>(
"id");
194 std::string name = v.second.get<std::string>(
"name");
195 std::string symbol = v.second.get<std::string>(
"symbol");
196 std::string stype = v.second.get<std::string>(
"type");
197 std::string description = v.second.get<std::string>(
"description");
198 unsigned int targetUOM = v.second.get<
unsigned int>(
"target_uom");
199 double a = v.second.get<
double>(
"factor_a");
200 double b = v.second.get<
double>(
"factor_b");
201 double c = v.second.get<
double>(
"factor_c");
202 double d = v.second.get<
double>(
"factor_d");
206 if(stype ==
"length")
208 else if(stype ==
"area")
210 else if(stype ==
"volume")
212 else if(stype ==
"angle")
214 else if(stype ==
"scale")
216 else if(stype ==
"time")
218 else if(stype ==
"speed")
222 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. ...
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