Crate rapidgeo_polyline

Crate rapidgeo_polyline 

Source
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§

PolylineError
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§

PolylineResult
Result type for polyline operations.