Turf for Swift

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

一个用 Swift 编写的空间分析库,用于原生 iOS、macOS、tvOS、watchOS、visionOS 和 Linux 应用程序,从 Turf.js 移植而来。

要求

Turf 需要 Xcode 14.1 或更高版本,并支持以下最低部署目标

或者,您可以将 Turf 合并到任何支持Swift的平台(包括 Linux)上的无 Xcode 命令行工具中。

如果您的项目是用 Objective-C 编写的,您需要在 turf-swift 和您的 Objective-C 代码之间编写一个兼容层。 如果您的项目是用 Objective-C++ 编写的,您可以使用 spatial-algorithms 作为 Turf 的替代方案。

安装

可以使用任何流行的 Swift 依赖项管理器安装版本。

CocoaPods

要使用 CocoaPods 安装 Turf

  1. 在您的 Podfile 中指定以下依赖项
    pod 'Turf', '~> 4.0'
  2. 如果您最近没有运行过,请运行 pod repo update
  3. 运行 pod install 并打开生成的 Xcode 工作区。
  4. import Turf 添加到应用程序目标中的任何 Swift 文件。

Carthage

要使用 Carthage 安装 Turf

  1. 将以下依赖项添加到您的 Cartfile
    github "mapbox/turf-swift" ~> 4.0
    
  2. 运行 carthage bootstrap
  3. 按照 Carthage 的其余集成说明进行操作。 您的应用程序目标的嵌入式框架应包含 Turf.framework。
  4. import Turf 添加到应用程序目标中的任何 Swift 文件。

Swift Package Manager

要使用 Swift Package Manager 安装 Turf,请将以下包添加到您的 Package.swift 文件中的 dependencies

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

然后在您模块中的任何 Swift 文件中 import Turf

可用功能

这个正在进行的 Turf.js 移植包含以下功能

Turf.js Turf for Swift
turf-along#along LineString.coordinateFromStart(distance:)
turf-area#area Polygon.area
turf-bearing#bearing CLLocationCoordinate2D.direction(to:)
LocationCoordinate2D.direction(to:) on Linux
RadianCoordinate2D.direction(to:)
turf-bezier-spline#bezierSpline LineString.bezier(resolution:sharpness:)
turf-boolean-point-in-polygon#booleanPointInPolygon Polygon.contains(_:ignoreBoundary:)
turf-center#center Polygon.center
turf-center-of-mass#centerOfMass Polygon.centerOfMass
turf-centroid#centroid Polygon.centroid
turf-circle#circle Polygon(center:radius:vertices:)
turf-destination#destination CLLocationCoordinate2D.coordinate(at:facing:)
LocationCoordinate2D.coordinate(at:facing:) on Linux
RadianCoordinate2D.coordinate(at:facing:)
turf-distance#distance CLLocationCoordinate2D.distance(to:)
LocationCoordinate2D.distance(to:) on Linux
RadianCoordinate2D.distance(to:)
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-helpers#convertLength
turf-helpers#convertArea
Measurement.converted(to:)
turf-length#length LineString.distance(from:to:)
turf-line-intersect#lineIntersect LineString.intersections(with:)
turf-line-slice#lineSlice LineString.sliced(from:to:)
turf-line-slice-along#lineSliceAlong LineString.trimmed(from:to:)
turf-midpoint#midpoint mid(_:_:)
turf-nearest-point-on-line#nearestPointOnLine LineString.closestCoordinate(to:)
turf-polygon-to-line#polygonToLine LineString(_:)
MultiLineString(_:)
turf-simplify#simplify LineString.simplify(tolerance:highestQuality:)
LineString.simplified(tolerance:highestQuality:)
turf-polygon-smooth#polygonSmooth Polygon.smooth(iterations:)
CLLocationDirection.difference(from:)
LocationDirection.difference(from:) on Linux
CLLocationDirection.wrap(min:max:)
LocationDirection.wrap(min:max:) on Linux

GeoJSON

turf-swift 还包含一个 GeoJSON 编码器/解码器,支持 Codable。

// Decode an unknown GeoJSON object.
let geojson = try JSONDecoder().decode(GeoJSONObject.self, from: data)
guard case let .feature(feature) = geojson,
      case let .point(point) = feature.geometry else {
    return
}

// Decode a known GeoJSON object.
let featureCollection = try JSONDecoder().decode(FeatureCollection.self, from: data)

// Initialize a Point feature and encode it 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)
print(json)

/*
{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [
      1,
      0
    ]
  }
}
*/

Well Known Text (WKT)

turf-swift 包含对实现 WKTCodable 协议的几何体的最小 WKT 编码/解码支持。

let wktString = "POINT(123.53 -12.12)"

// Decoding is done using an init method
let point = try? Point(wkt: wktString)
let geometry = try? Geometry(wkt: wktString)

print(point?.coordinates)

// ...

// Geometries then can be serialized using a property getter
let serializedWKTString = point?.wkt
print(serializedWKTString)