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:
authorAlex Zolotarev <alex@maps.me>2016-03-01 13:02:03 +0300
committerSergey Yershov <yershov@corp.mail.ru>2016-03-23 16:50:48 +0300
commit9ec64c31e4cfa10b2c4035dc77a853c14d5ea9b9 (patch)
tree3cd0300056ea92ddf890102edad8b1d226dbfd57 /indexer/map_object.cpp
parent2cf158a88734e9da0a1bed8fdc4f89661dcc023c (diff)
Base class MapObject to store feature properties and query them in UI code.
Diffstat (limited to 'indexer/map_object.cpp')
-rw-r--r--indexer/map_object.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/indexer/map_object.cpp b/indexer/map_object.cpp
new file mode 100644
index 0000000000..27a455b332
--- /dev/null
+++ b/indexer/map_object.cpp
@@ -0,0 +1,172 @@
+#include "map_object.hpp"
+
+#include "indexer/categories_holder.hpp"
+#include "indexer/cuisines.hpp"
+#include "indexer/feature.hpp"
+#include "indexer/feature_algo.hpp"
+
+#include "platform/measurement_utils.hpp"
+#include "platform/preferred_languages.hpp"
+
+#include "base/logging.hpp"
+#include "base/string_utils.hpp"
+
+namespace osm
+{
+namespace
+{
+constexpr char const * kWlan = "wlan";
+constexpr char const * kWired = "wired";
+constexpr char const * kYes = "yes";
+constexpr char const * kNo = "no";
+}
+
+string DebugPrint(osm::Internet internet)
+{
+ switch (internet)
+ {
+ case Internet::No: return kNo;
+ case Internet::Yes: return kYes;
+ case Internet::Wlan: return kWlan;
+ case Internet::Wired: return kWired;
+ case Internet::Unknown: break;
+ }
+ return {};
+}
+
+string DebugPrint(Props props)
+{
+ string k;
+ switch (props)
+ {
+ case osm::Props::Phone: k = "phone"; break;
+ case osm::Props::Fax: k = "fax"; break;
+ case osm::Props::Email: k = "email"; break;
+ case osm::Props::Website: k = "website"; break;
+ case osm::Props::Internet: k = "internet_access"; break;
+ case osm::Props::Cuisine: k = "cuisine"; break;
+ case osm::Props::OpeningHours: k = "opening_hours"; break;
+ case osm::Props::Stars: k = "stars"; break;
+ case osm::Props::Operator: k = "operator"; break;
+ case osm::Props::Elevation: k = "ele"; break;
+ case osm::Props::Wikipedia: k = "wikipedia"; break;
+ case osm::Props::Flats: k = "addr:flats"; break;
+ case osm::Props::BuildingLevels: k = "building:levels"; break;
+ }
+ return k;
+}
+
+void MapObject::SetFromFeatureType(FeatureType const & ft)
+{
+ m_mercator = feature::GetCenter(ft);
+ m_name = ft.GetNames();
+ m_types = feature::TypesHolder(ft);
+ m_metadata = ft.GetMetadata();
+ m_featureID = ft.GetID();
+ ASSERT(m_featureID.IsValid(), ());
+}
+
+FeatureID const & MapObject::GetID() const { return m_featureID; }
+ms::LatLon MapObject::GetLatLon() const { return MercatorBounds::ToLatLon(m_mercator); }
+m2::PointD const & MapObject::GetMercator() const { return m_mercator; }
+feature::TypesHolder const & MapObject::GetTypes() const { return m_types; }
+string MapObject::GetDefaultName() const
+{
+ string name;
+ UNUSED_VALUE(m_name.GetString(StringUtf8Multilang::kDefaultCode, name));
+ return name;
+}
+
+string MapObject::GetLocalizedType() const
+{
+ ASSERT(!m_types.Empty(), ());
+ feature::TypesHolder copy(m_types);
+ copy.SortBySpec();
+ CategoriesHolder const & categories = GetDefaultCategories();
+ return categories.GetReadableFeatureType(
+ *copy.begin(), categories.MapLocaleToInteger(languages::GetCurrentOrig()));
+}
+
+vector<osm::Props> MapObject::AvailableProperties() const
+{
+ return MetadataToProps(m_metadata.GetPresentTypes());
+}
+
+string MapObject::GetPhone() const { return m_metadata.Get(feature::Metadata::FMD_PHONE_NUMBER); }
+string MapObject::GetFax() const { return m_metadata.Get(feature::Metadata::FMD_FAX_NUMBER); }
+string MapObject::GetEmail() const { return m_metadata.Get(feature::Metadata::FMD_EMAIL); }
+string MapObject::GetWebsite() const
+{
+ string website = m_metadata.Get(feature::Metadata::FMD_WEBSITE);
+ if (website.empty())
+ website = m_metadata.Get(feature::Metadata::FMD_URL);
+ return website;
+}
+
+Internet MapObject::GetInternet() const
+{
+ string inet = m_metadata.Get(feature::Metadata::FMD_INTERNET);
+ strings::AsciiToLower(inet);
+ // Most popular case.
+ if (inet.empty())
+ return Internet::Unknown;
+ if (inet.find(kWlan) != string::npos)
+ return Internet::Wlan;
+ if (inet.find(kWired) != string::npos)
+ return Internet::Wired;
+ if (inet == kYes)
+ return Internet::Yes;
+ if (inet == kNo)
+ return Internet::No;
+ return Internet::Unknown;
+}
+
+vector<string> MapObject::GetCuisines() const
+{
+ vector<string> localized;
+ Cuisines::Instance().ParseAndLocalize(m_metadata.Get(feature::Metadata::FMD_CUISINE), localized);
+ return localized;
+}
+
+string MapObject::FormatCuisines() const { return strings::JoinStrings(GetCuisines(), " • "); }
+string MapObject::GetOpeningHours() const
+{
+ return m_metadata.Get(feature::Metadata::FMD_OPEN_HOURS);
+}
+
+string MapObject::GetOperator() const { return m_metadata.Get(feature::Metadata::FMD_OPERATOR); }
+int MapObject::GetStars() const
+{
+ // Most popular case.
+ if (m_metadata.Has(feature::Metadata::FMD_STARS))
+ {
+ int count;
+ if (strings::to_int(m_metadata.Get(feature::Metadata::FMD_STARS), count))
+ return count;
+ }
+ return 0;
+}
+
+string MapObject::GetElevation() const
+{
+ if (m_metadata.Has(feature::Metadata::FMD_ELE))
+ {
+ double value;
+ if (strings::to_double(m_metadata.Get(feature::Metadata::FMD_ELE), value))
+ return MeasurementUtils::FormatAltitude(value);
+ else
+ LOG(LWARNING,
+ ("Invalid metadata for elevation:", m_metadata.Get(feature::Metadata::FMD_ELE)));
+ }
+ return {};
+}
+
+string MapObject::GetWikipediaLink() const { return m_metadata.GetWikiURL(); }
+string MapObject::GetFlats() const { return m_metadata.Get(feature::Metadata::FMD_FLATS); }
+string MapObject::GetBuildingLevels() const
+{
+ return m_metadata.Get(feature::Metadata::FMD_BUILDING_LEVELS);
+}
+
+feature::Metadata const & MapObject::GetMetadata() const { return m_metadata; }
+} // namespace osm