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