Support British spelling of manoeuvre to comply with OSM standards.

This commit is contained in:
Daniel Patterson 2018-04-06 15:42:32 -07:00
parent c7daa521ad
commit 36840ef66f
2 changed files with 21 additions and 9 deletions

View File

@ -28,6 +28,8 @@ Feature: Maneuver tag support
| maneuver | hij | i | cde | turn | sharp_left | | maneuver | hij | i | cde | turn | sharp_left |
| maneuver | abc | c | cde | turn | slight_left | | maneuver | abc | c | cde | turn | slight_left |
| maneuver | cde | c | cgi | turn | straight | | maneuver | cde | c | cgi | turn | straight |
| maneuver | cde | c | cgi | turn | straight |
| manoeuvre | cde | c | abc | fork | right |
When I route I should get When I route I should get
| waypoints | route | turns | | waypoints | route | turns |
@ -36,7 +38,7 @@ Feature: Maneuver tag support
| b,g | A Street,C Street,C Street | depart,turn sharp right,arrive | | b,g | A Street,C Street,C Street | depart,turn sharp right,arrive |
# Testing re-awakening suppressed turns # Testing re-awakening suppressed turns
| a,e | A Street,B Street,B Street | depart,turn slight left,arrive | | a,e | A Street,B Street,B Street | depart,turn slight left,arrive |
| e,i | B Street,C Street,C Street | depart,turn straight,arrive | | e,a | B Street,A Street,A Street | depart,fork right,arrive |
Scenario: single via-way Scenario: single via-way
Given the node map Given the node map

View File

@ -11,7 +11,8 @@
#include <boost/regex.hpp> #include <boost/regex.hpp>
#include <osmium/osm.hpp> #include <osmium/osm.hpp>
#include <osmium/tags/regex_filter.hpp> #include <osmium/tags/filter.hpp>
#include <osmium/tags/taglist.hpp>
#include <algorithm> #include <algorithm>
#include <iterator> #include <iterator>
@ -31,16 +32,16 @@ ManeuverOverrideRelationParser::ManeuverOverrideRelationParser() {}
boost::optional<InputManeuverOverride> boost::optional<InputManeuverOverride>
ManeuverOverrideRelationParser::TryParse(const osmium::Relation &relation) const ManeuverOverrideRelationParser::TryParse(const osmium::Relation &relation) const
{ {
osmium::tags::KeyFilter filter(false);
filter.add(true, "maneuver"); // Support both American and British spellings of maneuver/manoeuvre
osmium::tags::KeyValueFilter filter{false};
filter.add(true, "type", "maneuver");
filter.add(true, "type", "manoeuvre");
const osmium::TagList &tag_list = relation.tags(); const osmium::TagList &tag_list = relation.tags();
osmium::tags::KeyFilter::iterator fi_begin(filter, tag_list.begin(), tag_list.end()); if (osmium::tags::match_none_of(tag_list, filter))
osmium::tags::KeyFilter::iterator fi_end(filter, tag_list.end(), tag_list.end());
// if it's not a maneuver, continue; // if it's not a maneuver, continue;
if (std::distance(fi_begin, fi_end) == 0)
{ {
return boost::none; return boost::none;
} }
@ -49,7 +50,16 @@ ManeuverOverrideRelationParser::TryParse(const osmium::Relation &relation) const
// we can trim away the vector after parsing // we can trim away the vector after parsing
InputManeuverOverride maneuver_override; InputManeuverOverride maneuver_override;
// Handle both spellings
if (relation.tags().has_key("maneuver"))
{
maneuver_override.maneuver = relation.tags().get_value_by_key("maneuver", ""); maneuver_override.maneuver = relation.tags().get_value_by_key("maneuver", "");
}
else
{
maneuver_override.maneuver = relation.tags().get_value_by_key("manoeuvre", "");
}
maneuver_override.direction = relation.tags().get_value_by_key("direction", ""); maneuver_override.direction = relation.tags().get_value_by_key("direction", "");
bool valid_relation = true; bool valid_relation = true;