diff --git a/map/framework.cpp b/map/framework.cpp index fb54257ecd..aef02a47ce 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -2959,27 +2959,22 @@ void SetStreet(search::ReverseGeocoder const & coder, DataSource const & dataSou auto const & editor = osm::Editor::Instance(); // Get exact feature's street address (if any) from mwm, // together with all nearby streets. - auto const streets = coder.GetNearbyFeatureStreets(ft); - auto const & streetsPool = streets.first; - auto const & featureStreetIndex = streets.second; + vector streets; + coder.GetNearbyStreets(ft, streets); - string street; - bool const featureIsInEditor = editor.GetEditedFeatureStreet(ft.GetID(), street); - bool const featureHasStreetInMwm = featureStreetIndex < streetsPool.size(); - if (!featureIsInEditor && featureHasStreetInMwm) - street = streetsPool[featureStreetIndex].m_name; + string street = coder.GetFeatureStreetName(ft); - auto localizedStreets = TakeSomeStreetsAndLocalize(streetsPool, dataSource); + auto localizedStreets = TakeSomeStreetsAndLocalize(streets, dataSource); if (!street.empty()) { - auto it = find_if(begin(streetsPool), end(streetsPool), + auto it = find_if(begin(streets), end(streets), [&street](search::ReverseGeocoder::Street const & s) { return s.m_name == street; }); - if (it != end(streetsPool)) + if (it != end(streets)) { osm::LocalizedStreet ls; if (!LocalizeStreet(dataSource, it->m_id, ls)) @@ -3149,9 +3144,7 @@ osm::Editor::SaveResult Framework::SaveEditedMapObject(osm::EditableMapObject em string originalFeatureStreet; if (!isCreatedFeature) { - auto const streets = coder.GetNearbyFeatureStreets(originalFeature); - if (streets.second < streets.first.size()) - originalFeatureStreet = streets.first[streets.second].m_name; + originalFeatureStreet = coder.GetOriginalFeatureStreetName(originalFeature); } else { diff --git a/search/editor_delegate.cpp b/search/editor_delegate.cpp index 6b1012447e..ace89a9ca4 100644 --- a/search/editor_delegate.cpp +++ b/search/editor_delegate.cpp @@ -29,10 +29,7 @@ unique_ptr EditorDelegate::GetOriginalFeature(FeatureID const & fid string EditorDelegate::GetOriginalFeatureStreet(FeatureType & ft) const { search::ReverseGeocoder const coder(m_dataSource); - auto const streets = coder.GetNearbyOriginalFeatureStreets(ft); - if (streets.second < streets.first.size()) - return streets.first[streets.second].m_name; - return {}; + return coder.GetOriginalFeatureStreetName(ft); } void EditorDelegate::ForEachFeatureAtPoint(osm::Editor::FeatureTypeFn && fn, diff --git a/search/reverse_geocoder.cpp b/search/reverse_geocoder.cpp index 5cefc41890..01b1984286 100644 --- a/search/reverse_geocoder.cpp +++ b/search/reverse_geocoder.cpp @@ -52,23 +52,6 @@ void AddStreet(FeatureType & ft, m2::PointD const & center, streets.emplace_back(ft.GetID(), feature::GetMinDistanceMeters(ft, center), name); } - -void GetNearbyStreetsImpl(DataSource const & source, MwmSet::MwmId const & id, - m2::PointD const & center, vector & streets, - FillStreets && fillStreets) -{ - m2::RectD const rect = GetLookupRect(center, ReverseGeocoder::kLookupRadiusM); - MwmSet::MwmHandle mwmHandle = source.GetMwmHandleById(id); - - if (!mwmHandle.IsAlive()) - return; - - auto const addStreet = [¢er, &streets](FeatureType & ft) { AddStreet(ft, center, streets); }; - - fillStreets(move(mwmHandle), rect, addStreet); - - sort(streets.begin(), streets.end(), base::LessBy(&ReverseGeocoder::Street::m_distanceMeters)); -} } // namespace ReverseGeocoder::ReverseGeocoder(DataSource const & dataSource) : m_dataSource(dataSource) {} @@ -88,13 +71,12 @@ void ReverseGeocoder::GetNearbyStreets(search::MwmContext & context, m2::PointD void ReverseGeocoder::GetNearbyStreets(MwmSet::MwmId const & id, m2::PointD const & center, vector & streets) const { - auto const fillStreets = [](MwmSet::MwmHandle && handle, m2::RectD const & rect, - AppendStreet && addStreet) + MwmSet::MwmHandle mwmHandle = m_dataSource.GetMwmHandleById(id); + if (mwmHandle.IsAlive()) { - search::MwmContext(move(handle)).ForEachFeature(rect, addStreet); - }; - - GetNearbyStreetsImpl(m_dataSource, id, center, streets, move(fillStreets)); + search::MwmContext context(move(mwmHandle)); + GetNearbyStreets(context, center, streets); + } } void ReverseGeocoder::GetNearbyStreets(FeatureType & ft, vector & streets) const @@ -103,18 +85,6 @@ void ReverseGeocoder::GetNearbyStreets(FeatureType & ft, vector & street GetNearbyStreets(ft.GetID().m_mwmId, feature::GetCenter(ft), streets); } -void ReverseGeocoder::GetNearbyOriginalStreets(MwmSet::MwmId const & id, m2::PointD const & center, - vector & streets) const -{ - auto const fillStreets = [](MwmSet::MwmHandle && handle, m2::RectD const & rect, - AppendStreet && addStreet) - { - search::MwmContext(move(handle)).ForEachOriginalFeature(rect, addStreet); - }; - - GetNearbyStreetsImpl(m_dataSource, id, center, streets, move(fillStreets)); -} - // static size_t ReverseGeocoder::GetMatchedStreetIndex(strings::UniString const & keyName, vector const & streets) @@ -148,33 +118,20 @@ size_t ReverseGeocoder::GetMatchedStreetIndex(strings::UniString const & keyName return result; } -pair, uint32_t> -ReverseGeocoder::GetNearbyFeatureStreets(FeatureType & ft) const +string ReverseGeocoder::GetFeatureStreetName(FeatureType & ft) const { - pair, uint32_t> result; - - GetNearbyStreets(ft, result.first); - + Address addr; HouseTable table(m_dataSource); - if (!table.Get(ft.GetID(), result.second)) - result.second = numeric_limits::max(); - - return result; + GetNearbyAddress(table, FromFeature(ft, 0.0 /* distMeters */), false /* ignoreEdits */, addr); + return addr.m_street.m_name; } -pair, uint32_t> -ReverseGeocoder::GetNearbyOriginalFeatureStreets(FeatureType & ft) const +string ReverseGeocoder::GetOriginalFeatureStreetName(FeatureType & ft) const { - pair, uint32_t> result; - - ASSERT(ft.GetID().IsValid(), ()); - GetNearbyOriginalStreets(ft.GetID().m_mwmId, feature::GetCenter(ft), result.first); - + Address addr; HouseTable table(m_dataSource); - if (!table.Get(ft.GetID(), result.second)) - result.second = numeric_limits::max(); - - return result; + GetNearbyAddress(table, FromFeature(ft, 0.0 /* distMeters */), true /* ignoreEdits */, addr); + return addr.m_street.m_name; } void ReverseGeocoder::GetNearbyAddress(m2::PointD const & center, Address & addr) const @@ -195,7 +152,8 @@ void ReverseGeocoder::GetNearbyAddress(m2::PointD const & center, double maxDist { // It's quite enough to analize nearest kMaxNumTriesToApproxAddress houses for the exact nearby address. // When we can't guarantee suitable address for the point with distant houses. - if (GetNearbyAddress(table, b, addr) || (++triesCount == kMaxNumTriesToApproxAddress)) + if (GetNearbyAddress(table, b, false /* ignoreEdits */, addr) || + (++triesCount == kMaxNumTriesToApproxAddress)) break; } } @@ -205,14 +163,15 @@ bool ReverseGeocoder::GetExactAddress(FeatureType & ft, Address & addr) const if (ft.GetHouseNumber().empty()) return false; HouseTable table(m_dataSource); - return GetNearbyAddress(table, FromFeature(ft, 0.0 /* distMeters */), addr); + return GetNearbyAddress(table, FromFeature(ft, 0.0 /* distMeters */), false /* ignoreEdits */, + addr); } -bool ReverseGeocoder::GetNearbyAddress(HouseTable & table, Building const & bld, +bool ReverseGeocoder::GetNearbyAddress(HouseTable & table, Building const & bld, bool ignoreEdits, Address & addr) const { string street; - if (osm::Editor::Instance().GetEditedFeatureStreet(bld.m_id, street)) + if (!ignoreEdits && osm::Editor::Instance().GetEditedFeatureStreet(bld.m_id, street)) { addr.m_building = bld; addr.m_street.m_name = street; diff --git a/search/reverse_geocoder.hpp b/search/reverse_geocoder.hpp index f293df6228..c31c308012 100644 --- a/search/reverse_geocoder.hpp +++ b/search/reverse_geocoder.hpp @@ -86,15 +86,12 @@ public: void GetNearbyStreets(MwmSet::MwmId const & id, m2::PointD const & center, std::vector & streets) const; void GetNearbyStreets(FeatureType & ft, std::vector & streets) const; - void GetNearbyOriginalStreets(MwmSet::MwmId const & id, m2::PointD const & center, - std::vector & streets) const; - /// @returns [a lot of] nearby feature's streets and an index of a feature's street. - /// Returns a value greater than vector size when there are no Street the feature belongs to. - /// @note returned vector can contain duplicated street segments. - std::pair, uint32_t> GetNearbyFeatureStreets(FeatureType & ft) const; - /// Same as GetNearbyFeatureStreets but returns streets from MWM only. - std::pair, uint32_t> GetNearbyOriginalFeatureStreets(FeatureType & ft) const; + /// @return feature street name. + /// Returns empty string when there is no street the feature belongs to. + std::string GetFeatureStreetName(FeatureType & ft) const; + /// Same with GetFeatureStreetName but gets street from mwm only (not editor). + std::string GetOriginalFeatureStreetName(FeatureType & ft) const; /// @return The nearest exact address where building has house number and valid street match. void GetNearbyAddress(m2::PointD const & center, Address & addr) const; @@ -120,7 +117,9 @@ private: MwmSet::MwmHandle m_handle; }; - bool GetNearbyAddress(HouseTable & table, Building const & bld, Address & addr) const; + /// Ignores changes from editor if |ignoreEdits| is true. + bool GetNearbyAddress(HouseTable & table, Building const & bld, bool ignoreEdits, + Address & addr) const; /// @return Sorted by distance houses vector with valid house number. void GetNearbyBuildings(m2::PointD const & center, double maxDistanceM,