diff --git a/generator/feature_merger.cpp b/generator/feature_merger.cpp index beefb7cf2c..0fe6a7d375 100644 --- a/generator/feature_merger.cpp +++ b/generator/feature_merger.cpp @@ -245,16 +245,17 @@ void FeatureMergeProcessor::DoMerge(FeatureEmitterIFace & emitter) emitter(m_last); } - -uint32_t FeatureTypesProcessor::GetType(char const * arr[2]) +uint32_t FeatureTypesProcessor::GetType(char const * arr[], size_t n) { - uint32_t const type = classif().GetTypeByPath(vector(arr, arr + 2)); + uint32_t const type = classif().GetTypeByPath(vector(arr, arr + n)); CHECK_NOT_EQUAL(type, ftype::GetEmptyValue(), ()); return type; } void FeatureTypesProcessor::CorrectType(uint32_t & t) const { + if (m_dontNormilize.count(t) > 0) return; + // 1. get normalized type: // highway-motorway-bridge => highway-motorway uint32_t normal = ftype::GetEmptyValue(); @@ -273,7 +274,12 @@ void FeatureTypesProcessor::CorrectType(uint32_t & t) const void FeatureTypesProcessor::SetMappingTypes(char const * arr1[2], char const * arr2[2]) { - m_mapping[GetType(arr1)] = GetType(arr2); + m_mapping[GetType(arr1, 2)] = GetType(arr2, 2); +} + +void FeatureTypesProcessor::SetDontNormilizeType(char const * arr[3]) +{ + m_dontNormilize.insert(GetType(arr, 3)); } MergedFeatureBuilder1 * FeatureTypesProcessor::operator() (FeatureBuilder1 const & fb) diff --git a/generator/feature_merger.hpp b/generator/feature_merger.hpp index 7b809ca2a6..69665d3512 100644 --- a/generator/feature_merger.hpp +++ b/generator/feature_merger.hpp @@ -88,9 +88,10 @@ public: /// Feature types corrector. class FeatureTypesProcessor { + set m_dontNormilize; map m_mapping; - static uint32_t GetType(char const * arr[2]); + static uint32_t GetType(char const * arr[], size_t n); void CorrectType(uint32_t & t) const; @@ -103,8 +104,11 @@ class FeatureTypesProcessor }; public: - /// For example: highway-motorway_link => highway-motorway + /// For example: highway-motorway_link => highway-motorway. void SetMappingTypes(char const * arr1[2], char const * arr2[2]); + /// Leave original types, for example: boundary-administrative-2. + void SetDontNormilizeType(char const * arr[3]); + MergedFeatureBuilder1 * operator() (FeatureBuilder1 const & fb); }; diff --git a/generator/world_map_generator.hpp b/generator/world_map_generator.hpp index 275e3257e7..0a39d50e23 100644 --- a/generator/world_map_generator.hpp +++ b/generator/world_map_generator.hpp @@ -81,6 +81,13 @@ public: m_typesCorrector.SetMappingTypes(arr1, arr2); } + + char const * arrDontNormilize[][3] = { + { "boundary", "administrative", "2" } + }; + + for (size_t i = 0; i < ARRAY_SIZE(arrDontNormilize); ++i) + m_typesCorrector.SetDontNormilizeType(arrDontNormilize[i]); } ~WorldMapGenerator()