diff options
author | Ilya Zverev <zverik@textual.ru> | 2016-07-15 14:24:22 +0300 |
---|---|---|
committer | Ilya Zverev <zverik@textual.ru> | 2016-07-19 19:26:12 +0300 |
commit | 2999143e9ceede334c6db5a02e04b150a30fbffe (patch) | |
tree | 81151f36cdedebb71c8a88e00bea18eb6c19b2aa /generator | |
parent | 9841d1c865be3f3b477d4c06fad408a046273351 (diff) |
[olympics] Mix objects with olympics tag
Diffstat (limited to 'generator')
-rw-r--r-- | generator/osm_element.cpp | 7 | ||||
-rw-r--r-- | generator/osm_element.hpp | 2 | ||||
-rw-r--r-- | generator/osm_source.cpp | 2 | ||||
-rw-r--r-- | generator/tag_admixer.hpp | 52 |
4 files changed, 63 insertions, 0 deletions
diff --git a/generator/osm_element.cpp b/generator/osm_element.cpp index 5e54137283..272bf4cc4b 100644 --- a/generator/osm_element.cpp +++ b/generator/osm_element.cpp @@ -138,3 +138,10 @@ string DebugPrint(OsmElement const & e) { return e.ToString(); } + +string DebugPrint(OsmElement::Tag const & tag) +{ + stringstream ss; + ss << tag.key << '=' << tag.value; + return ss.str(); +} diff --git a/generator/osm_element.hpp b/generator/osm_element.hpp index 6a89905b9b..cca5e99717 100644 --- a/generator/osm_element.hpp +++ b/generator/osm_element.hpp @@ -157,3 +157,5 @@ struct OsmElement }; string DebugPrint(OsmElement const & e); +string DebugPrint(OsmElement::EntityType e); +string DebugPrint(OsmElement::Tag const & tag); diff --git a/generator/osm_source.cpp b/generator/osm_source.cpp index 236303b92f..b3bfdf13ea 100644 --- a/generator/osm_source.cpp +++ b/generator/osm_source.cpp @@ -514,6 +514,7 @@ bool GenerateFeaturesImpl(feature::GenerateInfo & info) TagAdmixer tagAdmixer(info.GetIntermediateFileName("ways", ".csv"), info.GetIntermediateFileName("towns", ".csv")); TagReplacer tagReplacer(GetPlatform().ResourcesDir() + REPLACED_TAGS_FILE); + OsmTagMixer osmTagMixer(GetPlatform().ResourcesDir() + MIXED_TAGS_FILE); // If info.m_bookingDatafileName is empty then no data will be loaded. generator::BookingDataset bookingDataset(info.m_bookingDatafileName, @@ -526,6 +527,7 @@ bool GenerateFeaturesImpl(feature::GenerateInfo & info) { tagReplacer(e); tagAdmixer(e); + osmTagMixer(e); if (bookingDataset.BookingFilter(*e)) { diff --git a/generator/tag_admixer.hpp b/generator/tag_admixer.hpp index 4139c01cd2..0aa14a6353 100644 --- a/generator/tag_admixer.hpp +++ b/generator/tag_admixer.hpp @@ -180,3 +180,55 @@ public: } } }; + +class OsmTagMixer +{ + map<pair<OsmElement::EntityType, uint64_t>, vector<OsmElement::Tag>> m_elements; + +public: + OsmTagMixer(string const & filePath) + { + ifstream stream(filePath); + vector<string> values; + vector<OsmElement::Tag> tags; + string line; + while (std::getline(stream, line)) + { + if (line.empty() || line.front() == '#') + continue; + + strings::ParseCSVRow(line, ',', values); + if (values.size() < 3) + continue; + + OsmElement::EntityType entityType = OsmElement::StringToEntityType(values[0]); + uint64_t id; + if (entityType == OsmElement::EntityType::Unknown || !strings::to_uint64(values[1], id)) + continue; + + for (size_t i = 2; i < values.size(); ++i) + { + auto p = values[i].find('='); + if (p != string::npos) + tags.push_back(OsmElement::Tag(values[i].substr(0, p), values[i].substr(p + 1))); + } + + if (!tags.empty()) + { + pair<OsmElement::EntityType, uint64_t> elementPair = {entityType, id}; + m_elements[elementPair].swap(tags); + } + } + } + + void operator()(OsmElement * p) + { + pair<OsmElement::EntityType, uint64_t> elementId = {p->type, p->id}; + auto elements = m_elements.find(elementId); + if (elements != m_elements.end()) + { + for (OsmElement::Tag tag : elements->second) + p->AddTag(tag.key, tag.value); + } + } +}; |