use fastgeotoolkit::{
create_heatmap_from_tracks, find_track_intersections_rust,
cluster_tracks_by_similarity_rust, calculate_coverage_area_rust
};
fn main() {
println!("fastGeoToolkit Route Density Analysis");
println!("====================================");
let tracks = vec![
vec![
[40.7128, -74.0060],
[40.7200, -74.0040],
[40.7280, -74.0020],
[40.7360, -74.0000],
],
vec![
[40.7120, -74.0050],
[40.7190, -74.0030],
[40.7270, -74.0010],
[40.7350, -73.9990],
],
vec![
[40.7250, -74.0080],
[40.7250, -74.0040],
[40.7250, -74.0000],
[40.7250, -73.9960],
],
vec![
[40.7128, -74.0060],
[40.7200, -74.0040],
[40.7280, -74.0020],
],
];
println!("\n1. Route Density Analysis:");
let heatmap = create_heatmap_from_tracks(tracks.clone());
println!("Generated heatmap with {} tracks", heatmap.tracks.len());
println!("Maximum frequency: {}", heatmap.max_frequency);
for (i, track) in heatmap.tracks.iter().enumerate() {
println!(" Track {}: {} points, frequency {}",
i + 1, track.coordinates.len(), track.frequency);
}
println!("\n2. Intersection Detection:");
let intersections = find_track_intersections_rust(&tracks, 0.001); println!("Found {} intersection points", intersections.len());
for (i, (coord, track_indices)) in intersections.iter().enumerate() {
println!(" Intersection {}: [{:.4}, {:.4}] between tracks {:?}",
i + 1, coord[0], coord[1], track_indices);
}
println!("\n3. Track Clustering:");
let clusters = cluster_tracks_by_similarity_rust(&tracks, 0.7); println!("Found {} clusters", clusters.len());
for (i, (representative, members, similarity)) in clusters.iter().enumerate() {
println!(" Cluster {}: {} members, similarity {:.2}",
i + 1, members.len(), similarity);
println!(" Representative track: {} points", representative.len());
println!(" Members: {:?}", members);
}
println!("\n4. Coverage Analysis:");
if let Some((bbox, area_km2, point_count)) = calculate_coverage_area_rust(&tracks) {
println!("Geographic coverage:");
println!(" Bounding box: [{:.4}, {:.4}, {:.4}, {:.4}]",
bbox[0], bbox[1], bbox[2], bbox[3]);
println!(" Area: {:.2} km²", area_km2);
println!(" Total points: {}", point_count);
let density = point_count as f64 / area_km2;
println!(" Point density: {:.1} points/km²", density);
}
println!("\n5. Advanced Analysis:");
analyze_route_popularity(&heatmap);
}
fn analyze_route_popularity(heatmap: &fastgeotoolkit::HeatmapResult) {
let total_tracks = heatmap.tracks.len();
let mut frequency_distribution = std::collections::HashMap::new();
for track in &heatmap.tracks {
*frequency_distribution.entry(track.frequency).or_insert(0) += 1;
}
println!("Route popularity distribution:");
let mut frequencies: Vec<_> = frequency_distribution.keys().collect();
frequencies.sort();
for &freq in frequencies {
let count = frequency_distribution[&freq];
let percentage = (count as f64 / total_tracks as f64) * 100.0;
println!(" Frequency {}: {} tracks ({:.1}%)", freq, count, percentage);
}
let max_freq = heatmap.max_frequency;
let popular_tracks: Vec<_> = heatmap.tracks.iter()
.enumerate()
.filter(|(_, track)| track.frequency == max_freq)
.collect();
println!("\nMost popular routes ({} with max frequency {}):",
popular_tracks.len(), max_freq);
for (i, track) in popular_tracks {
println!(" Track {}: {} points", i + 1, track.coordinates.len());
}
}