Swift版的Turf
使用 Swift 编写的空间分析库,适用于原生 iOS、macOS、tvOS、watchOS 和 Linux 应用程序,移植自 Turf.js。
需求
Turf 需要 Xcode 12.0 或更高版本,并支持以下最低部署目标
- iOS 10.0 及以上
- macOS 10.12(Sierra)及以上
- tvOS 10.0 及以上
- watchOS 3.0 及以上
或者,您可以将 Turf 集成到任何平台的命令行工具中,包括 Linux,而无需 Xcode。
如果您的项目是用 Objective-C 编写的,您需要在 turf-swift 和您的 Objective-C 代码之间编写兼容层。如果您的项目是用 Objective-C++ 编写的,您可以使用 spatial-algorithms 作为 Turf 的替代方案。
安装
尽管本库的稳定版本尚未发布,但可以通过任何流行的Swift依赖关系管理器安装预发布版本。
CocoaPods
使用 CocoaPods 安装 Turf
- 在您的 Podfile 中指定以下依赖
pod 'Turf', '~> 2.4'
- 如果您尚未执行,请运行
pod repo update
- 运行
pod install
并打开生成的 Xcode 工作空间 - 将
import Turf
添加到应用程序目标的任何 Swift 文件中
Carthage
使用 Carthage 安装 Turf
- 将以下依赖添加到您的 Cartfile
github "mapbox/turf-swift" ~> 2.4
- 运行
carthage bootstrap
- 遵循Carthage的集成说明。您的应用程序目标应包含 Turf.framework 的嵌入式框架。
- 将
import Turf
添加到应用程序目标的任何 Swift 文件中
Swift Package Manager
使用 Swift Package Manager 安装 Turf,请将以下包添加到您的 Package.swift 文件的 dependencies
中
.package(url: "https://github.com/mapbox/turf-swift.git", from: "2.4.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 LinuxRadianCoordinate2D.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 LinuxRadianCoordinate2D.coordinate(at:facing:) |
turf-distance#distance | CLLocationCoordinate2D.distance(to:) LocationCoordinate2D.distance(to:) 在 Linux 上RadianCoordinate2D.distance(to:) |
turf-helpers#polygon | Polygon(_:) |
turf-helpers#lineString | LineString(_:) |
turf-helpers#degreesToRadians | CLLocationCoordinateDegrees.toRadians() LocationDegrees.toRadians() 在 Linux 上 |
turf-helpers#radiansToDegrees | CLLocationCoordinateDegrees.toDegrees() LocationDegrees.toDegrees() 在 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:) |
— | CLLocationCoordinateDirection.difference(from:) LocationDirection.difference(from:) 在 Linux 上 |
— | CLLocationCoordinateDirection.wrap(min:max:) LocationDirection.wrap(min:max:) 在 Linux 上 |
GeoJSON
turf-swift 还包含支持 Codable 的 GeoJSON 编码/解码器。
// 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
]
}
}
*/