diff options
author | vng <viktor.govako@gmail.com> | 2013-12-06 21:49:08 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:09:14 +0300 |
commit | e06897fa1727a61562c2428dadbaca242af39435 (patch) | |
tree | 9153ef46323cb71fdcdcca3304742ffe29525f90 /generator | |
parent | 68a506fd5df262c7150b0d13fa30e33f3674b13a (diff) |
[feature] Store house number in "house" field for point features (entrance, building-address).
Diffstat (limited to 'generator')
-rw-r--r-- | generator/feature_builder.cpp | 72 | ||||
-rw-r--r-- | generator/feature_builder.hpp | 13 | ||||
-rw-r--r-- | generator/feature_generator.cpp | 7 | ||||
-rw-r--r-- | generator/generator_tests/feature_builder_test.cpp | 2 |
4 files changed, 44 insertions, 50 deletions
diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp index 404fc25eef..782f8cbb67 100644 --- a/generator/feature_builder.cpp +++ b/generator/feature_builder.cpp @@ -95,24 +95,13 @@ void FeatureBuilder1::AddPolygon(vector<m2::PointD> & poly) m_Polygons.back().swap(poly); } -void FeatureBuilder1::DoCorrectForType(EGeomType type) -{ - if (m_Params.GetGeomType() == type && - !IsDrawableLike(m_Params.m_Types, static_cast<FeatureGeoType>(type))) - { - m_Params.RemoveGeomType(type); - } -} - -bool FeatureBuilder1::DoCorrect() +bool FeatureBuilder1::RemoveInvalidTypes() { if (!m_Params.FinishAddingTypes()) return false; - DoCorrectForType(GEOM_AREA); - DoCorrectForType(GEOM_LINE); - - return (m_Params.GetGeomType() != GEOM_UNDEFINED); + return feature::RemoveNoDrawableTypes(m_Params.m_Types, + static_cast<FeatureGeoType>(m_Params.GetGeomType())); } FeatureBase FeatureBuilder1::GetFeatureBase() const @@ -167,27 +156,27 @@ namespace bool FeatureBuilder1::PreSerialize() { - if (!m_Params.IsValid()) return false; - static const int8_t defaultCode = StringUtf8Multilang::GetLangIndex("default"); - static const int8_t intCode = StringUtf8Multilang::GetLangIndex("int_name"); + if (!m_Params.IsValid()) + return false; + + /// @todo Do not use flats info. Maybe in future. + m_Params.flats.clear(); switch (m_Params.GetGeomType()) { case GEOM_POINT: - // If we don't have name and have house number, than replace them. - if (m_Params.name.IsEmpty() && !m_Params.house.IsEmpty()) - m_Params.name.AddString(defaultCode, m_Params.house.Get()); - - // We need refs for motorway's junctions. Try to update name always, not only for junctions. - if (m_Params.name.IsEmpty() && (!m_Params.ref.empty() || m_Params.flats.empty())) + // Store house number like HEADER_GEOM_POINT_EX. + if (!m_Params.house.IsEmpty()) { - m_Params.name.AddString(defaultCode, m_Params.ref); - m_Params.name.AddString(intCode, m_Params.flats); + m_Params.SetGeomTypePointEx(); + m_Params.rank = 0; } - m_Params.house.Clear(); + // Store ref's in name field (used in "highway-motorway_junction"). + if (m_Params.name.IsEmpty() && !m_Params.ref.empty()) + m_Params.name.AddString(0, m_Params.ref); + m_Params.ref.clear(); - m_Params.flats.clear(); break; case GEOM_LINE: @@ -196,7 +185,7 @@ bool FeatureBuilder1::PreSerialize() // We need refs for road's numbers. if (!checkHighway.IsEqualV(m_Params.m_Types)) - m_Params.ref = string(); + m_Params.ref.clear(); m_Params.rank = 0; m_Params.house.Clear(); @@ -269,7 +258,6 @@ bool FeatureBuilder1::CheckValid() const CHECK(m_Params.CheckValid(), (*this)); EGeomType const type = m_Params.GetGeomType(); - CHECK ( type != GEOM_UNDEFINED, (*this) ); points_t const & poly = GetGeometry(); @@ -429,11 +417,17 @@ bool FeatureBuilder2::IsDrawableInRange(int lowS, int highS) const bool FeatureBuilder2::PreSerialize(buffers_holder_t const & data) { // make flags actual before header serialization - if (data.m_ptsMask == 0 && data.m_innerPts.empty()) - m_Params.RemoveGeomType(GEOM_LINE); - - if (data.m_trgMask == 0 && data.m_innerTrg.empty()) - m_Params.RemoveGeomType(GEOM_AREA); + EGeomType const geoType = m_Params.GetGeomType(); + if (geoType == GEOM_LINE) + { + if (data.m_ptsMask == 0 && data.m_innerPts.empty()) + return false; + } + else if (geoType == GEOM_AREA) + { + if (data.m_trgMask == 0 && data.m_innerTrg.empty()) + return false; + } // we don't need empty features without geometry return base_type::PreSerialize(); @@ -495,14 +489,13 @@ void FeatureBuilder2::Serialize(buffers_holder_t & data, serial::CodingParams co uint8_t const h = m_Params.GetTypeMask(); - if (h & HEADER_GEOM_LINE) + if (h == HEADER_GEOM_LINE) { bitSink.Write(ptsCount, 4); if (ptsCount == 0) bitSink.Write(data.m_ptsMask, 4); } - - if (h & HEADER_GEOM_AREA) + else if (h == HEADER_GEOM_AREA) { bitSink.Write(trgCount, 4); if (trgCount == 0) @@ -511,7 +504,7 @@ void FeatureBuilder2::Serialize(buffers_holder_t & data, serial::CodingParams co bitSink.Finish(); - if (h & HEADER_GEOM_LINE) + if (h == HEADER_GEOM_LINE) { if (ptsCount > 0) { @@ -540,8 +533,7 @@ void FeatureBuilder2::Serialize(buffers_holder_t & data, serial::CodingParams co serial::WriteVarUintArray(data.m_ptsOffset, sink); } } - - if (h & HEADER_GEOM_AREA) + else if (h == HEADER_GEOM_AREA) { if (trgCount > 0) serial::SaveInnerTriangles(data.m_innerTrg, params, sink); diff --git a/generator/feature_builder.hpp b/generator/feature_builder.hpp index f77c4b6f79..f7ad3160ff 100644 --- a/generator/feature_builder.hpp +++ b/generator/feature_builder.hpp @@ -45,11 +45,10 @@ public: inline bool PopExactType(uint32_t type) { return m_Params.PopExactType(type); } inline void SetType(uint32_t type) { m_Params.SetType(type); } - /// Check for feature visibility according to it's types. - /// If feature is invisible, it's not correct. - /// This fuction is called after it's classificator types manipulating. - void DoCorrectForType(feature::EGeomType type); - bool DoCorrect(); + /// Check classificator types for their compatibility with feature geometry type. + /// Need to call when using any classificator types manipulating. + /// @return false If no any valid types. + bool RemoveInvalidTypes(); /// Clear name if it's not visible in scale range [minS, maxS]. void RemoveNameIfInvisible(int minS = 0, int maxS = 1000); @@ -214,8 +213,8 @@ public: buffers_holder_t() : m_ptsMask(0), m_trgMask(0), m_ptsSimpMask(0) {} }; - bool IsLine() const { return (m_Params.GetTypeMask() & feature::HEADER_GEOM_LINE) != 0; } - bool IsArea() const { return (m_Params.GetTypeMask() & feature::HEADER_GEOM_AREA) != 0; } + bool IsLine() const { return (m_Params.GetTypeMask() == feature::HEADER_GEOM_LINE); } + bool IsArea() const { return (m_Params.GetTypeMask() == feature::HEADER_GEOM_AREA); } bool IsDrawableInRange(int lowS, int highS) const; points_t const & GetOuterPoly() const { return GetGeometry(); } diff --git a/generator/feature_generator.cpp b/generator/feature_generator.cpp index 8813c848e1..d40ebfe78f 100644 --- a/generator/feature_generator.cpp +++ b/generator/feature_generator.cpp @@ -359,10 +359,13 @@ public: fb.PopExactType(Type(NATURAL_LAND)); fb.PopExactType(coastType); } - else if (fb.HasType(Type(PLACE_ISLAND)) || fb.HasType(Type(PLACE_ISLET))) + else if ((fb.HasType(Type(PLACE_ISLAND)) || fb.HasType(Type(PLACE_ISLET))) && + fb.GetGeomType() == feature::GEOM_AREA) + { fb.AddType(Type(NATURAL_LAND)); + } - if (fb.DoCorrect()) + if (fb.RemoveInvalidTypes()) { if (m_world) (*m_world)(fb); diff --git a/generator/generator_tests/feature_builder_test.cpp b/generator/generator_tests/feature_builder_test.cpp index 56215c290d..643293233a 100644 --- a/generator/generator_tests/feature_builder_test.cpp +++ b/generator/generator_tests/feature_builder_test.cpp @@ -53,7 +53,7 @@ UNIT_TEST(FBuilder_ManyTypes) fb1.SetParams(params); fb1.SetCenter(m2::PointD(0, 0)); - TEST(fb1.DoCorrect(), ()); + TEST(fb1.RemoveInvalidTypes(), ()); TEST(fb1.CheckValid(), ()); FeatureBuilder1::buffer_t buffer; |