From e262cac3e8cb317d1c15a6417b1bda5582c44edb Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Wed, 29 Mar 2017 10:33:49 +0200 Subject: [PATCH] Flip source and target coordinates for segments in only backward direction --- src/extractor/extraction_containers.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/extractor/extraction_containers.cpp b/src/extractor/extraction_containers.cpp index 2148b5298..95dd040b0 100644 --- a/src/extractor/extraction_containers.cpp +++ b/src/extractor/extraction_containers.cpp @@ -388,21 +388,24 @@ void ExtractionContainers::PrepareEdges(ScriptingEnvironment &scripting_environm BOOST_ASSERT(edge_iterator->source_coordinate.lon != util::FixedLongitude{std::numeric_limits::min()}); - const util::Coordinate target_coord{node_iterator->lon, node_iterator->lat}; - const double distance = util::coordinate_calculation::greatCircleDistance( - edge_iterator->source_coordinate, target_coord); + util::Coordinate source_coord(edge_iterator->source_coordinate); + util::Coordinate target_coord{node_iterator->lon, node_iterator->lat}; - auto weight = edge_iterator->weight_data(distance); - auto duration = edge_iterator->duration_data(distance); + // flip source and target coordinates if segment is in backward direction only + if (!edge_iterator->result.forward && edge_iterator->result.backward) + std::swap(source_coord, target_coord); - ExtractionSegment extracted_segment( - edge_iterator->source_coordinate, target_coord, distance, weight, duration); - scripting_environment.ProcessSegment(extracted_segment); + const auto distance = + util::coordinate_calculation::greatCircleDistance(source_coord, target_coord); + const auto weight = edge_iterator->weight_data(distance); + const auto duration = edge_iterator->duration_data(distance); + + ExtractionSegment segment(source_coord, target_coord, distance, weight, duration); + scripting_environment.ProcessSegment(segment); auto &edge = edge_iterator->result; - edge.weight = - std::max(1, std::round(extracted_segment.weight * weight_multiplier)); - edge.duration = std::max(1, std::round(extracted_segment.duration * 10.)); + edge.weight = std::max(1, std::round(segment.weight * weight_multiplier)); + edge.duration = std::max(1, std::round(segment.duration * 10.)); // assign new node id auto id_iter = external_to_internal_node_id_map.find(node_iterator->node_id);