Merge IntersectionShapeData and IntersectionEdgeGeometry
This commit is contained in:
parent
0f93a7dd05
commit
0fc8b6289c
@ -3,6 +3,11 @@
|
|||||||
- Bugfixes:
|
- Bugfixes:
|
||||||
- fix deduplication of route steps when waypoints are used [#4909](https://github.com/Project-OSRM/osrm-backend/issues/4909)
|
- fix deduplication of route steps when waypoints are used [#4909](https://github.com/Project-OSRM/osrm-backend/issues/4909)
|
||||||
- FIXED #4920: Use smaller range for U-turn angles in map-matching [#4920](https://github.com/Project-OSRM/osrm-backend/pull/4920)
|
- FIXED #4920: Use smaller range for U-turn angles in map-matching [#4920](https://github.com/Project-OSRM/osrm-backend/pull/4920)
|
||||||
|
- Profile:
|
||||||
|
- CHANGED #4929: Handle oneways in get_forward_backward_by_key [#4929](https://github.com/Project-OSRM/osrm-backend/pull/4929)
|
||||||
|
- Guidance:
|
||||||
|
- CHANGED #4929: Don't use obviousness for links bifurcations [#4929](https://github.com/Project-OSRM/osrm-backend/pull/4929)
|
||||||
|
- FIXED #4929: Adjust Straight direction modifiers of side roads in driveway handler [#4929](https://github.com/Project-OSRM/osrm-backend/pull/4929)
|
||||||
- Tools:
|
- Tools:
|
||||||
- `osrm-routed` accepts a new property `--memory_file` to store memory in a file on disk.
|
- `osrm-routed` accepts a new property `--memory_file` to store memory in a file on disk.
|
||||||
- NodeJS:
|
- NodeJS:
|
||||||
|
@ -26,14 +26,19 @@ struct IntersectionEdge
|
|||||||
|
|
||||||
using IntersectionEdges = std::vector<IntersectionEdge>;
|
using IntersectionEdges = std::vector<IntersectionEdge>;
|
||||||
|
|
||||||
|
// The extracted geometry of an intersection edge only knows about edge IDs and bearings
|
||||||
|
// Bearing is the direction in clockwise angle from true north after taking the turn:
|
||||||
|
// 0 = heading north, 90 = east, 180 = south, 270 = west
|
||||||
|
// `initial_bearing` is the original OSM edge bearing
|
||||||
|
// `perceived_bearing` is the edge bearing after line fitting and edges merging
|
||||||
struct IntersectionEdgeGeometry
|
struct IntersectionEdgeGeometry
|
||||||
{
|
{
|
||||||
EdgeID edge;
|
EdgeID eid;
|
||||||
double initial_bearing;
|
double initial_bearing;
|
||||||
double perceived_bearing;
|
double perceived_bearing;
|
||||||
double length;
|
double segment_length;
|
||||||
|
|
||||||
bool operator<(const IntersectionEdgeGeometry &other) const { return edge < other.edge; }
|
bool operator<(const IntersectionEdgeGeometry &other) const { return eid < other.eid; }
|
||||||
};
|
};
|
||||||
|
|
||||||
using IntersectionEdgeGeometries = std::vector<IntersectionEdgeGeometry>;
|
using IntersectionEdgeGeometries = std::vector<IntersectionEdgeGeometry>;
|
||||||
|
@ -1,6 +1,19 @@
|
|||||||
#ifndef OSRM_EXTRACTOR_INTERSECTION_INTERSECTION_VIEW_HPP_
|
#ifndef OSRM_EXTRACTOR_INTERSECTION_INTERSECTION_VIEW_HPP_
|
||||||
#define OSRM_EXTRACTOR_INTERSECTION_INTERSECTION_VIEW_HPP_
|
#define OSRM_EXTRACTOR_INTERSECTION_INTERSECTION_VIEW_HPP_
|
||||||
|
|
||||||
|
#include "extractor/intersection/intersection_edge.hpp"
|
||||||
|
|
||||||
|
#include "guidance/turn_instruction.hpp"
|
||||||
|
|
||||||
|
#include "util/bearing.hpp"
|
||||||
|
#include "util/log.hpp"
|
||||||
|
#include "util/node_based_graph.hpp"
|
||||||
|
#include "util/typedefs.hpp" // EdgeID
|
||||||
|
|
||||||
|
#include <boost/range/algorithm/count_if.hpp>
|
||||||
|
#include <boost/range/algorithm/find_if.hpp>
|
||||||
|
#include <boost/range/algorithm/min_element.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
@ -8,17 +21,6 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "util/bearing.hpp"
|
|
||||||
#include "util/log.hpp"
|
|
||||||
#include "util/node_based_graph.hpp"
|
|
||||||
#include "util/typedefs.hpp" // EdgeID
|
|
||||||
|
|
||||||
#include "guidance/turn_instruction.hpp"
|
|
||||||
|
|
||||||
#include <boost/range/algorithm/count_if.hpp>
|
|
||||||
#include <boost/range/algorithm/find_if.hpp>
|
|
||||||
#include <boost/range/algorithm/min_element.hpp>
|
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
namespace extractor
|
namespace extractor
|
||||||
@ -26,24 +28,6 @@ namespace extractor
|
|||||||
namespace intersection
|
namespace intersection
|
||||||
{
|
{
|
||||||
|
|
||||||
// the shape of an intersection only knows about edge IDs and bearings
|
|
||||||
// `bearing` is the direction in clockwise angle from true north after taking the turn:
|
|
||||||
// 0 = heading north, 90 = east, 180 = south, 270 = west
|
|
||||||
struct IntersectionShapeData
|
|
||||||
{
|
|
||||||
EdgeID eid;
|
|
||||||
double bearing;
|
|
||||||
double segment_length;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline auto makeCompareShapeDataByBearing(const double base_bearing)
|
|
||||||
{
|
|
||||||
return [base_bearing](const auto &lhs, const auto &rhs) {
|
|
||||||
return util::angularDeviation(lhs.bearing, base_bearing) <
|
|
||||||
util::angularDeviation(rhs.bearing, base_bearing);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
inline auto makeCompareAngularDeviation(const double angle)
|
inline auto makeCompareAngularDeviation(const double angle)
|
||||||
{
|
{
|
||||||
return [angle](const auto &lhs, const auto &rhs) {
|
return [angle](const auto &lhs, const auto &rhs) {
|
||||||
@ -60,12 +44,12 @@ inline auto makeExtractLanesForRoad(const util::NodeBasedDynamicGraph &node_base
|
|||||||
|
|
||||||
// When viewing an intersection from an incoming edge, we can transform a shape into a view which
|
// When viewing an intersection from an incoming edge, we can transform a shape into a view which
|
||||||
// gives additional information on angles and whether a turn is allowed
|
// gives additional information on angles and whether a turn is allowed
|
||||||
struct IntersectionViewData : IntersectionShapeData
|
struct IntersectionViewData : IntersectionEdgeGeometry
|
||||||
{
|
{
|
||||||
IntersectionViewData(const IntersectionShapeData &shape,
|
IntersectionViewData(const IntersectionEdgeGeometry &geometry,
|
||||||
const bool entry_allowed,
|
const bool entry_allowed,
|
||||||
const double angle)
|
const double angle)
|
||||||
: IntersectionShapeData(shape), entry_allowed(entry_allowed), angle(angle)
|
: IntersectionEdgeGeometry(geometry), entry_allowed(entry_allowed), angle(angle)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,10 +64,13 @@ struct IntersectionViewData : IntersectionShapeData
|
|||||||
template <typename Self> struct EnableShapeOps
|
template <typename Self> struct EnableShapeOps
|
||||||
{
|
{
|
||||||
// same as closest turn, but for bearings
|
// same as closest turn, but for bearings
|
||||||
auto FindClosestBearing(double bearing) const
|
auto FindClosestBearing(double base_bearing) const
|
||||||
{
|
{
|
||||||
auto comp = makeCompareShapeDataByBearing(bearing);
|
return std::min_element(
|
||||||
return std::min_element(self()->begin(), self()->end(), comp);
|
self()->begin(), self()->end(), [base_bearing](const auto &lhs, const auto &rhs) {
|
||||||
|
return util::angularDeviation(lhs.perceived_bearing, base_bearing) <
|
||||||
|
util::angularDeviation(rhs.perceived_bearing, base_bearing);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// search a given eid in the intersection
|
// search a given eid in the intersection
|
||||||
@ -119,10 +106,10 @@ template <typename Self> struct EnableShapeOps
|
|||||||
auto self() const { return static_cast<const Self *>(this); }
|
auto self() const { return static_cast<const Self *>(this); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct IntersectionShape final : std::vector<IntersectionShapeData>, //
|
struct IntersectionShape final : std::vector<IntersectionEdgeGeometry>, //
|
||||||
EnableShapeOps<IntersectionShape> //
|
EnableShapeOps<IntersectionShape> //
|
||||||
{
|
{
|
||||||
using Base = std::vector<IntersectionShapeData>;
|
using Base = std::vector<IntersectionEdgeGeometry>;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Common operations shared among IntersectionView and Intersections.
|
// Common operations shared among IntersectionView and Intersections.
|
||||||
|
@ -40,7 +40,7 @@ class MergableRoadDetector
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// in case we have to change the mode we are operating on
|
// in case we have to change the mode we are operating on
|
||||||
using MergableRoadData = IntersectionShapeData;
|
using MergableRoadData = IntersectionEdgeGeometry;
|
||||||
|
|
||||||
MergableRoadDetector(const util::NodeBasedDynamicGraph &node_based_graph,
|
MergableRoadDetector(const util::NodeBasedDynamicGraph &node_based_graph,
|
||||||
const EdgeBasedNodeDataContainer &node_data_container,
|
const EdgeBasedNodeDataContainer &node_data_container,
|
||||||
|
@ -114,7 +114,7 @@ inline std::string toString(const ConnectedRoad &road)
|
|||||||
result += " angle: ";
|
result += " angle: ";
|
||||||
result += std::to_string(road.angle);
|
result += std::to_string(road.angle);
|
||||||
result += " bearing: ";
|
result += " bearing: ";
|
||||||
result += std::to_string(road.bearing);
|
result += std::to_string(road.perceived_bearing);
|
||||||
result += " instruction: ";
|
result += " instruction: ";
|
||||||
result += std::to_string(static_cast<std::int32_t>(road.instruction.type)) + " " +
|
result += std::to_string(static_cast<std::int32_t>(road.instruction.type)) + " " +
|
||||||
std::to_string(static_cast<std::int32_t>(road.instruction.direction_modifier)) + " " +
|
std::to_string(static_cast<std::int32_t>(road.instruction.direction_modifier)) + " " +
|
||||||
|
@ -348,7 +348,7 @@ std::size_t IntersectionHandler::findObviousTurn(const EdgeID via_edge,
|
|||||||
const auto turns_onto_through_street = [&](const auto &road) {
|
const auto turns_onto_through_street = [&](const auto &road) {
|
||||||
// find edge opposite to the one we are checking (in-road)
|
// find edge opposite to the one we are checking (in-road)
|
||||||
const auto in_through_candidate =
|
const auto in_through_candidate =
|
||||||
intersection.FindClosestBearing(util::bearing::reverse(road.bearing));
|
intersection.FindClosestBearing(util::bearing::reverse(road.perceived_bearing));
|
||||||
|
|
||||||
const auto &in_edge = node_based_graph.GetEdgeData(in_through_candidate->eid);
|
const auto &in_edge = node_based_graph.GetEdgeData(in_through_candidate->eid);
|
||||||
const auto &out_edge = node_based_graph.GetEdgeData(road.eid);
|
const auto &out_edge = node_based_graph.GetEdgeData(road.eid);
|
||||||
|
@ -68,7 +68,7 @@ namespace guidance
|
|||||||
inline std::ostream &operator<<(std::ostream &out, const ConnectedRoad &road)
|
inline std::ostream &operator<<(std::ostream &out, const ConnectedRoad &road)
|
||||||
{
|
{
|
||||||
out << "ConnectedRoad {" << road.eid << " allows entry: " << road.entry_allowed
|
out << "ConnectedRoad {" << road.eid << " allows entry: " << road.entry_allowed
|
||||||
<< " angle: " << road.angle << " bearing: " << road.bearing
|
<< " angle: " << road.angle << " bearing: " << road.perceived_bearing
|
||||||
<< " instruction: " << static_cast<std::int32_t>(road.instruction.type) << " "
|
<< " instruction: " << static_cast<std::int32_t>(road.instruction.type) << " "
|
||||||
<< static_cast<std::int32_t>(road.instruction.direction_modifier) << " "
|
<< static_cast<std::int32_t>(road.instruction.direction_modifier) << " "
|
||||||
<< static_cast<std::int32_t>(road.lane_data_id) << "}";
|
<< static_cast<std::int32_t>(road.lane_data_id) << "}";
|
||||||
@ -80,16 +80,17 @@ namespace extractor
|
|||||||
{
|
{
|
||||||
namespace intersection
|
namespace intersection
|
||||||
{
|
{
|
||||||
inline std::ostream &operator<<(std::ostream &out, const IntersectionShapeData &shape)
|
inline std::ostream &operator<<(std::ostream &out, const IntersectionEdgeGeometry &shape)
|
||||||
{
|
{
|
||||||
out << "IntersectionShapeData { " << shape.eid << " bearing: " << shape.bearing << "}";
|
out << "IntersectionEdgeGeometry { " << shape.eid << " bearing: " << shape.perceived_bearing
|
||||||
|
<< "}";
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::ostream &operator<<(std::ostream &out, const IntersectionViewData &view)
|
inline std::ostream &operator<<(std::ostream &out, const IntersectionViewData &view)
|
||||||
{
|
{
|
||||||
out << "IntersectionViewData {" << view.eid << " allows entry: " << view.entry_allowed
|
out << "IntersectionViewData {" << view.eid << " allows entry: " << view.entry_allowed
|
||||||
<< " angle: " << view.angle << " bearing: " << view.bearing << "}";
|
<< " angle: " << view.angle << " bearing: " << view.perceived_bearing << "}";
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,10 @@ bool IntersectionViewData::CompareByAngle(const IntersectionViewData &other) con
|
|||||||
return angle < other.angle;
|
return angle < other.angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string toString(const IntersectionShapeData &shape)
|
std::string toString(const IntersectionEdgeGeometry &shape)
|
||||||
{
|
{
|
||||||
std::string result =
|
std::string result = "[shape] " + std::to_string(shape.eid) + " bearing: " +
|
||||||
"[shape] " + std::to_string(shape.eid) + " bearing: " + std::to_string(shape.bearing);
|
std::to_string(shape.perceived_bearing);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ std::string toString(const IntersectionViewData &view)
|
|||||||
result += " angle: ";
|
result += " angle: ";
|
||||||
result += std::to_string(view.angle);
|
result += std::to_string(view.angle);
|
||||||
result += " bearing: ";
|
result += " bearing: ";
|
||||||
result += std::to_string(view.bearing);
|
result += std::to_string(view.perceived_bearing);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,9 +120,9 @@ std::pair<bool, double> findMergedBearing(const util::NodeBasedDynamicGraph &gra
|
|||||||
|
|
||||||
const auto &lhs = edge_geometries[lhs_index];
|
const auto &lhs = edge_geometries[lhs_index];
|
||||||
const auto &rhs = edge_geometries[rhs_index];
|
const auto &rhs = edge_geometries[rhs_index];
|
||||||
BOOST_ASSERT(graph.GetEdgeData(lhs.edge).reversed != graph.GetEdgeData(rhs.edge).reversed);
|
BOOST_ASSERT(graph.GetEdgeData(lhs.eid).reversed != graph.GetEdgeData(rhs.eid).reversed);
|
||||||
|
|
||||||
const auto &entry = graph.GetEdgeData(lhs.edge).reversed ? rhs : lhs;
|
const auto &entry = graph.GetEdgeData(lhs.eid).reversed ? rhs : lhs;
|
||||||
const auto opposite_bearing =
|
const auto opposite_bearing =
|
||||||
findClosestOppositeBearing(edge_geometries, entry.perceived_bearing);
|
findClosestOppositeBearing(edge_geometries, entry.perceived_bearing);
|
||||||
const auto merged_bearing = findAngleBisector(rhs.perceived_bearing, lhs.perceived_bearing);
|
const auto merged_bearing = findAngleBisector(rhs.perceived_bearing, lhs.perceived_bearing);
|
||||||
@ -178,13 +178,8 @@ bool isRoadsPairMergeable(const MergableRoadDetector &detector,
|
|||||||
|
|
||||||
// TODO: check IsDistinctFrom - it is an angle and name-only check
|
// TODO: check IsDistinctFrom - it is an angle and name-only check
|
||||||
// also check CanMergeRoad for all merging scenarios
|
// also check CanMergeRoad for all merging scenarios
|
||||||
return detector.IsDistinctFrom({llhs.edge, llhs.perceived_bearing, llhs.length},
|
return detector.IsDistinctFrom(llhs, lhs) &&
|
||||||
{lhs.edge, lhs.perceived_bearing, lhs.length}) &&
|
detector.CanMergeRoad(intersection_node, lhs, rhs) && detector.IsDistinctFrom(rhs, rrhs);
|
||||||
detector.CanMergeRoad(intersection_node,
|
|
||||||
{lhs.edge, lhs.perceived_bearing, lhs.length},
|
|
||||||
{rhs.edge, rhs.perceived_bearing, rhs.length}) &&
|
|
||||||
detector.IsDistinctFrom({rhs.edge, rhs.perceived_bearing, rhs.length},
|
|
||||||
{rrhs.edge, rrhs.perceived_bearing, rrhs.length});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto getIntersectionLanes(const util::NodeBasedDynamicGraph &graph, const NodeID intersection_node)
|
auto getIntersectionLanes(const util::NodeBasedDynamicGraph &graph, const NodeID intersection_node)
|
||||||
@ -293,9 +288,9 @@ getIntersectionGeometries(const util::NodeBasedDynamicGraph &graph,
|
|||||||
|
|
||||||
// Only one of the edges must be reversed, mark it as merged to remove from
|
// Only one of the edges must be reversed, mark it as merged to remove from
|
||||||
// intersection view
|
// intersection view
|
||||||
BOOST_ASSERT(graph.GetEdgeData(lhs.edge).reversed ^
|
BOOST_ASSERT(graph.GetEdgeData(lhs.eid).reversed ^
|
||||||
graph.GetEdgeData(rhs.edge).reversed);
|
graph.GetEdgeData(rhs.eid).reversed);
|
||||||
merged_edge_ids.insert(graph.GetEdgeData(lhs.edge).reversed ? lhs.edge : rhs.edge);
|
merged_edge_ids.insert(graph.GetEdgeData(lhs.eid).reversed ? lhs.eid : rhs.eid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -310,10 +305,10 @@ getIntersectionGeometries(const util::NodeBasedDynamicGraph &graph,
|
|||||||
|
|
||||||
// Don't adjust bearings of roads that were merged at the current intersection
|
// Don't adjust bearings of roads that were merged at the current intersection
|
||||||
// or have neighbor intersection farer than the pruning distance
|
// or have neighbor intersection farer than the pruning distance
|
||||||
if (merged_edges[index] || edge_geometry.length > PRUNING_DISTANCE)
|
if (merged_edges[index] || edge_geometry.segment_length > PRUNING_DISTANCE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const auto neighbor_intersection_node = graph.GetTarget(edge_geometry.edge);
|
const auto neighbor_intersection_node = graph.GetTarget(edge_geometry.eid);
|
||||||
|
|
||||||
const auto neighbor_geometries = getIntersectionOutgoingGeometries<false>(
|
const auto neighbor_geometries = getIntersectionOutgoingGeometries<false>(
|
||||||
graph, compressed_geometries, node_coordinates, neighbor_intersection_node);
|
graph, compressed_geometries, node_coordinates, neighbor_intersection_node);
|
||||||
@ -327,7 +322,7 @@ getIntersectionGeometries(const util::NodeBasedDynamicGraph &graph,
|
|||||||
std::find_if(neighbor_geometries.begin(),
|
std::find_if(neighbor_geometries.begin(),
|
||||||
neighbor_geometries.end(),
|
neighbor_geometries.end(),
|
||||||
[&graph, &intersection_node](const auto &road) {
|
[&graph, &intersection_node](const auto &road) {
|
||||||
return graph.GetTarget(road.edge) == intersection_node;
|
return graph.GetTarget(road.eid) == intersection_node;
|
||||||
}));
|
}));
|
||||||
BOOST_ASSERT(static_cast<std::size_t>(neighbor_curr) != neighbor_geometries.size());
|
BOOST_ASSERT(static_cast<std::size_t>(neighbor_curr) != neighbor_geometries.size());
|
||||||
const auto neighbor_prev = (neighbor_curr + neighbor_edges - 1) % neighbor_edges;
|
const auto neighbor_prev = (neighbor_curr + neighbor_edges - 1) % neighbor_edges;
|
||||||
@ -396,12 +391,12 @@ getIntersectionGeometries(const util::NodeBasedDynamicGraph &graph,
|
|||||||
for (std::size_t index = 0; index < edges_number; ++index)
|
for (std::size_t index = 0; index < edges_number; ++index)
|
||||||
{
|
{
|
||||||
const auto &geometry = edge_geometries[index];
|
const auto &geometry = edge_geometries[index];
|
||||||
const auto remote_node = graph.GetTarget(geometry.edge);
|
const auto remote_node = graph.GetTarget(geometry.eid);
|
||||||
const auto incoming_edge = graph.FindEdge(remote_node, intersection_node);
|
const auto incoming_edge = graph.FindEdge(remote_node, intersection_node);
|
||||||
edge_geometries[edges_number + index] = {incoming_edge,
|
edge_geometries[edges_number + index] = {incoming_edge,
|
||||||
util::bearing::reverse(geometry.initial_bearing),
|
util::bearing::reverse(geometry.initial_bearing),
|
||||||
util::bearing::reverse(geometry.perceived_bearing),
|
util::bearing::reverse(geometry.perceived_bearing),
|
||||||
geometry.length};
|
geometry.segment_length};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enforce ordering of edges by IDs
|
// Enforce ordering of edges by IDs
|
||||||
@ -414,9 +409,9 @@ inline auto findEdge(const IntersectionEdgeGeometries &geometries, const EdgeID
|
|||||||
{
|
{
|
||||||
const auto it = std::lower_bound(
|
const auto it = std::lower_bound(
|
||||||
geometries.begin(), geometries.end(), edge, [](const auto &geometry, const auto edge) {
|
geometries.begin(), geometries.end(), edge, [](const auto &geometry, const auto edge) {
|
||||||
return geometry.edge < edge;
|
return geometry.eid < edge;
|
||||||
});
|
});
|
||||||
BOOST_ASSERT(it != geometries.end() && it->edge == edge);
|
BOOST_ASSERT(it != geometries.end() && it->eid == edge);
|
||||||
return it;
|
return it;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -427,7 +422,7 @@ double findEdgeBearing(const IntersectionEdgeGeometries &geometries, const EdgeI
|
|||||||
|
|
||||||
double findEdgeLength(const IntersectionEdgeGeometries &geometries, const EdgeID &edge)
|
double findEdgeLength(const IntersectionEdgeGeometries &geometries, const EdgeID &edge)
|
||||||
{
|
{
|
||||||
return findEdge(geometries, edge)->length;
|
return findEdge(geometries, edge)->segment_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename RestrictionsRange>
|
template <typename RestrictionsRange>
|
||||||
@ -634,7 +629,7 @@ IntersectionView convertToIntersectionView(const util::NodeBasedDynamicGraph &gr
|
|||||||
|
|
||||||
using IntersectionViewDataWithAngle = std::pair<IntersectionViewData, double>;
|
using IntersectionViewDataWithAngle = std::pair<IntersectionViewData, double>;
|
||||||
std::vector<IntersectionViewDataWithAngle> pre_intersection_view;
|
std::vector<IntersectionViewDataWithAngle> pre_intersection_view;
|
||||||
IntersectionViewData uturn{{SPECIAL_EDGEID, 0., 0.}, false, 0.};
|
IntersectionViewData uturn{{SPECIAL_EDGEID, 0., 0., 0.}, false, 0.};
|
||||||
std::size_t allowed_uturns_number = 0;
|
std::size_t allowed_uturns_number = 0;
|
||||||
for (const auto &outgoing_edge : outgoing_edges)
|
for (const auto &outgoing_edge : outgoing_edges)
|
||||||
{
|
{
|
||||||
@ -643,7 +638,6 @@ IntersectionView convertToIntersectionView(const util::NodeBasedDynamicGraph &gr
|
|||||||
};
|
};
|
||||||
|
|
||||||
const auto edge_it = findEdge(edge_geometries, outgoing_edge.edge);
|
const auto edge_it = findEdge(edge_geometries, outgoing_edge.edge);
|
||||||
const auto segment_length = edge_it->length;
|
|
||||||
const auto is_merged = merged_edges.count(outgoing_edge.edge) != 0;
|
const auto is_merged = merged_edges.count(outgoing_edge.edge) != 0;
|
||||||
const auto is_turn_allowed = intersection::isTurnAllowed(graph,
|
const auto is_turn_allowed = intersection::isTurnAllowed(graph,
|
||||||
node_data_container,
|
node_data_container,
|
||||||
@ -673,8 +667,7 @@ IntersectionView convertToIntersectionView(const util::NodeBasedDynamicGraph &gr
|
|||||||
|
|
||||||
const auto is_uturn_angle = is_uturn(turn_angle);
|
const auto is_uturn_angle = is_uturn(turn_angle);
|
||||||
|
|
||||||
IntersectionViewData road{
|
IntersectionViewData road{*edge_it, is_turn_allowed, turn_angle};
|
||||||
{outgoing_edge.edge, outgoing_bearing, segment_length}, is_turn_allowed, turn_angle};
|
|
||||||
|
|
||||||
if (graph.GetTarget(outgoing_edge.edge) == incoming_edge.node)
|
if (graph.GetTarget(outgoing_edge.edge) == incoming_edge.node)
|
||||||
{ // Save the true U-turn road to add later if no allowed U-turns will be added
|
{ // Save the true U-turn road to add later if no allowed U-turns will be added
|
||||||
@ -772,12 +765,12 @@ IntersectionView getConnectedRoads(const util::NodeBasedDynamicGraph &graph,
|
|||||||
for (std::size_t index = 0; index < edges_number; ++index)
|
for (std::size_t index = 0; index < edges_number; ++index)
|
||||||
{
|
{
|
||||||
const auto &geometry = edge_geometries[index];
|
const auto &geometry = edge_geometries[index];
|
||||||
const auto remote_node = graph.GetTarget(geometry.edge);
|
const auto remote_node = graph.GetTarget(geometry.eid);
|
||||||
const auto incoming_edge = graph.FindEdge(remote_node, intersection_node);
|
const auto incoming_edge = graph.FindEdge(remote_node, intersection_node);
|
||||||
edge_geometries[edges_number + index] = {incoming_edge,
|
edge_geometries[edges_number + index] = {incoming_edge,
|
||||||
util::bearing::reverse(geometry.initial_bearing),
|
util::bearing::reverse(geometry.initial_bearing),
|
||||||
util::bearing::reverse(geometry.perceived_bearing),
|
util::bearing::reverse(geometry.perceived_bearing),
|
||||||
geometry.length};
|
geometry.segment_length};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enforce ordering of edges by IDs
|
// Enforce ordering of edges by IDs
|
||||||
|
@ -71,11 +71,11 @@ MergableRoadDetector::MergableRoadDetector(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool MergableRoadDetector::CanMergeRoad(const NodeID intersection_node,
|
bool MergableRoadDetector::CanMergeRoad(const NodeID intersection_node,
|
||||||
const IntersectionShapeData &lhs,
|
const IntersectionEdgeGeometry &lhs,
|
||||||
const IntersectionShapeData &rhs) const
|
const IntersectionEdgeGeometry &rhs) const
|
||||||
{
|
{
|
||||||
// roads should be somewhat close
|
// roads should be somewhat close
|
||||||
if (angularDeviation(lhs.bearing, rhs.bearing) > MERGABLE_ANGLE_DIFFERENCE)
|
if (angularDeviation(lhs.perceived_bearing, rhs.perceived_bearing) > MERGABLE_ANGLE_DIFFERENCE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const auto &lhs_edge = node_based_graph.GetEdgeData(lhs.eid);
|
const auto &lhs_edge = node_based_graph.GetEdgeData(lhs.eid);
|
||||||
@ -126,7 +126,7 @@ bool MergableRoadDetector::IsDistinctFrom(const MergableRoadData &lhs,
|
|||||||
const MergableRoadData &rhs) const
|
const MergableRoadData &rhs) const
|
||||||
{
|
{
|
||||||
// needs to be far away
|
// needs to be far away
|
||||||
if (angularDeviation(lhs.bearing, rhs.bearing) > MERGABLE_ANGLE_DIFFERENCE)
|
if (angularDeviation(lhs.perceived_bearing, rhs.perceived_bearing) > MERGABLE_ANGLE_DIFFERENCE)
|
||||||
return true;
|
return true;
|
||||||
else // or it cannot have the same name
|
else // or it cannot have the same name
|
||||||
return !HaveIdenticalNames(
|
return !HaveIdenticalNames(
|
||||||
@ -201,7 +201,7 @@ bool MergableRoadDetector::IsNarrowTriangle(const NodeID intersection_node,
|
|||||||
SelectStraightmostRoadByNameAndOnlyChoice selector(
|
SelectStraightmostRoadByNameAndOnlyChoice selector(
|
||||||
node_data_container.GetAnnotation(node_based_graph.GetEdgeData(lhs.eid).annotation_data)
|
node_data_container.GetAnnotation(node_based_graph.GetEdgeData(lhs.eid).annotation_data)
|
||||||
.name_id,
|
.name_id,
|
||||||
lhs.bearing,
|
lhs.perceived_bearing,
|
||||||
/*requires entry=*/false,
|
/*requires entry=*/false,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
@ -316,7 +316,7 @@ bool MergableRoadDetector::IsCircularShape(const NodeID intersection_node,
|
|||||||
SelectStraightmostRoadByNameAndOnlyChoice selector(
|
SelectStraightmostRoadByNameAndOnlyChoice selector(
|
||||||
node_data_container.GetAnnotation(node_based_graph.GetEdgeData(edge_id).annotation_data)
|
node_data_container.GetAnnotation(node_based_graph.GetEdgeData(edge_id).annotation_data)
|
||||||
.name_id,
|
.name_id,
|
||||||
lhs.bearing,
|
lhs.perceived_bearing,
|
||||||
/*requires_entry=*/false,
|
/*requires_entry=*/false,
|
||||||
false);
|
false);
|
||||||
graph_walker.TraverseRoad(intersection_node, edge_id, accumulator, selector);
|
graph_walker.TraverseRoad(intersection_node, edge_id, accumulator, selector);
|
||||||
@ -372,7 +372,7 @@ bool MergableRoadDetector::HaveSameDirection(const NodeID intersection_node,
|
|||||||
const MergableRoadData &lhs,
|
const MergableRoadData &lhs,
|
||||||
const MergableRoadData &rhs) const
|
const MergableRoadData &rhs) const
|
||||||
{
|
{
|
||||||
if (angularDeviation(lhs.bearing, rhs.bearing) > MERGABLE_ANGLE_DIFFERENCE)
|
if (angularDeviation(lhs.perceived_bearing, rhs.perceived_bearing) > MERGABLE_ANGLE_DIFFERENCE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Find a coordinate following a road that is far away
|
// Find a coordinate following a road that is far away
|
||||||
@ -388,7 +388,7 @@ bool MergableRoadDetector::HaveSameDirection(const NodeID intersection_node,
|
|||||||
SelectStraightmostRoadByNameAndOnlyChoice selector(
|
SelectStraightmostRoadByNameAndOnlyChoice selector(
|
||||||
node_data_container.GetAnnotation(node_based_graph.GetEdgeData(edge_id).annotation_data)
|
node_data_container.GetAnnotation(node_based_graph.GetEdgeData(edge_id).annotation_data)
|
||||||
.name_id,
|
.name_id,
|
||||||
lhs.bearing,
|
lhs.perceived_bearing,
|
||||||
/*requires_entry=*/false,
|
/*requires_entry=*/false,
|
||||||
true);
|
true);
|
||||||
graph_walker.TraverseRoad(intersection_node, edge_id, accumulator, selector);
|
graph_walker.TraverseRoad(intersection_node, edge_id, accumulator, selector);
|
||||||
|
@ -175,7 +175,7 @@ operator()(const NodeID /*nid*/,
|
|||||||
((intersection.size() == 2 ||
|
((intersection.size() == 2 ||
|
||||||
intersection.findClosestTurn(STRAIGHT_ANGLE) == min_element) &&
|
intersection.findClosestTurn(STRAIGHT_ANGLE) == min_element) &&
|
||||||
angularDeviation(min_element->angle, STRAIGHT_ANGLE) < NARROW_TURN_ANGLE) &&
|
angularDeviation(min_element->angle, STRAIGHT_ANGLE) < NARROW_TURN_ANGLE) &&
|
||||||
angularDeviation(initial_bearing, min_element->bearing) < NARROW_TURN_ANGLE;
|
angularDeviation(initial_bearing, min_element->perceived_bearing) < NARROW_TURN_ANGLE;
|
||||||
|
|
||||||
if (has_valid_angle)
|
if (has_valid_angle)
|
||||||
return (*min_element).eid;
|
return (*min_element).eid;
|
||||||
|
@ -232,12 +232,12 @@ void annotateTurns(const util::NodeBasedDynamicGraph &node_based_graph,
|
|||||||
OSRM_ASSERT(turn != intersection.end(),
|
OSRM_ASSERT(turn != intersection.end(),
|
||||||
node_coordinates[intersection_node]);
|
node_coordinates[intersection_node]);
|
||||||
|
|
||||||
buffer->continuous_turn_data.push_back(
|
buffer->continuous_turn_data.push_back(guidance::TurnData{
|
||||||
guidance::TurnData{turn->instruction,
|
turn->instruction,
|
||||||
turn->lane_data_id,
|
turn->lane_data_id,
|
||||||
entry_class_id,
|
entry_class_id,
|
||||||
guidance::TurnBearing(intersection[0].bearing),
|
guidance::TurnBearing(intersection[0].perceived_bearing),
|
||||||
guidance::TurnBearing(turn->bearing)});
|
guidance::TurnBearing(turn->perceived_bearing)});
|
||||||
|
|
||||||
// when turning off a a via-way turn restriction, we need to not only
|
// when turning off a a via-way turn restriction, we need to not only
|
||||||
// handle the normal edges for the way, but also add turns for every
|
// handle the normal edges for the way, but also add turns for every
|
||||||
@ -271,8 +271,9 @@ void annotateTurns(const util::NodeBasedDynamicGraph &node_based_graph,
|
|||||||
turn->instruction,
|
turn->instruction,
|
||||||
turn->lane_data_id,
|
turn->lane_data_id,
|
||||||
entry_class_id,
|
entry_class_id,
|
||||||
guidance::TurnBearing(intersection[0].bearing),
|
guidance::TurnBearing(
|
||||||
guidance::TurnBearing(turn->bearing)});
|
intersection[0].perceived_bearing),
|
||||||
|
guidance::TurnBearing(turn->perceived_bearing)});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -280,8 +281,9 @@ void annotateTurns(const util::NodeBasedDynamicGraph &node_based_graph,
|
|||||||
turn->instruction,
|
turn->instruction,
|
||||||
turn->lane_data_id,
|
turn->lane_data_id,
|
||||||
entry_class_id,
|
entry_class_id,
|
||||||
guidance::TurnBearing(intersection[0].bearing),
|
guidance::TurnBearing(
|
||||||
guidance::TurnBearing(turn->bearing)});
|
intersection[0].perceived_bearing),
|
||||||
|
guidance::TurnBearing(turn->perceived_bearing)});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -562,7 +562,8 @@ operator()(const NodeID /*nid*/, const EdgeID source_edge_id, Intersection inter
|
|||||||
const auto candidate_road_target = node_based_graph.GetTarget(candidate_road.eid);
|
const auto candidate_road_target = node_based_graph.GetTarget(candidate_road.eid);
|
||||||
if ((candidate_road_target == main_road_intersection->node) ||
|
if ((candidate_road_target == main_road_intersection->node) ||
|
||||||
(candidate_road_target == node_based_graph.GetTarget(crossing_road.eid) &&
|
(candidate_road_target == node_based_graph.GetTarget(crossing_road.eid) &&
|
||||||
util::bearing::angleBetween(candidate_road.bearing, crossing_road.bearing) <
|
util::bearing::angleBetween(candidate_road.perceived_bearing,
|
||||||
|
crossing_road.perceived_bearing) <
|
||||||
FUZZY_ANGLE_DIFFERENCE &&
|
FUZZY_ANGLE_DIFFERENCE &&
|
||||||
(getTurnDirection(candidate_road.angle) == DirectionModifier::SharpRight ||
|
(getTurnDirection(candidate_road.angle) == DirectionModifier::SharpRight ||
|
||||||
getTurnDirection(candidate_road.angle) == DirectionModifier::SharpLeft)))
|
getTurnDirection(candidate_road.angle) == DirectionModifier::SharpLeft)))
|
||||||
|
@ -20,7 +20,7 @@ classifyIntersection(Intersection intersection, const osrm::util::Coordinate &lo
|
|||||||
std::sort(intersection.begin(),
|
std::sort(intersection.begin(),
|
||||||
intersection.end(),
|
intersection.end(),
|
||||||
[](const ConnectedRoad &left, const ConnectedRoad &right) {
|
[](const ConnectedRoad &left, const ConnectedRoad &right) {
|
||||||
return left.bearing < right.bearing;
|
return left.perceived_bearing < right.perceived_bearing;
|
||||||
});
|
});
|
||||||
|
|
||||||
util::guidance::EntryClass entry_class;
|
util::guidance::EntryClass entry_class;
|
||||||
@ -31,11 +31,12 @@ classifyIntersection(Intersection intersection, const osrm::util::Coordinate &lo
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
DiscreteBearing last_discrete_bearing = util::guidance::BearingClass::getDiscreteBearing(
|
DiscreteBearing last_discrete_bearing = util::guidance::BearingClass::getDiscreteBearing(
|
||||||
std::round(intersection.back().bearing));
|
std::round(intersection.back().perceived_bearing));
|
||||||
for (const auto &road : intersection)
|
for (const auto &road : intersection)
|
||||||
{
|
{
|
||||||
const DiscreteBearing discrete_bearing =
|
const DiscreteBearing discrete_bearing =
|
||||||
util::guidance::BearingClass::getDiscreteBearing(std::round(road.bearing));
|
util::guidance::BearingClass::getDiscreteBearing(
|
||||||
|
std::round(road.perceived_bearing));
|
||||||
if (discrete_bearing == last_discrete_bearing)
|
if (discrete_bearing == last_discrete_bearing)
|
||||||
return false;
|
return false;
|
||||||
last_discrete_bearing = discrete_bearing;
|
last_discrete_bearing = discrete_bearing;
|
||||||
@ -47,8 +48,10 @@ classifyIntersection(Intersection intersection, const osrm::util::Coordinate &lo
|
|||||||
std::size_t number = 0;
|
std::size_t number = 0;
|
||||||
if (canBeDiscretized)
|
if (canBeDiscretized)
|
||||||
{
|
{
|
||||||
if (util::guidance::BearingClass::getDiscreteBearing(intersection.back().bearing) <
|
if (util::guidance::BearingClass::getDiscreteBearing(
|
||||||
util::guidance::BearingClass::getDiscreteBearing(intersection.front().bearing))
|
intersection.back().perceived_bearing) <
|
||||||
|
util::guidance::BearingClass::getDiscreteBearing(
|
||||||
|
intersection.front().perceived_bearing))
|
||||||
{
|
{
|
||||||
intersection.insert(intersection.begin(), intersection.back());
|
intersection.insert(intersection.begin(), intersection.back());
|
||||||
intersection.pop_back();
|
intersection.pop_back();
|
||||||
@ -64,8 +67,8 @@ classifyIntersection(Intersection intersection, const osrm::util::Coordinate &lo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto discrete_bearing_class =
|
auto discrete_bearing_class = util::guidance::BearingClass::getDiscreteBearing(
|
||||||
util::guidance::BearingClass::getDiscreteBearing(std::round(road.bearing));
|
std::round(road.perceived_bearing));
|
||||||
bearing_class.add(std::round(discrete_bearing_class *
|
bearing_class.add(std::round(discrete_bearing_class *
|
||||||
util::guidance::BearingClass::discrete_step_size));
|
util::guidance::BearingClass::discrete_step_size));
|
||||||
++number;
|
++number;
|
||||||
@ -83,7 +86,7 @@ classifyIntersection(Intersection intersection, const osrm::util::Coordinate &lo
|
|||||||
<< util::toOSMLink(location);
|
<< util::toOSMLink(location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bearing_class.add(std::round(road.bearing));
|
bearing_class.add(std::round(road.perceived_bearing));
|
||||||
++number;
|
++number;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user