diff --git a/mvt.cpp b/mvt.cpp index 598da825..54302e06 100644 --- a/mvt.cpp +++ b/mvt.cpp @@ -278,13 +278,6 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) { } } - for (size_t i = 0; i < layer.keys.size(); i++) { - layer.key_map.insert(std::pair(layer.keys[i], i)); - } - for (size_t i = 0; i < layer.values.size(); i++) { - layer.value_map.insert(std::pair(layer.values[i], i)); - } - layers.push_back(layer); break; } @@ -593,6 +586,18 @@ std::string mvt_value::toString() const { void mvt_layer::tag(mvt_feature &feature, std::string key, mvt_value value) { size_t ko, vo; + // initialize lazily the first time anyone tags an attribute + // to save the time of doing it in decode, which never actually matters. + // only tile writers actually need this. + if (key_map.size() == 0) { + for (size_t i = 0; i < keys.size(); i++) { + key_map.insert(std::pair(keys[i], i)); + } + for (size_t i = 0; i < values.size(); i++) { + value_map.insert(std::pair(values[i], i)); + } + } + std::unordered_map::iterator ki = key_map.find(key); std::unordered_map::iterator vi = value_map.find(value);