From 1f9d3d7f129e0ed8708a013c97513fcaeb93b5bd Mon Sep 17 00:00:00 2001 From: vng Date: Fri, 14 Feb 2014 19:56:52 +0300 Subject: [PATCH] [search] Fixed address data generation - take objects with the "building" type only. --- generator/generator_tool/generator_tool.pro | 4 +-- generator/osm_element.hpp | 12 ++++++-- search/ftypes_matcher.cpp | 31 +++++++++++++++++--- search/ftypes_matcher.hpp | 9 ++++++ search/house_detector.cpp | 27 ++--------------- search/search_tests/house_detector_tests.cpp | 2 +- 6 files changed, 51 insertions(+), 34 deletions(-) diff --git a/generator/generator_tool/generator_tool.pro b/generator/generator_tool/generator_tool.pro index 10bb24575c..a87f44a06f 100644 --- a/generator/generator_tool/generator_tool.pro +++ b/generator/generator_tool/generator_tool.pro @@ -1,8 +1,8 @@ # Generator binary ROOT_DIR = ../.. -DEPENDENCIES = generator storage indexer platform geometry coding base gflags expat sgitess \ - jansson protobuf tomcrypt +DEPENDENCIES = generator storage search indexer platform geometry coding base \ + gflags expat sgitess jansson protobuf tomcrypt include($$ROOT_DIR/common.pri) diff --git a/generator/osm_element.hpp b/generator/osm_element.hpp index 0a4f5fb219..922e9f5465 100644 --- a/generator/osm_element.hpp +++ b/generator/osm_element.hpp @@ -5,6 +5,8 @@ #include "feature_builder.hpp" #include "ways_merger.hpp" +#include "../search/ftypes_matcher.hpp" + #include "../indexer/feature_visibility.hpp" #include "../indexer/classificator.hpp" @@ -345,7 +347,13 @@ class SecondPassParserUsual : public SecondPassParserBase typedef typename base_type::feature_builder_t feature_t; uint32_t m_coastType; + scoped_ptr m_addrWriter; + bool NeedWriteAddress(FeatureParams const & params) const + { + static ftypes::IsBuildingChecker checker; + return m_addrWriter && checker(params.m_Types); + } protected: virtual void EmitElement(XMLElement * p) @@ -413,7 +421,7 @@ protected: if (f.PreSerialize()) { string addr; - if (m_addrWriter && f.FormatFullAddress(addr)) + if (NeedWriteAddress(params) && f.FormatFullAddress(addr)) m_addrWriter->Write(addr.c_str(), addr.size()); base_type::m_emitter(f); @@ -485,7 +493,7 @@ protected: if (ft.PreSerialize()) { string addr; - if (m_addrWriter && ft.FormatFullAddress(addr)) + if (NeedWriteAddress(fValue) && ft.FormatFullAddress(addr)) m_addrWriter->Write(addr.c_str(), addr.size()); // add osm id for debugging diff --git a/search/ftypes_matcher.cpp b/search/ftypes_matcher.cpp index 367f5b0250..28c8429245 100644 --- a/search/ftypes_matcher.cpp +++ b/search/ftypes_matcher.cpp @@ -8,14 +8,17 @@ namespace ftypes { +bool BaseChecker::IsMatched(uint32_t t) const +{ + ftype::TruncValue(t, 2); + return (find(m_types.begin(), m_types.end(), t) != m_types.end()); +} + bool BaseChecker::operator() (feature::TypesHolder const & types) const { for (size_t i = 0; i < types.Size(); ++i) { - uint32_t t = types[i]; - ftype::TruncValue(t, 2); - - if (find(m_types.begin(), m_types.end(), t) != m_types.end()) + if (IsMatched(types[i])) return true; } return false; @@ -26,6 +29,16 @@ bool BaseChecker::operator() (FeatureType const & ft) const return this->operator() (feature::TypesHolder(ft)); } +bool BaseChecker::operator() (vector const & types) const +{ + for (size_t i = 0; i < types.size(); ++i) + { + if (IsMatched(types[i])) + return true; + } + return false; +} + IsStreetChecker::IsStreetChecker() { Classificator const & c = classif(); @@ -44,4 +57,14 @@ IsStreetChecker::IsStreetChecker() m_types.push_back(c.GetTypeByPath(vector(arr[i], arr[i] + 2))); } +IsBuildingChecker::IsBuildingChecker() +{ + Classificator const & c = classif(); + + char const * arr0[] = { "building" }; + m_types.push_back(c.GetTypeByPath(vector(arr0, arr0 + 1))); + char const * arr1[] = { "building", "address" }; + m_types.push_back(c.GetTypeByPath(vector(arr1, arr1 + 2))); +} + } diff --git a/search/ftypes_matcher.hpp b/search/ftypes_matcher.hpp index 257ad4dec5..b15446fb38 100644 --- a/search/ftypes_matcher.hpp +++ b/search/ftypes_matcher.hpp @@ -13,12 +13,15 @@ namespace ftypes class BaseChecker { + bool IsMatched(uint32_t t) const; + protected: vector m_types; public: bool operator() (feature::TypesHolder const & types) const; bool operator() (FeatureType const & ft) const; + bool operator() (vector const & types) const; }; class IsStreetChecker : public BaseChecker @@ -27,4 +30,10 @@ public: IsStreetChecker(); }; +class IsBuildingChecker : public BaseChecker +{ +public: + IsBuildingChecker(); +}; + } diff --git a/search/house_detector.cpp b/search/house_detector.cpp index 0384dddc65..2735a0492f 100644 --- a/search/house_detector.cpp +++ b/search/house_detector.cpp @@ -490,29 +490,6 @@ int HouseDetector::MergeStreets() namespace { -class HouseChecker -{ - uint32_t m_types[2]; -public: - HouseChecker() - { - Classificator const & c = classif(); - - char const * arr0[] = { "building" }; - m_types[0] = c.GetTypeByPath(vector(arr0, arr0 + 1)); - char const * arr1[] = { "building", "address" }; - m_types[1] = c.GetTypeByPath(vector(arr1, arr1 + 2)); - } - - bool IsHouse(feature::TypesHolder const & types) - { - for (size_t i = 0; i < ARRAY_SIZE(m_types); ++i) - if (types.Has(m_types[i])) - return true; - return false; - } -}; - class ProjectionCalcToStreet { vector const & m_points; @@ -721,10 +698,10 @@ HouseProjection const * MergedStreet::GetHousePivot(bool & odd, bool & sign) con template void HouseDetector::ReadHouse(FeatureType const & f, Street * st, ProjectionCalcT & calc) { - static HouseChecker checker; + static ftypes::IsBuildingChecker checker; string const houseNumber = f.GetHouseNumber(); - if (checker.IsHouse(feature::TypesHolder(f)) && feature::IsHouseNumber(houseNumber)) + if (checker(f) && feature::IsHouseNumber(houseNumber)) { map::iterator const it = m_id2house.find(f.GetID()); diff --git a/search/search_tests/house_detector_tests.cpp b/search/search_tests/house_detector_tests.cpp index 7e0e2bd1fc..c9e97467c8 100644 --- a/search/search_tests/house_detector_tests.cpp +++ b/search/search_tests/house_detector_tests.cpp @@ -391,7 +391,7 @@ UNIT_TEST(HS_MWMSearch) p.x = MercatorBounds::XToLon(p.x); p.y = MercatorBounds::YToLat(p.y); - double const eps = 1.0E-4; + double const eps = 3.0E-4; if (fabs(p.x - a.m_lon) < eps && fabs(p.y - a.m_lat) < eps) { ++matched;