parse complex types

Signed-off-by: map-per <map-per@gmx.de>
This commit is contained in:
map-per
2025-12-11 17:56:32 +01:00
parent df2cd7e85c
commit 4095531f37
3 changed files with 41 additions and 9 deletions

View File

@@ -6,6 +6,8 @@
#include "indexer/classificator.hpp"
#include "platform/platform.hpp"
#include <string>
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<std::string_view> 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<OSMTag> 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<OSMTag> TypeToOSMTranslator::OsmTagsFromType(uint32_t type)
std::vector<OSMTag> TypeToOSMTranslator::OsmTagsFromType(uint32_t type) const
{
LOG(LINFO, ("Computing OsmTagsFromType for Type: ", type, "/ " , classif().GetReadableObjectName(type)));
@@ -109,7 +141,7 @@ std::vector<OSMTag> TypeToOSMTranslator::OsmTagsFromType(uint32_t type)
return it->second;
}
TypeToOSMTranslator & GetOSMTranslator()
TypeToOSMTranslator const & GetOSMTranslator()
{
static TypeToOSMTranslator translator;
return translator;

View File

@@ -20,12 +20,12 @@ public:
void LoadConfigFile();
void LoadFromStream(std::istream & s);
std::vector<OSMTag> OsmTagsFromType(uint32_t type);
std::vector<OSMTag> OsmTagsFromType(uint32_t type) const;
private:
std::map<uint32_t, std::vector<OSMTag>> m_storage;
};
TypeToOSMTranslator & GetOSMTranslator();
TypeToOSMTranslator const & GetOSMTranslator();
} // namespace osm

View File

@@ -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);