Swiftpack.co -  mapbox/turf-swift as Swift Package
Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
A Swift language port of Turf.js.
.package(url: "https://github.com/mapbox/turf-swift.git", from: "v2.0.0-beta.1")

Turf for Swift

📱iOS     🖥💻macOS     📺tvOS     ⌚️watchOS     Linux     codecov Carthage compatible     CocoaPods     SPM compatible    

A spatial analysis library written in Swift for native iOS, macOS, tvOS, watchOS, and Linux applications, ported from Turf.js.


Turf requires Xcode 9.x and supports the following minimum deployment targets:

  • iOS 10.0 and above
  • macOS 10.12 (Sierra) and above
  • tvOS 10.0 and above
  • watchOS 3.0 and above

Alternatively, you can incorporate Turf into a command line tool without Xcode on any platform that Swift supports, including Linux.

If your project is written in Objective-C, you’ll need to write a compatibility layer between turf-swift and your Objective-C code. If your project is written in Objective-C++, you may be able to use spatial-algorithms as an alternative to Turf.


Although a stable release of this library is not yet available, prereleases are available for installation using any of the popular Swift dependency managers.


To install Turf using CocoaPods:

  1. Specify the following dependency in your Podfile:
    pod 'Turf', '~> 1.2'
  2. Run pod repo update if you haven’t lately.
  3. Run pod install and open the resulting Xcode workspace.
  4. Add import Turf to any Swift file in your application target.


To install Turf using Carthage:

  1. Add the following dependency to your Cartfile:
    github "mapbox/turf-swift" ~> 1.2
  2. Run carthage bootstrap.
  3. Follow the rest of Carthage’s integration instructions. Your application target’s Embedded Frameworks should include Turf.framework.
  4. Add import Turf to any Swift file in your application target.

Swift Package Manager

To install Turf using the Swift Package Manager, add the following package to the dependencies in your Package.swift file:

.package(url: "https://github.com/mapbox/turf-swift.git", from: "1.2.0")

Then import Turf in any Swift file in your module.

Available functionality

This work-in-progress port of Turf.js contains the following functionality:

Turf.js Turf-swift
turf-along LineString.coordinateFromStart(distance:)
turf-area Polygon.area
turf-bearing CLLocationCoordinate2D.direction(to:)
LocationCoordinate2D.direction(to:) on Linux
turf-bezier-spline LineString.bezier(resolution:sharpness:)
turf-boolean-point-in-polygon Polygon.contains(_:ignoreBoundary:)
turf-circle Polygon(center:radius:vertices:)
turf-destination CLLocationCoordinate2D.coordinate(at:facing:)
LocationCoordinate2D.coordinate(at:facing:) on Linux
turf-distance CLLocationCoordinate2D.distance(to:)
LocationCoordinate2D.distance(to:) on Linux
turf-helpers#polygon Polygon(_:)
turf-helpers#lineString LineString(_:)
turf-helpers#degreesToRadians CLLocationDegrees.toRadians()
LocationDegrees.toRadians() on Linux
turf-helpers#radiansToDegrees CLLocationDegrees.toDegrees()
LocationDegrees.toDegrees() on Linux
turf-length LineString.distance(from:to:)
turf-line-intersect intersection(_:_:)
turf-line-slice LineString.sliced(from:to:)
turf-line-slice-along LineString.trimmed(from:distance:)
turf-midpoint mid(_:_:)
turf-nearest-point-on-line LineString.closestCoordinate(to:)
turf-polygon-to-line LineString(_:)
turf-simplify LineString.simplified(tolerance:highestQuality:)
turf-polygon-smooth Polygon.smooth(iterations:)
turf-simplify Polygon.simplified(tolerance:highestQuality:)
LocationDirection.difference(from:) on Linux
LocationDirection.wrap(min:max:) on Linux


turf-swift also contains an experimental GeoJSON encoder/decoder with support for Codable.

// Decode unknown GeoJSON type
let geojson = try! GeoJSON.parse(data)

// Decode known GeoJSON type
let geojson = try! GeoJSON.parse(FeatureCollection.self, from: data)

// Initialize a PointFeature and encode as GeoJSON
let coordinate = CLLocationCoordinate2D(latitude: 0, longitude: 1)
let point = Point(coordinate)
let pointFeature = Feature(geometry: .point(point))
let data = try! JSONEncoder().encode(pointFeature)
let json = String(data: data, encoding: .utf8)

  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [


Stars: 134
Last commit: 3 days 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

8 weeks ago

Changes since v2.0.0-alpha.3:

  • Added Polygon.smooth(iterations:) for polygon smoothing. (#137)
  • Added Polygon.simplify(tolerance:highestQuality) method in both non-mutating and mutating options. (#138)
  • Changed direction type in RadianCoordinate2D.direction(to:) and RadianCoordinate2D.coordinate(at:facing:) to Measurement<UnitAngle>. (#143)
  • Added LocationCoordinate2D.coordinate(at:facing:) with Measurement<UnitAngle> as direction type. (#143)

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