Expand description
Fast Google Polyline Algorithm encoding and decoding.
Encodes sequences of geographic coordinates into compact ASCII strings using Google’s Polyline Algorithm. Commonly used for route storage, GPS track compression, and mapping applications.
Uses the LngLat type from rapidgeo-distance and integrates with rapidgeo-simplify
for Douglas-Peucker
simplification.
§Coordinate System
All coordinates use longitude, latitude ordering (x, y convention).
§Examples
§Basic Encoding and Decoding
use rapidgeo_polyline::{encode, decode};
use rapidgeo_distance::LngLat;
// Google's test vector
let coords = vec![
LngLat::new_deg(-120.2, 38.5),
LngLat::new_deg(-120.95, 40.7),
LngLat::new_deg(-126.453, 43.252),
];
let encoded = encode(&coords, 5)?;
assert_eq!(encoded, "_p~iF~ps|U_ulLnnqC_mqNvxq`@");
let decoded = decode(&encoded, 5)?;
assert_eq!(coords.len(), decoded.len());§Polyline Simplification with Douglas-Peucker
use rapidgeo_polyline::{encode, encode_simplified, simplify_polyline};
use rapidgeo_simplify::SimplifyMethod;
use rapidgeo_distance::LngLat;
// Detailed GPS track with close points
let gps_track = vec![
LngLat::new_deg(-122.0, 37.0),
LngLat::new_deg(-122.001, 37.001), // Very close point
LngLat::new_deg(-122.002, 37.002), // Very close point
LngLat::new_deg(-122.1, 37.1), // Significant change
];
// Encode with 10m simplification tolerance
let simplified = encode_simplified(
&gps_track,
10.0, // meters tolerance
SimplifyMethod::GreatCircleMeters,
5
)?;
// Or simplify an existing polyline
let original = encode(&gps_track, 5)?;
let simplified_existing = simplify_polyline(
&original,
10.0,
SimplifyMethod::GreatCircleMeters,
5
)?;§Batch Operations (Parallel Processing)
#[cfg(feature = "batch")]
use rapidgeo_polyline::batch::{encode_batch, encode_simplified_batch};
use rapidgeo_simplify::SimplifyMethod;
use rapidgeo_distance::LngLat;
let routes = vec![
vec![LngLat::new_deg(-120.2, 38.5), LngLat::new_deg(-120.95, 40.7)],
vec![LngLat::new_deg(-126.453, 43.252), LngLat::new_deg(-122.4194, 37.7749)],
];
#[cfg(feature = "batch")]
{
// Parallel encoding (beneficial for >100 routes)
let encoded_routes = encode_batch(&routes, 5)?;
// Parallel encoding with simplification
let simplified_routes = encode_simplified_batch(
&routes,
1000.0, // 1km tolerance
SimplifyMethod::GreatCircleMeters,
5
)?;
}§Precision Levels
- 5: ~1 meter accuracy, standard for most mapping applications
- 6: ~10 centimeter accuracy, used for high-precision applications
Valid range: 1-11
Modules§
- batch
- Batch operations for encoding and decoding multiple polylines in parallel.
Structs§
- LngLat
- A geographic coordinate in decimal degrees.
Enums§
- Polyline
Error - Errors that can occur during polyline encoding or decoding operations.
Functions§
- decode
- Decodes a polyline string into a sequence of coordinates using Google’s Polyline Algorithm.
- encode
- Encodes a sequence of coordinates into a polyline string using Google’s Polyline Algorithm.
- encode_
simplified - Encodes coordinates directly to a simplified polyline string.
- simplify_
coordinates - Simplifies a coordinate sequence using the Douglas-Peucker algorithm.
- simplify_
polyline - Simplifies a polyline string using the Douglas-Peucker algorithm.
Type Aliases§
- Polyline
Result - Result type for polyline operations.