diff options
author | Alex Zolotarev <alex@maps.me> | 2016-03-01 13:02:03 +0300 |
---|---|---|
committer | Sergey Yershov <yershov@corp.mail.ru> | 2016-03-23 16:50:48 +0300 |
commit | 9ec64c31e4cfa10b2c4035dc77a853c14d5ea9b9 (patch) | |
tree | 3cd0300056ea92ddf890102edad8b1d226dbfd57 /indexer/map_object.cpp | |
parent | 2cf158a88734e9da0a1bed8fdc4f89661dcc023c (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.cpp | 172 |
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 |