# Flexible Polyline encoding
The flexible polyline encoding is a lossy compressed representation of a list of coordinate
pairs or coordinate triples. It achieves that by:
1. Reducing the decimal digits of each value.
2. Encoding only the offset from the previous point.
3. Using variable length for each coordinate delta.
4. Using 64 URL-safe characters to display the result.
The encoding is a variant of [Encoded Polyline Algorithm Format]. The advantage of this encoding
over the original are the following:
* Output string is composed by only URL-safe characters, i.e. may be used without URL encoding
as query parameters.
* Floating point precision is configurable: This allows to represent coordinates with precision
up to microns (5 decimal places allow meter precision only).
* It allows to encode a 3rd dimension with a given precision, which may be a level, altitude,
elevation or some other custom value.
## Specification
See [Specification].
[Encoded Polyline Algorithm Format]: https://developers.google.com/maps/documentation/utilities/polylinealgorithm
[Specification]: https://github.com/heremaps/flexible-polyline#specifications
## Example
```rust
use flexpolyline::{Polyline, Precision};
// encode
let coordinates = vec![
(50.1022829, 8.6982122),
(50.1020076, 8.6956695),
(50.1006313, 8.6914960),
(50.0987800, 8.6875156),
];
let polyline = Polyline::Data2d {
coordinates,
precision2d: Precision::Digits5,
};
let encoded = polyline.encode().unwrap();
assert_eq!(encoded, "BFoz5xJ67i1B1B7PzIhaxL7Y");
// decode
let decoded = Polyline::decode("BFoz5xJ67i1B1B7PzIhaxL7Y").unwrap();
assert_eq!(
decoded,
Polyline::Data2d {
coordinates: vec![
(50.10228, 8.69821),
(50.10201, 8.69567),
(50.10063, 8.69150),
(50.09878, 8.68752)
],
precision2d: Precision::Digits5
}
);
```