osrm-backend/include/engine/routing_algorithms/map_matching.hpp

77 lines
2.4 KiB
C++
Raw Normal View History

#ifndef MAP_MATCHING_HPP
#define MAP_MATCHING_HPP
2014-09-23 12:46:14 -04:00
#include "engine/datafacade/datafacade_base.hpp"
2016-01-02 11:13:44 -05:00
#include "engine/routing_algorithms/routing_base.hpp"
2014-09-23 12:46:14 -04:00
2016-01-02 11:13:44 -05:00
#include "engine/map_matching/hidden_markov_model.hpp"
#include "engine/map_matching/matching_confidence.hpp"
2016-05-27 15:05:04 -04:00
#include "engine/map_matching/sub_matching.hpp"
#include "extractor/profile_properties.hpp"
#include "util/coordinate_calculation.hpp"
#include "util/for_each_pair.hpp"
2014-09-23 12:46:14 -04:00
#include <cstddef>
2014-09-23 12:46:14 -04:00
#include <algorithm>
#include <deque>
2014-09-23 12:46:14 -04:00
#include <iomanip>
#include <memory>
2014-09-23 12:46:14 -04:00
#include <numeric>
#include <utility>
#include <vector>
2014-09-23 12:46:14 -04:00
namespace osrm
{
2016-01-05 10:51:13 -05:00
namespace engine
{
namespace routing_algorithms
2014-09-23 12:46:14 -04:00
{
2015-02-17 06:22:11 -05:00
2015-12-09 16:34:22 -05:00
using CandidateList = std::vector<PhantomNodeWithDistance>;
2015-02-17 06:22:11 -05:00
using CandidateLists = std::vector<CandidateList>;
2016-01-05 10:51:13 -05:00
using HMM = map_matching::HiddenMarkovModel<CandidateLists>;
using SubMatchingList = std::vector<map_matching::SubMatching>;
constexpr static const unsigned MAX_BROKEN_STATES = 10;
static const constexpr double MATCHING_BETA = 10;
constexpr static const double MAX_DISTANCE_DELTA = 2000.;
2014-09-23 12:46:14 -04:00
// implements a hidden markov model map matching algorithm
class MapMatching final : public BasicRoutingInterface
2014-09-23 12:46:14 -04:00
{
using super = BasicRoutingInterface;
2014-09-23 12:46:14 -04:00
using QueryHeap = SearchEngineData::QueryHeap;
SearchEngineData &engine_working_data;
map_matching::EmissionLogProbability default_emission_log_probability;
map_matching::TransitionLogProbability transition_log_probability;
map_matching::MatchingConfidence confidence;
extractor::ProfileProperties m_profile_properties;
2014-09-23 12:46:14 -04:00
unsigned GetMedianSampleTime(const std::vector<unsigned> &timestamps) const;
2014-09-23 12:46:14 -04:00
public:
2016-10-05 06:33:58 -04:00
MapMatching(SearchEngineData &engine_working_data, const double default_gps_precision)
: engine_working_data(engine_working_data),
default_emission_log_probability(default_gps_precision),
transition_log_probability(MATCHING_BETA)
2014-09-23 12:46:14 -04:00
{
}
SubMatchingList
operator()(const std::shared_ptr<const datafacade::BaseDataFacade> facade,
const CandidateLists &candidates_list,
const std::vector<util::Coordinate> &trace_coordinates,
const std::vector<unsigned> &trace_timestamps,
const std::vector<boost::optional<double>> &trace_gps_precision) const;
2014-09-23 12:46:14 -04:00
};
2016-01-05 10:51:13 -05:00
}
}
}
//[1] "Hidden Markov Map Matching Through Noise and Sparseness"; P. Newson and J. Krumm; 2009; ACM
// GIS
2014-09-23 12:46:14 -04:00
#endif /* MAP_MATCHING_HPP */