diff options
author | tatiana-yan <tatiana.kondakova@gmail.com> | 2019-03-13 13:12:20 +0300 |
---|---|---|
committer | mpimenov <mpimenov@users.noreply.github.com> | 2019-03-15 13:06:50 +0300 |
commit | b5828d64d61f22db6278b23cea6b9c229968f97e (patch) | |
tree | c958c3925b3f8f4ccf1f5457e7b34723232a2689 /search | |
parent | ebc8469783327487b12dc9fcc65b2228d28a4397 (diff) |
[search] Fix streets matching for generator: try all names, not only FeatureType readable name.
Diffstat (limited to 'search')
-rw-r--r-- | search/reverse_geocoder.cpp | 60 | ||||
-rw-r--r-- | search/reverse_geocoder.hpp | 14 |
2 files changed, 49 insertions, 25 deletions
diff --git a/search/reverse_geocoder.cpp b/search/reverse_geocoder.cpp index 2d9447f8be..88db2ef07e 100644 --- a/search/reverse_geocoder.cpp +++ b/search/reverse_geocoder.cpp @@ -55,7 +55,7 @@ void AddStreet(FeatureType & ft, m2::PointD const & center, bool includeSquaresA if (name.empty()) return; - streets.emplace_back(ft.GetID(), feature::GetMinDistanceMeters(ft, center), name); + streets.emplace_back(ft.GetID(), feature::GetMinDistanceMeters(ft, center), name, ft.GetNames()); } // Following methods join only non-empty arguments in order with @@ -91,23 +91,36 @@ boost::optional<uint32_t> ReverseGeocoder::GetMatchedStreetIndex(std::string con auto const key = GetStreetNameAsKey(keyName, ignoreStreetSynonyms); for (auto const & street : streets) { - strings::UniString const actual = GetStreetNameAsKey(street.m_name, ignoreStreetSynonyms); - - size_t const editDistance = - strings::EditDistance(key.begin(), key.end(), actual.begin(), actual.end()); - - if (editDistance == 0) - return street.m_id.m_index; - - if (actual.empty()) - continue; - - size_t const percent = editDistance * 100 / actual.size(); - if (percent < minPercent) - { - result = street.m_id.m_index; - minPercent = percent; - } + bool fullMatchFound = false; + street.m_multilangName.ForEach([&](int8_t /* langCode */, string const & name) { + if (fullMatchFound) + return; + + strings::UniString const actual = GetStreetNameAsKey(name, ignoreStreetSynonyms); + + size_t const editDistance = + strings::EditDistance(key.begin(), key.end(), actual.begin(), actual.end()); + + if (editDistance == 0) + { + result = street.m_id.m_index; + fullMatchFound = true; + return; + } + + if (actual.empty()) + return; + + size_t const percent = editDistance * 100 / actual.size(); + if (percent < minPercent) + { + result = street.m_id.m_index; + minPercent = percent; + } + }); + + if (fullMatchFound) + return result; } if (minPercent <= kSimilarityThresholdPercent) @@ -264,17 +277,16 @@ bool ReverseGeocoder::GetNearbyAddress(HouseTable & table, Building const & bld, case HouseToStreetTable::StreetIdType::FeatureId: { FeatureID streetFeature(bld.m_id.m_mwmId, streetId); - string streetName; - double distance; m_dataSource.ReadFeature( - [&](FeatureType & ft) { + [&bld, &addr](FeatureType & ft) { + string streetName; ft.GetReadableName(streetName); - distance = feature::GetMinDistanceMeters(ft, bld.m_center); + double distance = feature::GetMinDistanceMeters(ft, bld.m_center); + addr.m_street = Street(ft.GetID(), distance, streetName, ft.GetNames()); }, streetFeature); - CHECK(!streetName.empty(), ()); + CHECK(!addr.m_street.m_name.empty(), ()); addr.m_building = bld; - addr.m_street = Street(streetFeature, distance, streetName); return true; } case HouseToStreetTable::StreetIdType::None: diff --git a/search/reverse_geocoder.hpp b/search/reverse_geocoder.hpp index 22720c58a1..8f9d3001b1 100644 --- a/search/reverse_geocoder.hpp +++ b/search/reverse_geocoder.hpp @@ -4,6 +4,8 @@ #include "indexer/feature_decl.hpp" +#include "coding/string_utf8_multilang.hpp" + #include "base/string_utils.hpp" #include <cstdint> @@ -48,7 +50,17 @@ public: explicit ReverseGeocoder(DataSource const & dataSource); - using Street = Object; + struct Street : public Object + { + StringUtf8Multilang m_multilangName; + + Street() = default; + Street(FeatureID const & id, double dist, std::string const & name, + StringUtf8Multilang const & multilangName) + : Object(id, dist, name), m_multilangName(multilangName) + { + } + }; struct Building : public Object { |