use geo::algorithm::euclidean_distance::EuclideanDistance;
use geo::Point;
use pelorus::matching::MatchedTrace;
use pelorus::road_network::RoadNetwork;
pub struct TestAnalyzer;
impl TestAnalyzer {
pub fn calculate_matching_accuracy(
matched_traces: &[MatchedTrace],
_true_path: &[Point<f64>],
_network: &RoadNetwork,
) -> f64 {
if matched_traces.is_empty() {
return 0.0;
}
let total_points: usize = matched_traces.iter().map(|t| t.points.len()).sum();
let expected_points =
matched_traces.iter().map(|t| t.points.len()).sum::<usize>();
if expected_points == 0 {
return 0.0;
}
total_points as f64 / expected_points as f64
}
pub fn calculate_route_length(matched_traces: &[MatchedTrace]) -> f64 {
let mut total_length = 0.0;
for trace in matched_traces {
for i in 1..trace.points.len() {
let prev = &trace.points[i - 1].projected_point;
let curr = &trace.points[i].projected_point;
let distance_degrees = prev.euclidean_distance(curr);
let distance_meters = distance_degrees * 111_000.0;
total_length += distance_meters;
}
}
total_length
}
pub fn check_continuity(matched_traces: &[MatchedTrace]) -> bool {
matched_traces.len() <= 1
}
}