Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/search
diff options
context:
space:
mode:
authortatiana-yan <tatiana.kondakova@gmail.com>2019-03-13 13:12:20 +0300
committermpimenov <mpimenov@users.noreply.github.com>2019-03-15 13:06:50 +0300
commitb5828d64d61f22db6278b23cea6b9c229968f97e (patch)
treec958c3925b3f8f4ccf1f5457e7b34723232a2689 /search
parentebc8469783327487b12dc9fcc65b2228d28a4397 (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.cpp60
-rw-r--r--search/reverse_geocoder.hpp14
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
{