use rapidgeo_distance::LngLat;
use rapidgeo_simplify::{simplify_dp_into, simplify_dp_mask, SimplifyMethod};
fn main() {
let points = vec![
LngLat::new_deg(-122.4194, 37.7749), LngLat::new_deg(-122.0, 37.5), LngLat::new_deg(-121.5, 37.0), LngLat::new_deg(-120.0, 36.0), LngLat::new_deg(-119.0, 35.0), LngLat::new_deg(-118.2437, 34.0522), ];
println!("Original polyline has {} points", points.len());
let mut mask = Vec::new();
simplify_dp_mask(
&points,
50000.0,
SimplifyMethod::GreatCircleMeters,
&mut mask,
);
println!("With 50km tolerance, keep mask: {:?}", mask);
let kept_count = mask.iter().filter(|&&x| x).count();
println!("Keeping {} out of {} points", kept_count, points.len());
let mut simplified = Vec::new();
let count = simplify_dp_into(
&points,
50000.0,
SimplifyMethod::GreatCircleMeters,
&mut simplified,
);
println!("Simplified polyline has {} points:", count);
for (i, point) in simplified.iter().enumerate() {
println!(
" Point {}: ({:.4}, {:.4})",
i + 1,
point.lng_deg,
point.lat_deg
);
}
println!("\nComparing different distance methods:");
for (method_name, method) in [
("Great Circle", SimplifyMethod::GreatCircleMeters),
("ENU Planar", SimplifyMethod::PlanarMeters),
("Raw Euclidean", SimplifyMethod::EuclidRaw),
] {
let mut method_simplified = Vec::new();
let method_count = simplify_dp_into(&points, 50000.0, method, &mut method_simplified);
println!(" {}: {} points kept", method_name, method_count);
}
}