Swiftpack.co -  raphaelmor/Polyline as Swift Package
Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
Polyline encoder / decoder in swift
.package(url: "https://github.com/raphaelmor/Polyline.git", from: "v5.0.2")

Build Status CocoaPods Swift 5 Licence

Polyline encoder / decoder in Swift

  1. Features
  2. Requirements
  3. Integration
  4. Usage
  5. Notes
  6. Contributors
  7. License


  • Encode a CLLocationCoordinate2D array to a polyline
  • Decode a polyline to an array of CLLocationCoordinate2D
  • Encode a CLLocation array to a polyline
  • Decode a polyline to an array of CLLocation
  • Encode/Decode associated levels (optional)
  • 100% Unit Test Coverage
  • Complete Documentation
  • Continuous integration with Travis CI
  • CocoaPod available
  • Convert to MKPolyline

Planned for future releases

  • Convert to GMSPolyline
  • Example project
  • Filter locations available at a specific level

Planned when support is available :


  • Xcode 11+
  • iOS 10.0+ / Mac OS X 10.12+ / tvOS 10.0+ / watchOS 3.0+ / Linux
  • Swift 5.0


To use this library in your project you can use CocoaPods, Carthage, Swift Package Manager, and/or integrate it manually :


You can integrate Polyline in your Podfile like this:

pod 'Polyline', '~> 5.0'


You can integrate Polyline in your Cartfile like this:

github "raphaelmor/Polyline" ~> 5.0

Swift Package Manager

To integrate Polyline into an application using Swift Package Manager within Xcode:

  1. Go to File ‣ Swift Packages ‣ Add Package Dependency.
  2. Enter https://github.com/raphaelmor/Polyline.git as the package repository and click Next.
  3. Set Rules to Version, Up to Next Major, and enter 5.0.2 as the minimum version requirement. Click Next.

Or to integrate Polyline into another Swift package, add the following package to the dependencies in your Package.swift file:

.package(url: "https://github.com/raphaelmor/Polyline.git", from: "5.0.2")


To install Polyline manually, add Polyline.xcodeproj to an Xcode workspace, then link your application to Polyline.framework.

It is technically possible to install Polyline by adding Polyline.swift and CoreLocation.swift directly to your project, but this approach is not recommended as it may omit important files in the future.


Polyline Encoding

Using [CLLocationCoordinate2D] (recommended) :

let coordinates = [CLLocationCoordinate2D(latitude: 40.2349727, longitude: -3.7707443),
CLLocationCoordinate2D(latitude: 44.3377999, longitude: 1.2112933)]

let polyline = Polyline(coordinates: coordinates)
let encodedPolyline: String = polyline.encodedPolyline

// Or for a functional approach :
let encodedPolyline: String = encodeCoordinates(coordinates)

Using [CLLocation] :

let locations = [CLLocation(latitude: 40.2349727, longitude: -3.7707443),
CLLocation(latitude: 44.3377999, longitude: 1.2112933)]

let polyline = Polyline(locations: locations)
let encodedPolyline: String = polyline.encodedPolyline

// Or for a functional approach :
let encodedPolyline: String = encodeLocations(locations)

You can encode levels too :

let levels: [UInt32] = [0,1,2,255]

let polyline = Polyline(coordinates: coordinates, levels: levels)
let encodedLevels: String? = polyline.encodedLevels

// Or for a functional approach :
let encodedLevels: String = encodedLevels(levels)

Polyline Decoding

You can decode to [CLLocationCoordinate2D] (recommended) :

let polyline = Polyline(encodedPolyline: "qkqtFbn_Vui`Xu`l]")
let decodedCoordinates: [CLLocationCoordinate2D]? = polyline.coordinates

// Or for a functional approach :
let coordinates: [CLLocationCoordinate2D]? = decodePolyline("qkqtFbn_Vui`Xu`l]")

You can also decode to [CLLocation] :

let polyline = Polyline(encodedPolyline: "qkqtFbn_Vui`Xu`l]")
let decodedLocations: [CLLocation]? = polyline.locations

// Or for a functional approach :
let locations: [CLLocation]? = decodePolyline("qkqtFbn_Vui`Xu`l]")

You can decode levels too :

let polyline = Polyline(encodedPolyline: "qkqtFbn_Vui`Xu`l]", encodedLevels: "BA")
let decodedLevels: [UInt32]? = polyline.levels

// Or for a functional approach :
let levels: [UInt32]? = decodeLevels("BA")

Polyline Precision

Default precision is 1e5 : 0.12345 (5 digit precision used by Google), but you can specify your own precision in all API methods (and functions).

// OSRM uses a 6 digit precision
let polyline = Polyline(encodedPolyline: "ak{hRak{hR", precision: 1e6)


This library tries to have consistent results with polylines generated by the Google Maps iOS SDK. The online tool for encoding polylines has some minor inconsistencies regarding rounding (for example, 0.000015 is rounded to 0.00002 for latitudes, but 0.00001 for longitudes).

This codes tries to adhere to the GitHub Swift Style Guide



Polyline is released under an MIT license. See LICENSE.txt for more information.


Stars: 233
Last commit: 19 weeks ago

Ad: Job Offers

iOS Software Engineer @ Perry Street Software
Perry Street Software is Jack’d and SCRUFF. We are two of the world’s largest gay, bi, trans and queer social dating apps on iOS and Android. Our brands reach more than 20 million members worldwide so members can connect, meet and express themselves on a platform that prioritizes privacy and security. We invest heavily into SwiftUI and using Swift Packages to modularize the codebase.

Release Notes

38 weeks ago

Changes since v5.0.1:

  • Fixed undefined behavior and random crashes when calling the decodePolyline(_:precision:) function on Linux. (#71)

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API