diff --git a/search/features_layer_matcher.cpp b/search/features_layer_matcher.cpp index 95fa905740..e310deaad8 100644 --- a/search/features_layer_matcher.cpp +++ b/search/features_layer_matcher.cpp @@ -112,11 +112,19 @@ uint32_t FeaturesLayerMatcher::GetMatchingStreetImpl(uint32_t houseId, FeatureTy if (!houseFeature.GetID().IsValid() && !GetByIndex(houseId, houseFeature)) return kInvalidId; - // Get nearby streets and calculate the resulting index. - auto const & streets = GetNearbyStreets(houseId, houseFeature); uint32_t & result = entry.first; result = kInvalidId; + FeatureID streetId; + if (!edited && m_reverseGeocoder.GetStreetByHouse(houseFeature.GetID(), streetId)) + { + result = streetId.m_index; + return result; + } + + // Get nearby streets and calculate the resulting index. + auto const & streets = GetNearbyStreets(houseId, houseFeature); + if (edited) { auto const ret = find_if(streets.begin(), streets.end(), [&streetName](TStreet const & st) @@ -124,21 +132,15 @@ uint32_t FeaturesLayerMatcher::GetMatchingStreetImpl(uint32_t houseId, FeatureTy return st.m_name == streetName; }); if (ret != streets.end()) + { result = ret->m_id.m_index; - } - else - { - uint32_t index; - if (m_context->GetStreetIndex(houseId, index) && index < streets.size()) - result = streets[index].m_id.m_index; + return result; + } } // If there is no saved street for feature, assume that it's a nearest street if it's too close. - if (result == kInvalidId && !streets.empty() && - streets[0].m_distanceMeters < kMaxApproxStreetDistanceM) - { + if (!streets.empty() && streets[0].m_distanceMeters < kMaxApproxStreetDistanceM) result = streets[0].m_id.m_index; - } return result; } diff --git a/search/reverse_geocoder.cpp b/search/reverse_geocoder.cpp index 01b1984286..e35118d754 100644 --- a/search/reverse_geocoder.cpp +++ b/search/reverse_geocoder.cpp @@ -134,6 +134,23 @@ string ReverseGeocoder::GetOriginalFeatureStreetName(FeatureType & ft) const return addr.m_street.m_name; } +bool ReverseGeocoder::GetStreetByHouse(FeatureID const & houseId, FeatureID & streetId) const +{ + Address addr; + HouseTable table(m_dataSource); + Building building; + m_dataSource.ReadFeature( + [&](FeatureType & ft) { building = FromFeature(ft, 0.0 /* distMeters */); }, houseId); + + if (GetNearbyAddress(table, building, false /* ignoreEdits */, addr)) + { + streetId = addr.m_street.m_id; + return true; + } + + return false; +} + void ReverseGeocoder::GetNearbyAddress(m2::PointD const & center, Address & addr) const { return GetNearbyAddress(center, kLookupRadiusM, addr); diff --git a/search/reverse_geocoder.hpp b/search/reverse_geocoder.hpp index c31c308012..d9e6132aa1 100644 --- a/search/reverse_geocoder.hpp +++ b/search/reverse_geocoder.hpp @@ -92,6 +92,9 @@ public: std::string GetFeatureStreetName(FeatureType & ft) const; /// Same with GetFeatureStreetName but gets street from mwm only (not editor). std::string GetOriginalFeatureStreetName(FeatureType & ft) const; + /// For |houseId| with street information sets |streetId| to FeatureID of street corresponding to + /// |houseId| and returns true. Returs false otherwise. + bool GetStreetByHouse(FeatureID const & houseId, FeatureID & streetId) const; /// @return The nearest exact address where building has house number and valid street match. void GetNearbyAddress(m2::PointD const & center, Address & addr) const;