Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConstantin Shalnev <c.shalnev@corp.mail.ru>2015-10-07 12:42:52 +0300
committerConstantin Shalnev <c.shalnev@corp.mail.ru>2015-10-07 15:18:20 +0300
commit26ea5f4351658a38de0e266640ae540c5fb30ea7 (patch)
tree875c128a4132a378e62d2a277ed8cf02cbeacc7c /indexer/drules_selector.cpp
parent65f68fbe3b9a20da8aa9e0ada3164b9328822a6f (diff)
Added selector: envelope_area
Diffstat (limited to 'indexer/drules_selector.cpp')
-rw-r--r--indexer/drules_selector.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/indexer/drules_selector.cpp b/indexer/drules_selector.cpp
index 3fb4d1ab09..f838223991 100644
--- a/indexer/drules_selector.cpp
+++ b/indexer/drules_selector.cpp
@@ -1,6 +1,7 @@
#include "indexer/drules_selector.hpp"
#include "indexer/drules_selector_parser.hpp"
#include "indexer/ftypes_matcher.hpp"
+#include "indexer/scales.hpp"
#include "base/assert.hpp"
#include "base/logging.hpp"
@@ -110,6 +111,18 @@ bool GetName(FeatureType const & ft, string & name)
return true;
}
+// Feature tag value evaluator for tag 'envelope_area' (envelope area in sq.meters)
+bool GetEnvelopeArea(FeatureType const & ft, double & sqM)
+{
+ if (feature::GEOM_AREA != ft.GetFeatureType())
+ return false;
+
+ m2::RectD const rect = ft.GetLimitRect(scales::GetUpperScale());
+
+ sqM = MercatorBounds::AreaOnEarth(rect.LeftTop(), rect.LeftBottom(), rect.RightBottom()) +
+ MercatorBounds::AreaOnEarth(rect.LeftTop(), rect.RightTop(), rect.RightBottom());
+ return true;
+}
// Add new tag value evaluator here
@@ -121,18 +134,17 @@ unique_ptr<ISelector> ParseSelector(string const & str)
if (!ParseSelector(str, e))
{
// bad string format
- LOG(LDEBUG, ("Invalid selector format: ", str));
+ LOG(LDEBUG, ("Invalid selector format:", str));
return unique_ptr<ISelector>();
}
- // Tag 'population'
if (e.m_tag == "population")
{
int value = 0;
if (!e.m_value.empty() && (!strings::to_int(e.m_value, value) || value < 0))
{
// bad string format
- LOG(LDEBUG, ("Invalid selector: ", str));
+ LOG(LDEBUG, ("Invalid selector:", str));
return unique_ptr<ISelector>();
}
return make_unique<Selector<uint32_t>>(&GetPopulation, e.m_operator, static_cast<uint32_t>(value));
@@ -141,11 +153,22 @@ unique_ptr<ISelector> ParseSelector(string const & str)
{
return make_unique<Selector<string>>(&GetName, e.m_operator, e.m_value);
}
+ else if (e.m_tag == "envelope_area")
+ {
+ double value = 0;
+ if (!e.m_value.empty() && (!strings::to_double(e.m_value, value) || value < 0))
+ {
+ // bad string format
+ LOG(LDEBUG, ("Invalid selector:", str));
+ return unique_ptr<ISelector>();
+ }
+ return make_unique<Selector<double>>(&GetEnvelopeArea, e.m_operator, value);
+ }
// Add new tag here
// unrecognized selector
- LOG(LDEBUG, ("Unrecognized selector: ", str));
+ LOG(LDEBUG, ("Unrecognized selector:", str));
return unique_ptr<ISelector>();
}
@@ -158,7 +181,7 @@ unique_ptr<ISelector> ParseSelector(vector<string> const & strs)
unique_ptr<ISelector> s = ParseSelector(str);
if (nullptr == s)
{
- LOG(LDEBUG, ("Invalid composite selector: ", str));
+ LOG(LDEBUG, ("Invalid composite selector:", str));
return unique_ptr<ISelector>();
}
cs->Add(move(s));