mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-27 00:13:38 +00:00
@@ -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;
|
||||
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user