Hardcode search radius parameters
This commit is contained in:
parent
4f81e31d63
commit
2c9e18d5a9
@ -28,13 +28,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifndef ENGINE_API_MATCH_PARAMETERS_HPP
|
#ifndef ENGINE_API_MATCH_PARAMETERS_HPP
|
||||||
#define ENGINE_API_MATCH_PARAMETERS_HPP
|
#define ENGINE_API_MATCH_PARAMETERS_HPP
|
||||||
|
|
||||||
#define SEARCH_RADIUS_BASE_DEFAULT 45
|
|
||||||
#define SEARCH_RADIUS_BASE_LIMIT 100
|
|
||||||
#define SEARCH_RADIUS_MULTIPLIER_DEFAULT 3.5
|
|
||||||
#define SEARCH_RADIUS_MULTIPLIER_LIMIT 10
|
|
||||||
#define SEARCH_RADIUS_MAX_DEFAULT 200
|
|
||||||
#define SEARCH_RADIUS_MAX_LIMIT 500
|
|
||||||
|
|
||||||
#include "engine/api/route_parameters.hpp"
|
#include "engine/api/route_parameters.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -74,20 +67,10 @@ struct MatchParameters : public RouteParameters
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<unsigned> timestamps;
|
std::vector<unsigned> timestamps;
|
||||||
|
|
||||||
double search_radius_base = SEARCH_RADIUS_BASE_DEFAULT;
|
|
||||||
double search_radius_multiplier = SEARCH_RADIUS_MULTIPLIER_DEFAULT;
|
|
||||||
double search_radius_max = SEARCH_RADIUS_MAX_DEFAULT;
|
|
||||||
|
|
||||||
bool IsValid() const
|
bool IsValid() const
|
||||||
{
|
{
|
||||||
return RouteParameters::IsValid() &&
|
return RouteParameters::IsValid() &&
|
||||||
(timestamps.empty() || timestamps.size() == coordinates.size()) &&
|
(timestamps.empty() || timestamps.size() == coordinates.size());
|
||||||
search_radius_base >= 0 && search_radius_multiplier >= 0 && search_radius_max > 0 &&
|
|
||||||
// limit the search_radius parameters to sane values to prevent overloading the server
|
|
||||||
search_radius_base <= SEARCH_RADIUS_BASE_LIMIT &&
|
|
||||||
search_radius_multiplier <= SEARCH_RADIUS_MULTIPLIER_LIMIT &&
|
|
||||||
search_radius_max <= SEARCH_RADIUS_MAX_LIMIT;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -33,33 +33,13 @@ struct MatchParametersGrammar final : public RouteParametersGrammar<Iterator, Si
|
|||||||
(qi::uint_ %
|
(qi::uint_ %
|
||||||
';')[ph::bind(&engine::api::MatchParameters::timestamps, qi::_r1) = qi::_1];
|
';')[ph::bind(&engine::api::MatchParameters::timestamps, qi::_r1) = qi::_1];
|
||||||
|
|
||||||
search_radius_base_rule =
|
|
||||||
qi::lit("search_radius_base=") > qi::double_[
|
|
||||||
ph::bind(&engine::api::MatchParameters::search_radius_base, qi::_r1) = qi::_1];
|
|
||||||
|
|
||||||
search_radius_multiplier_rule =
|
|
||||||
qi::lit("search_radius_multiplier=") > qi::double_[
|
|
||||||
ph::bind(&engine::api::MatchParameters::search_radius_multiplier, qi::_r1) = qi::_1];
|
|
||||||
|
|
||||||
search_radius_max_rule =
|
|
||||||
qi::lit("search_radius_max=") > qi::double_[
|
|
||||||
ph::bind(&engine::api::MatchParameters::search_radius_max, qi::_r1) = qi::_1];
|
|
||||||
|
|
||||||
root_rule = BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
|
root_rule = BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
|
||||||
-('?' > (timestamps_rule(qi::_r1) |
|
-('?' > (timestamps_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1)) % '&');
|
||||||
search_radius_base_rule(qi::_r1) |
|
|
||||||
search_radius_multiplier_rule(qi::_r1) |
|
|
||||||
search_radius_max_rule(qi::_r1) |
|
|
||||||
BaseGrammar::base_rule(qi::_r1))
|
|
||||||
% '&');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
qi::rule<Iterator, Signature> root_rule;
|
qi::rule<Iterator, Signature> root_rule;
|
||||||
qi::rule<Iterator, Signature> timestamps_rule;
|
qi::rule<Iterator, Signature> timestamps_rule;
|
||||||
qi::rule<Iterator, Signature> search_radius_base_rule;
|
|
||||||
qi::rule<Iterator, Signature> search_radius_multiplier_rule;
|
|
||||||
qi::rule<Iterator, Signature> search_radius_max_rule;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
static double search_radius_for_gps_radius(double gps_radius) {
|
||||||
|
// For a given GPS radius, determine the radius we need to search for candidate street segments
|
||||||
|
// to have a 99.9% chance of finding the correct segment.
|
||||||
|
// For more detail, see the analysis at https://github.com/Project-OSRM/osrm-backend/pull/3184
|
||||||
|
return std::min(gps_radius * 3.5 + 45, 200);
|
||||||
|
}
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
namespace engine
|
namespace engine
|
||||||
@ -153,11 +160,8 @@ Status MatchPlugin::HandleRequest(const std::shared_ptr<datafacade::BaseDataFaca
|
|||||||
parameters.radiuses.end(),
|
parameters.radiuses.end(),
|
||||||
search_radiuses.begin(),
|
search_radiuses.begin(),
|
||||||
[&](const boost::optional<double> &maybe_radius) {
|
[&](const boost::optional<double> &maybe_radius) {
|
||||||
double in_radius = maybe_radius ? *maybe_radius : DEFAULT_GPS_PRECISION;
|
double gps_radius = maybe_radius ? *maybe_radius : DEFAULT_GPS_PRECISION;
|
||||||
|
return search_radius_for_gps_radius(gps_radius);
|
||||||
return std::min(
|
|
||||||
in_radius * parameters.search_radius_multiplier + parameters.search_radius_base,
|
|
||||||
parameters.search_radius_max);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user