diff --git a/libs/editor/feature_type_to_osm.cpp b/libs/editor/feature_type_to_osm.cpp index da7037ac0..4f07290e1 100644 --- a/libs/editor/feature_type_to_osm.cpp +++ b/libs/editor/feature_type_to_osm.cpp @@ -6,6 +6,8 @@ #include "indexer/classificator.hpp" #include "platform/platform.hpp" +#include + namespace editor { TypeToOSMTranslator::TypeToOSMTranslator(bool initialize) @@ -49,7 +51,7 @@ void TypeToOSMTranslator::LoadFromStream(std::istream & s) ASSERT(tokens.size() >= 2, ("Invalid type definition:", line)); - LOG(LINFO, ("simple type: ", tokens[0])); + //LOG(LINFO, ("type: ", tokens[0])); uint32_t type = classif().GetTypeByPathSafe(strings::Tokenize(tokens[0], "|")); @@ -74,27 +76,57 @@ void TypeToOSMTranslator::LoadFromStream(std::istream & s) m_storage.insert({type, {osmTag}}); - LOG(LINFO, ("Added type ", type, " with key", osmTag.key, " and value ", osmTag.value)); + LOG(LINFO, ("Simple type: Added type ", type, ":", osmTag.key, "=", osmTag.value)); } else if (tokens.size() > 2) { // OSM tags are listed in the entry - LOG(LINFO, ("token size:", tokens.size(), " | osmTags: ", tokens[1])); + LOG(LINFO, ("Complex type: token size:", tokens.size(), " | osmTags: ", tokens[1])); std::vector osmTagTokens = strings::Tokenize(tokens[1], ","); + ASSERT(!osmTagTokens.empty(), ("No OSM tag tokens found")); + // First entry is the best practice way to tag a feature + std::string_view osmTagList = osmTagTokens[0]; + + // Process OSM tag list (e.g. "[tourism=information][information=office]") + std::vector osmTags; + size_t pos = 0; + + while ((pos = osmTagList.find('[', pos)) != std::string::npos) { + size_t end = osmTagList.find(']', pos); + + ASSERT(end != std::string::npos, ("Bracket not closed in OSM tag: ", line)); + + std::string_view keyValuePair = osmTagList.substr(pos + 1, end - pos - 1); + size_t equalSign = keyValuePair.find('='); + + if (equalSign != std::string::npos) { + OSMTag osmTag; + + osmTag.key = keyValuePair.substr(0, equalSign); + osmTag.value = keyValuePair.substr(equalSign + 1); + + osmTags.push_back(osmTag); + + LOG(LINFO, ("Complex type: Found OSM Tag ", osmTag.key, "=", osmTag.value)); + } + else + LOG(LINFO, ("Complex type: Skipping OSM key value pair:", keyValuePair)); + + pos = end + 1; + } } - if (lineNumber > 80) break; } } -std::vector TypeToOSMTranslator::OsmTagsFromType(uint32_t type) +std::vector TypeToOSMTranslator::OsmTagsFromType(uint32_t type) const { LOG(LINFO, ("Computing OsmTagsFromType for Type: ", type, "/ " , classif().GetReadableObjectName(type))); @@ -109,7 +141,7 @@ std::vector TypeToOSMTranslator::OsmTagsFromType(uint32_t type) return it->second; } -TypeToOSMTranslator & GetOSMTranslator() +TypeToOSMTranslator const & GetOSMTranslator() { static TypeToOSMTranslator translator; return translator; diff --git a/libs/editor/feature_type_to_osm.hpp b/libs/editor/feature_type_to_osm.hpp index e3a490f7a..275a37463 100644 --- a/libs/editor/feature_type_to_osm.hpp +++ b/libs/editor/feature_type_to_osm.hpp @@ -20,12 +20,12 @@ public: void LoadConfigFile(); void LoadFromStream(std::istream & s); - std::vector OsmTagsFromType(uint32_t type); + std::vector OsmTagsFromType(uint32_t type) const; private: std::map> m_storage; }; -TypeToOSMTranslator & GetOSMTranslator(); +TypeToOSMTranslator const & GetOSMTranslator(); } // namespace osm \ No newline at end of file diff --git a/libs/editor/xml_feature.cpp b/libs/editor/xml_feature.cpp index cea9d6c21..705430372 100644 --- a/libs/editor/xml_feature.cpp +++ b/libs/editor/xml_feature.cpp @@ -642,7 +642,7 @@ void XMLFeature::RemoveTag(string_view key) void XMLFeature::SetOSMTagsForType(uint32_t type) { - TypeToOSMTranslator translator = GetOSMTranslator(); + TypeToOSMTranslator const & translator = GetOSMTranslator(); auto result = translator.OsmTagsFromType(type);