mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-05 04:03:46 +00:00
[traffxml] Fix location matching on dual carriageway roads
Signed-off-by: mvglasow <michael -at- vonglasow.com>
This commit is contained in:
@@ -1406,7 +1406,7 @@ bool IndexRouter::PointsOnEdgesSnapping::FindBestEdges(
|
||||
}
|
||||
|
||||
// Removing all candidates which are fenced off by the road graph (|closestRoads|) from |checkpoint|.
|
||||
return !IsFencedOff(checkpoint, edgeProj, closestRoads);
|
||||
return !m_router.IsFakeEndingSetSimplified() || !IsFencedOff(checkpoint, edgeProj, closestRoads);
|
||||
};
|
||||
|
||||
// Getting closest edges from |closestRoads| if they are correct according to isGood() function.
|
||||
|
||||
@@ -136,6 +136,24 @@ protected:
|
||||
std::shared_ptr<NumMwmIds> numMwmIds, std::unique_ptr<m4::Tree<NumMwmId>> numMwmTree,
|
||||
std::shared_ptr<EdgeEstimator> estimator, DataSource & dataSource);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Whether the set of fake endings generated for the check points is restricted.
|
||||
*
|
||||
* The return value is used internally when snapping checkpoints to edges. If this function
|
||||
* returns true, this instructs the `PointsOnEdgesSnapping` instance to consider only edges which
|
||||
* are not fenced off, i.e. can be reached from the respective checkpoint without crossing any
|
||||
* other edges. If it returns false, this restriction does not apply, and all nearby edges are
|
||||
* considered.
|
||||
*
|
||||
* Restricting the set of fake endings in this manner decreases the options considered for routing
|
||||
* and thus processing time, which is desirable for regular routing and has no side effects.
|
||||
*
|
||||
* The `IndexRouter` implementation always returns true; subclasses may override this method and
|
||||
* return different values.
|
||||
*/
|
||||
virtual bool IsFakeEndingSetSimplified() { return true; }
|
||||
|
||||
private:
|
||||
RouterResultCode CalculateSubrouteJointsMode(IndexGraphStarter & starter,
|
||||
RouterDelegate const & delegate,
|
||||
|
||||
@@ -188,6 +188,31 @@ public:
|
||||
std::unique_ptr<m4::Tree<routing::NumMwmId>> numMwmTree,
|
||||
DataSource & dataSource);
|
||||
protected:
|
||||
/**
|
||||
* @brief Whether the set of fake endings generated for the check points is restricted.
|
||||
*
|
||||
* The return value is used internally when snapping checkpoints to edges. If this function
|
||||
* returns true, this instructs the `PointsOnEdgesSnapping` instance to consider only edges which
|
||||
* are not fenced off, i.e. can be reached from the respective checkpoint without crossing any
|
||||
* other edges. If it returns false, this restriction does not apply, and all nearby edges are
|
||||
* considered.
|
||||
*
|
||||
* Restricting the set of fake endings in this manner decreases the options considered for routing
|
||||
* and thus processing time, which is desirable for regular routing and has no side effects.
|
||||
* For TraFF location matching, simplification has undesirable side effects: if reference points
|
||||
* are located on one side of the road, the other carriageway may not be considered. This would
|
||||
* lead to situations like these:
|
||||
*
|
||||
* --<--<-+<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<==<+-<--<--
|
||||
* -->-->-+>==>==>==>==>==>==>-->-->-->-->-->-->-->-->-->-->-->==>==>==>==>==>==>==>==>+->-->--
|
||||
* *< <*
|
||||
*
|
||||
* (-- carriageway, + junction, < > direction, *< end point, <* start point, == route)
|
||||
*
|
||||
* To avoid this, the `DecoderRouter` implementation always returns false.
|
||||
*/
|
||||
bool IsFakeEndingSetSimplified() override { return false; }
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user