forked from organicmaps/organicmaps
[search] Filter street predictions by distance from viewport center/user position/city center.
This commit is contained in:
parent
18dcec0e72
commit
7fb3c6a61e
7 changed files with 21 additions and 2 deletions
|
@ -1168,8 +1168,16 @@ void Geocoder::CreateStreetsLayerAndMatchLowerLayers(BaseContext & ctx,
|
|||
|
||||
vector<uint32_t> sortedFeatures;
|
||||
sortedFeatures.reserve(base::checked_cast<size_t>(prediction.m_features.PopCount()));
|
||||
prediction.m_features.ForEach([&sortedFeatures](uint64_t bit) {
|
||||
sortedFeatures.push_back(base::asserted_cast<uint32_t>(bit));
|
||||
prediction.m_features.ForEach([&](uint64_t bit) {
|
||||
auto const fid = base::asserted_cast<uint32_t>(bit);
|
||||
m2::PointD streetCenter;
|
||||
if (m_context->GetCenter(fid, streetCenter) &&
|
||||
any_of(centers.begin(), centers.end(), [&](auto const & center) {
|
||||
return mercator::DistanceOnEarth(center, streetCenter) <= m_params.m_streetSearchRadiusM;
|
||||
}))
|
||||
{
|
||||
sortedFeatures.push_back(base::asserted_cast<uint32_t>(bit));
|
||||
}
|
||||
});
|
||||
layer.m_sortedFeatures = &sortedFeatures;
|
||||
|
||||
|
|
|
@ -92,6 +92,7 @@ public:
|
|||
std::vector<uint32_t> m_cuisineTypes;
|
||||
std::vector<uint32_t> m_preferredTypes;
|
||||
std::shared_ptr<Tracer> m_tracer;
|
||||
double m_streetSearchRadiusM = 0.0;
|
||||
};
|
||||
|
||||
Geocoder(DataSource const & dataSource, storage::CountryInfoGetter const & infoGetter,
|
||||
|
|
|
@ -729,6 +729,7 @@ void Processor::InitGeocoder(Geocoder::Params & geocoderParams, SearchParams con
|
|||
geocoderParams.m_cuisineTypes = m_cuisineTypes;
|
||||
geocoderParams.m_preferredTypes = m_preferredTypes;
|
||||
geocoderParams.m_tracer = searchParams.m_tracer;
|
||||
geocoderParams.m_streetSearchRadiusM = searchParams.m_streetSearchRadiusM;
|
||||
|
||||
m_geocoder.SetParams(geocoderParams);
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ struct SearchParams
|
|||
inline static size_t const kDefaultNumResultsEverywhere = 30;
|
||||
inline static size_t const kDefaultNumResultsInViewport = 200;
|
||||
inline static size_t const kPreResultsCount = 200;
|
||||
inline static double const kDefaultStreetSearchRadiusM = 80000;
|
||||
inline static std::chrono::steady_clock::duration const kDefaultTimeout =
|
||||
std::chrono::seconds(3);
|
||||
inline static std::chrono::steady_clock::duration const kDefaultDesktopTimeout =
|
||||
|
@ -73,6 +74,9 @@ struct SearchParams
|
|||
// pre-ranking of viewport search results.
|
||||
double m_minDistanceOnMapBetweenResults = 0.0;
|
||||
|
||||
// Street search radius from pivot or matched city center for everywhere search mode.
|
||||
double m_streetSearchRadiusM = kDefaultStreetSearchRadiusM;
|
||||
|
||||
Mode m_mode = Mode::Everywhere;
|
||||
|
||||
// Needed to generate search suggests.
|
||||
|
|
|
@ -88,6 +88,7 @@ unique_ptr<tests_support::TestSearchRequest> SearchTest::MakeRequest(
|
|||
params.m_mode = Mode::Everywhere;
|
||||
params.m_needAddress = true;
|
||||
params.m_suggestsEnabled = false;
|
||||
params.m_streetSearchRadiusM = tests_support::TestSearchRequest::kDefaultTestStreetSearchRadiusM;
|
||||
|
||||
auto request = make_unique<tests_support::TestSearchRequest>(m_engine, params);
|
||||
request->Run();
|
||||
|
|
|
@ -25,6 +25,7 @@ TestSearchRequest::TestSearchRequest(TestSearchEngine & engine, string const & q
|
|||
m_params.m_inputLocale = locale;
|
||||
m_params.m_viewport = viewport;
|
||||
m_params.m_mode = mode;
|
||||
m_params.m_streetSearchRadiusM = kDefaultTestStreetSearchRadiusM;
|
||||
SetUpCallbacks();
|
||||
SetUpResultParams();
|
||||
}
|
||||
|
@ -47,6 +48,7 @@ TestSearchRequest::TestSearchRequest(TestSearchEngine & engine, string const & q
|
|||
m_params.m_mode = mode;
|
||||
m_params.m_onStarted = onStarted;
|
||||
m_params.m_onResults = onResults;
|
||||
m_params.m_streetSearchRadiusM = kDefaultTestStreetSearchRadiusM;
|
||||
SetUpResultParams();
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,8 @@ class TestSearchEngine;
|
|||
class TestSearchRequest
|
||||
{
|
||||
public:
|
||||
inline static double const kDefaultTestStreetSearchRadiusM = 2e7;
|
||||
|
||||
TestSearchRequest(TestSearchEngine & engine, std::string const & query,
|
||||
std::string const & locale, Mode mode, m2::RectD const & viewport);
|
||||
TestSearchRequest(TestSearchEngine & engine, SearchParams const & params);
|
||||
|
|
Loading…
Add table
Reference in a new issue