diff options
author | Sergey Magidovich <mgsergio@mapswithme.com> | 2015-12-15 21:12:40 +0300 |
---|---|---|
committer | Sergey Yershov <yershov@corp.mail.ru> | 2016-03-23 16:04:00 +0300 |
commit | 4c3355a1454707bf96487674e37ad0b7ebd0b880 (patch) | |
tree | 8ff4a4ff3baa36497c7d073d4876120c797ae17b /indexer/feature.cpp | |
parent | a2b10e7042ec97a186a3cd76638ca43b2986440b (diff) |
FeatureType from/to XMLFeature.
Diffstat (limited to 'indexer/feature.cpp')
-rw-r--r-- | indexer/feature.cpp | 93 |
1 files changed, 91 insertions, 2 deletions
diff --git a/indexer/feature.cpp b/indexer/feature.cpp index 9c4583d6d5..124ef9e91b 100644 --- a/indexer/feature.cpp +++ b/indexer/feature.cpp @@ -10,8 +10,7 @@ #include "platform/preferred_languages.hpp" -#include "defines.hpp" // just for file extensions - +#include "base/range_iterator.hpp" using namespace feature; @@ -29,6 +28,96 @@ void FeatureBase::Deserialize(feature::LoaderBase * pLoader, TBuffer buffer) m_header = m_pLoader->GetHeader(); } +FeatureType FeatureType::FromXML(string const & xml) +{ + pugi::xml_document document; + document.load(xml.data()); + return FromXML(document); +} + +FeatureType FeatureType::FromXML(editor::XMLFeature const & xml) +{ + FeatureType feature; + feature.m_bTrianglesParsed = false; + feature.m_bPointsParsed = false; + + feature.m_center = xml.GetCenter(); + + xml.ForEachName([&feature](string const & lang, string const & name) + { + feature.m_params.name.AddString(lang, name); + }); + feature.m_params.house.Set(xml.GetHouse()); + + // TODO(mgsergio): + // feature.m_params.ref = + // feature.m_params.layer = + // feature.m_params.rank = + feature.m_bCommonParsed = true; + + // EGeomType + + // for (auto const i : range(feature.GetTypesCount())) + // m_types[i] = + // Does the order matter? If so what order should be? + // TODO(mgsergio): Only features with single type are currently supported. + // TODO(mgsergio): Replace hardcode with real values. + feature.m_types[0] = classif().GetTypeByPath({"amenity", "atm"}); + feature.m_bTypesParsed = true; + + for (auto const i : my::range(1u, static_cast<uint32_t>(feature::Metadata::FMD_COUNT))) + { + auto const type = static_cast<feature::Metadata::EType>(i); + auto const attributeName = DebugPrint(type); + if (xml.HasTag(attributeName)) + feature.m_metadata.Set(type, xml.GetTagValue(attributeName)); + } + feature.m_bMetadataParsed = true; + + // TODO(mgsergio): Get types count and GeomType from xml. + // Only feature::GEOM_POINT is now supported. + auto constexpr kOnlyOneTypeCount = 1; + feature.m_header = CalculateHeader(kOnlyOneTypeCount, feature::GEOM_POINT, feature.m_params); + feature.m_bHeader2Parsed = true; + + return feature; +} + +editor::XMLFeature FeatureType::ToXML() const +{ + editor::XMLFeature feature; + + feature.SetCenter(GetCenter()); + + ForEachNameRef([&feature](uint8_t const & lang, string const & name) + { + feature.SetName(lang, name); + return true; + }); + + feature.SetHouse(GetHouseNumber()); + + // TODO(mgsergio): + // feature.m_params.ref = + // feature.m_params.layer = + // feature.m_params.rank = + + // for (auto const i : range(feature.GetTypesCount())) + // m_types[i] = + // Does the order matter? If so what order should be? + // TODO(mgsergio): Only features with single type are currently supported. + ParseTypes(); + feature.SetTagValue("amenity", "atm"); // TODO(mgsergio): Replace hardcode with real values. + + for (auto const type : m_metadata.GetPresentTypes()) + { + auto const attributeName = DebugPrint(type); + feature.SetTagValue(attributeName, m_metadata.Get(type)); + } + + return feature; +} + void FeatureBase::ParseTypes() const { if (!m_bTypesParsed) |