From 543e77b9befa2798621ec07951891c79d47acb4c Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Thu, 19 Nov 2015 18:25:33 +0100 Subject: [PATCH] Add pre-turn bearing as last field to instruction --- data_structures/segment_information.hpp | 7 ++++--- descriptors/description_factory.cpp | 6 ++++-- descriptors/json_descriptor.hpp | 23 ++++++++++++++++++----- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/data_structures/segment_information.hpp b/data_structures/segment_information.hpp index b22254f02..d9cdc8160 100644 --- a/data_structures/segment_information.hpp +++ b/data_structures/segment_information.hpp @@ -43,7 +43,8 @@ struct SegmentInformation NodeID name_id; EdgeWeight duration; float length; - short bearing; // more than enough [0..3600] fits into 12 bits + short pre_turn_bearing; // more than enough [0..3600] fits into 12 bits + short post_turn_bearing; TurnInstruction turn_instruction; TravelMode travel_mode; bool necessary; @@ -58,7 +59,7 @@ struct SegmentInformation const bool is_via_location, const TravelMode travel_mode) : location(std::move(location)), name_id(name_id), duration(duration), length(length), - bearing(0), turn_instruction(turn_instruction), travel_mode(travel_mode), + pre_turn_bearing(0), post_turn_bearing(0), turn_instruction(turn_instruction), travel_mode(travel_mode), necessary(necessary), is_via_location(is_via_location) { } @@ -70,7 +71,7 @@ struct SegmentInformation const TurnInstruction turn_instruction, const TravelMode travel_mode) : location(std::move(location)), name_id(name_id), duration(duration), length(length), - bearing(0), turn_instruction(turn_instruction), travel_mode(travel_mode), + pre_turn_bearing(0), post_turn_bearing(0), turn_instruction(turn_instruction), travel_mode(travel_mode), necessary(turn_instruction != TurnInstruction::NoTurn), is_via_location(false) { } diff --git a/descriptors/description_factory.cpp b/descriptors/description_factory.cpp index 96883652b..6da7ad5cb 100644 --- a/descriptors/description_factory.cpp +++ b/descriptors/description_factory.cpp @@ -237,8 +237,10 @@ void DescriptionFactory::Run(const unsigned zoom_level) via_indices.push_back(necessary_segments); } - const double angle = coordinate_calculation::bearing(first.location, second.location); - first.bearing = static_cast(angle * 10); + const double post_turn_bearing = coordinate_calculation::bearing(first.location, second.location); + const double pre_turn_bearing = coordinate_calculation::bearing(second.location, first.location); + first.post_turn_bearing = static_cast(post_turn_bearing * 10); + first.pre_turn_bearing = static_cast(pre_turn_bearing * 10); }); via_indices.push_back(necessary_segments + 1); diff --git a/descriptors/json_descriptor.hpp b/descriptors/json_descriptor.hpp index 3e309a493..057c4caf8 100644 --- a/descriptors/json_descriptor.hpp +++ b/descriptors/json_descriptor.hpp @@ -44,6 +44,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#include #include #include @@ -301,7 +302,7 @@ template class JSONDescriptor final : public BaseDescriptor< struct RoundAbout { - RoundAbout() : start_index(INT_MAX), name_id(INVALID_NAMEID), leave_at_exit(INT_MAX) {} + RoundAbout() : start_index(std::numeric_limits::max()), name_id(INVALID_NAMEID), leave_at_exit(std::numeric_limits::max()) {} int start_index; unsigned name_id; int leave_at_exit; @@ -350,16 +351,26 @@ template class JSONDescriptor final : public BaseDescriptor< json_instruction_row.values.push_back(std::round(segment.duration / 10.)); json_instruction_row.values.push_back( std::to_string(static_cast(segment.length)) + "m"); - const double bearing_value = (segment.bearing / 10.); - json_instruction_row.values.push_back(bearing::get(bearing_value)); + + // post turn bearing + const double post_turn_bearing_value = (segment.post_turn_bearing / 10.); + json_instruction_row.values.push_back(bearing::get(post_turn_bearing_value)); json_instruction_row.values.push_back( - static_cast(round(bearing_value))); + static_cast(round(post_turn_bearing_value))); + json_instruction_row.values.push_back(segment.travel_mode); + // pre turn bearing + const double pre_turn_bearing_value = (segment.pre_turn_bearing / 10.); + json_instruction_row.values.push_back(bearing::get(pre_turn_bearing_value)); + json_instruction_row.values.push_back( + static_cast(round(pre_turn_bearing_value))); + + json_instruction_array.values.push_back(json_instruction_row); + route_segments_list.emplace_back( segment.name_id, static_cast(segment.length), static_cast(route_segments_list.size())); - json_instruction_array.values.push_back(json_instruction_row); } } else if (TurnInstruction::StayOnRoundAbout == current_instruction) @@ -383,6 +394,8 @@ template class JSONDescriptor final : public BaseDescriptor< json_last_instruction_row.values.push_back("0m"); json_last_instruction_row.values.push_back(bearing::get(0.0)); json_last_instruction_row.values.push_back(0.); + json_last_instruction_row.values.push_back(bearing::get(0.0)); + json_last_instruction_row.values.push_back(0.); json_instruction_array.values.push_back(json_last_instruction_row); return json_instruction_array;