[search] Take into account current position in search query

This commit is contained in:
vng 2012-02-02 20:05:52 +03:00 committed by Alex Zolotarev
parent 1c89033377
commit b0ad845f32
2 changed files with 35 additions and 38 deletions

View file

@ -38,6 +38,11 @@ namespace search
m_validPos = true;
}
inline bool IsNearMeMode() const
{
return (m_mode == NearMe && m_validPos);
}
public:
SearchCallbackT m_callback;

View file

@ -90,28 +90,6 @@ void Engine::InitializeCategoriesAndSuggestStrings(CategoriesHolder const & cate
m_pData->m_stringsToSuggest.assign(stringsToSuggest.begin(), stringsToSuggest.end());
}
/*
void Engine::SetPosition(double lat, double lon)
{
m2::PointD const oldPos = m_pQuery->GetPosition();
if (m_trackEnable &&
ms::DistanceOnEarth(MercatorBounds::YToLat(oldPos.y),
MercatorBounds::XToLon(oldPos.x),
lat, lon) > 10.0)
{
LOG(LINFO, ("Update after Position: ", oldPos, lon, lat));
m_pQuery->SetPosition(m2::PointD(MercatorBounds::LonToX(lon),
MercatorBounds::LatToY(lat)));
m_pQuery->SetViewport(MercatorBounds::MetresToXY(lon, lat, 25000));
RepeatSearch();
}
}
*/
void Engine::Search(SearchParams const & params, m2::RectD const & viewport)
{
{
@ -124,37 +102,51 @@ void Engine::Search(SearchParams const & params, m2::RectD const & viewport)
GetPlatform().RunAsync(bind(&Engine::SearchAsync, this));
}
namespace
{
m2::PointD GetViewportXY(double lat, double lon)
{
return m2::PointD(MercatorBounds::LonToX(lon), MercatorBounds::LatToY(lat));
}
m2::RectD GetViewportRect(double lat, double lon, double radius)
{
return MercatorBounds::MetresToXY(lon, lat, radius);
}
}
void Engine::SearchAsync()
{
// First of all - cancel previous query.
m_pQuery->DoCancel();
// Enter to run new search.
threads::MutexGuard guard(m_searchMutex);
threads::MutexGuard searchGuard(m_searchMutex);
m_pQuery->SetViewport(m_viewport);
m_pQuery->SetPosition(m_viewport.Center());
// Get current search params.
m2::RectD viewport;
SearchParams params;
{
threads::MutexGuard updateGuard(m_updateMutex);
params = m_params;
viewport = m_viewport;
}
// Initialize query.
bool const isNearMe = params.IsNearMeMode();
m_pQuery->SetViewport(isNearMe ? GetViewportRect(params.m_lat, params.m_lon, 20000) : viewport);
m_pQuery->SetPosition(isNearMe ? GetViewportXY(params.m_lat, params.m_lon) : m_viewport.Center());
Results res;
SearchCallbackT callback;
try
{
string query;
{
threads::MutexGuard guard(m_updateMutex);
query = m_params.m_query;
callback = m_params.m_callback;
}
m_pQuery->Search(query, res);
m_pQuery->Search(params.m_query, res);
}
catch (Query::CancelException const &)
{
}
// emit results in any way, even if search was canceled
callback(res);
// Emit results in any way, even if search was canceled.
params.m_callback(res);
}
string Engine::GetCountryFile(m2::PointD const & pt) const