We have been using OSRM (vrptools software) to optimize collection
routes of solid waste (basically viaroute and nearest plugins).
At the moment we are implementing container collection by the right side
(some types of containers must be collected by the right side of the
truck), so the bearing parameter has been very useful.
We don't know street bearing, so the direction of the truck to pick up
the container is obtained from the location of the container and the
location of the PhantomNode (+90 degrees).
We have slightly changed the code OSRM to be more flexible in this case.
In particular we have:
* added custom bearings range parameter for viaroute (bearings_range in
route_parameters and bs_range in api_grammar). [8 degrees is not enought
in some cases (containers located very near of an edge)];
* added bearing = -1 when we do not want to take account bearing
parameter in a route point (not necessary for us in one-way streets).
I attach the patch file in case it is useful. Thank you for all!. Best
regards. Fernando.diff --git a/data_structures/route_parameters.cpp b/data_structures/route_parameters.cpp
index ad01340..b710eb5 100644
--- a/data_structures/route_parameters.cpp
+++ b/data_structures/route_parameters.cpp
@@ -122,7 +122,7 @@ void RouteParameters::addBearing(const int bearing, boost::spirit::qi::unused_ty
{
bearings.resize(coordinates.size());
pass = false;
- if (bearing < 0 || bearing > 359) return;
+ if (bearing < -1 || bearing > 359) return;
if (!bearings.empty())
{
bearings.back() = bearing;
@@ -130,6 +130,14 @@ void RouteParameters::addBearing(const int bearing, boost::spirit::qi::unused_ty
}
}
+void RouteParameters::setBearingsRange(const int range)
+{
+ if ( range>0 && range<=90 )
+ {
+ bearings_range = range;
+ }
+}
+
void RouteParameters::setLanguage(const std::string &language_string)
{
language = language_string;
diff --git a/include/osrm/route_parameters.hpp b/include/osrm/route_parameters.hpp
index f49d440..fcef515 100644
--- a/include/osrm/route_parameters.hpp
+++ b/include/osrm/route_parameters.hpp
@@ -72,7 +72,9 @@ struct RouteParameters
void addTimestamp(const unsigned timestamp);
- void addBearing(const int timestamp, boost::spirit::qi::unused_type unused, bool& pass);
+ void addBearing(const int bearing, boost::spirit::qi::unused_type unused, bool& pass);
+
+ void setBearingsRange(const int range);
void setLanguage(const std::string &language);
@@ -103,6 +105,7 @@ struct RouteParameters
std::vector<std::string> hints;
std::vector<unsigned> timestamps;
std::vector<int> bearings;
+ int bearings_range;
std::vector<bool> uturns;
std::vector<FixedPointCoordinate> coordinates;
};
diff --git a/plugins/match.hpp b/plugins/match.hpp
index 55a8c14..c7530bb 100644
--- a/plugins/match.hpp
+++ b/plugins/match.hpp
@@ -95,6 +95,7 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
bool getCandidates(const std::vector<FixedPointCoordinate> &input_coords,
const std::vector<int> &input_bearings,
+ const int input_bearings_range,
const double gps_precision,
std::vector<double> &sub_trace_lengths,
osrm::matching::CandidateLists &candidates_lists)
@@ -102,6 +103,14 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
double query_radius = 10 * gps_precision;
double last_distance = coordinate_calculation::great_circle_distance(input_coords[0], input_coords[1]);
+ int bearing = 0;
+ int range = 180;
+ int bearings_range = 10;
+ if (input_bearings.size() > 0 )
+ {
+ bearings_range = (input_bearings_range > 0 && input_bearings_range < 90) ? input_bearings_range : 10;
+ }
+
sub_trace_lengths.resize(input_coords.size());
sub_trace_lengths[0] = 0;
for (const auto current_coordinate : osrm::irange<std::size_t>(0, input_coords.size()))
@@ -128,10 +137,19 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
}
}
- std::vector<std::pair<PhantomNode, double>> candidates;
// Use bearing values if supplied, otherwise fallback to 0,180 defaults
- auto bearing = input_bearings.size() > 0 ? input_bearings[current_coordinate] : 0;
- auto range = input_bearings.size() > 0 ? 10 : 180;
+ if (input_bearings.size() > 0 && input_bearings[current_coordinate] != -1)
+ {
+ bearing = input_bearings[current_coordinate];
+ range = bearings_range;
+ }
+ else
+ {
+ bearing = 0;
+ range = 180;
+ }
+
+ std::vector<std::pair<PhantomNode, double>> candidates;
facade->IncrementalFindPhantomNodeForCoordinateWithMaxDistance(
input_coords[current_coordinate], candidates, query_radius,
bearing, range);
@@ -304,7 +322,7 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
}
const bool found_candidates =
- getCandidates(input_coords, input_bearings, route_parameters.gps_precision, sub_trace_lengths, candidates_lists);
+ getCandidates(input_coords, input_bearings, route_parameters.bearings_range, route_parameters.gps_precision, sub_trace_lengths, candidates_lists);
if (!found_candidates)
{
json_result.values["status"] = "No suitable matching candidates found.";
diff --git a/plugins/viaroute.hpp b/plugins/viaroute.hpp
index c054b0d..2197c38 100644
--- a/plugins/viaroute.hpp
+++ b/plugins/viaroute.hpp
@@ -90,6 +90,14 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
std::vector<phantom_node_pair> phantom_node_pair_list(route_parameters.coordinates.size());
const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum());
+ int bearing = 0;
+ int range = 180;
+ int bearings_range = 8;
+ if (input_bearings.size() > 0 )
+ {
+ bearings_range = (route_parameters.bearings_range > 0 && route_parameters.bearings_range < 90) ? route_parameters.bearings_range : 8;
+ }
+
for (const auto i : osrm::irange<std::size_t>(0, route_parameters.coordinates.size()))
{
if (checksum_OK && i < route_parameters.hints.size() &&
@@ -102,9 +110,22 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
continue;
}
}
+
+ if (input_bearings.size() > 0 && input_bearings[i] != -1)
+ {
+ bearing = input_bearings[i];
+ range = bearings_range;
+ }
+ else
+ {
+ bearing = 0;
+ range = 180;
+ }
+
+ std::cout << "bearing: " << bearing << std::endl;
+ std::cout << "range: " << range << std::endl;
+
std::vector<PhantomNode> phantom_node_vector;
- int bearing = input_bearings.size() > 0 ? input_bearings[i] : 0;
- int range = input_bearings.size() > 0 ? 8 : 180;
if (facade->IncrementalFindPhantomNodeForCoordinate(route_parameters.coordinates[i],
phantom_node_vector, 1, bearing, range))
{
diff --git a/server/api_grammar.hpp b/server/api_grammar.hpp
index f9a22a5..0033ade 100644
--- a/server/api_grammar.hpp
+++ b/server/api_grammar.hpp
@@ -40,7 +40,7 @@ template <typename Iterator, class HandlerT> struct APIGrammar : qi::grammar<Ite
{
api_call = qi::lit('/') >> string[boost::bind(&HandlerT::setService, handler, ::_1)] >>
*(query) >> -(uturns);
- query = ('?') >> (+(zoom | output | jsonp | checksum | location | hint | timestamp | bearing | u | cmp |
+ query = ('?') >> (+(zoom | output | jsonp | checksum | location | hint | timestamp | bearing | bearings_range | u | cmp |
language | instruction | geometry | alt_route | old_API | num_results |
matching_beta | gps_precision | classify | locs));
@@ -67,6 +67,8 @@ template <typename Iterator, class HandlerT> struct APIGrammar : qi::grammar<Ite
qi::uint_[boost::bind(&HandlerT::addTimestamp, handler, ::_1)];
bearing = (-qi::lit('&')) >> qi::lit("b") >> '=' >>
qi::int_[boost::bind(&HandlerT::addBearing, handler, ::_1, ::_2, ::_3)];
+ bearings_range = (-qi::lit('&')) >> qi::lit("bs_range") >> '=' >>
+ qi::int_[boost::bind(&HandlerT::setBearingsRange, handler, ::_1)];
u = (-qi::lit('&')) >> qi::lit("u") >> '=' >>
qi::bool_[boost::bind(&HandlerT::setUTurn, handler, ::_1)];
uturns = (-qi::lit('&')) >> qi::lit("uturns") >> '=' >>
@@ -97,7 +99,7 @@ template <typename Iterator, class HandlerT> struct APIGrammar : qi::grammar<Ite
qi::rule<Iterator> api_call, query;
qi::rule<Iterator, std::string()> service, zoom, output, string, jsonp, checksum, location,
- hint, timestamp, bearing, stringwithDot, stringwithPercent, language, instruction, geometry, cmp, alt_route, u,
+ hint, timestamp, bearing, bearings_range, stringwithDot, stringwithPercent, language, instruction, geometry, cmp, alt_route, u,
uturns, old_API, num_results, matching_beta, gps_precision, classify, locs, stringforPolyline;
HandlerT *handler;
_______________________________________________
OSRM-talk mailing list
[email protected]
https://lists.openstreetmap.org/listinfo/osrm-talk