CodableGeoJSON
此 GeoJSON 实现符合 GeoJSON 并设计用于与 Codable
对象一起使用。
此库包括 GeoJSON 模型的动态和静态版本。静态版本在处理预定义的 GeoJSON 响应时很有用。
需求
- iOS 9.0+ / macOS 10.9+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 10.2+
- Swift 5.0+
用法
静态模型
建议在您的项目配置为加载已知结构的数据时使用静态模型。
例如,如果您知道您正在加载一个位于 "FeatureCollection" 中的位置列表,如下所示:
{
"features": [
{
"geometry": {
"coordinates": [
-0.452207,
51.471403
],
"type": "Point"
},
"properties": {
"address": "Longford, Hounslow TW6 1DB, UK",
"name": "Heathrow Airport"
},
"type": "Feature"
}
],
"type": "FeatureCollection"
}
您可以使用 struct
和 typealias
定义模型。
struct LocationProperties: Codable {
let address: String
let name: String
}
typealias LocationFeatureCollection = GeoJSONFeatureCollection<PointGeometry, LocationProperties>
这里的优点是您可以直接访问特定的几何形状及其所有属性,而无需执行任何自省。例如:
let locationFeatures = try JSONDecoder().decode(LocationFeatureCollection.self, from: data)
let firstFeature = locationFeatures.features.first
firstFeature?.geometry.longitude // -0.452207
firstFeature?.properties?.name // "Heathrow Airport"
几何集
几何集按定义是非静态类型的,因为它可以包含不同GeoJSON几何类型的混合数组。因此,您需要手动检查每个数组。(如果有简化此过程的方法,请随时提交PR)
let geometryColection = try JSONDecoder().decode(GeometryCollection.self, from: data)
if geometryColection.geometries.count > 0,
case GeoJSON.Geometry.point(let pointCoordinates) = geometryColection.geometries[0] {
let point = PointGeometry(coordinates: pointCoordinates)
} else {
// Failed to get expected geometry
}
空属性
如果您不希望或不需要功能的所有属性,您可以定义一个空的struct
并将其设置为Properties
模板参数。
struct EmptyProperties: Codable {}
typealias PointFeature = GeoJSONFeature<PointGeometry, EmptyProperties>
这将导致“Feature”对象仅包含一个点坐标。
动态模型
当预期结构未定义或可能改变时,才应使用动态模型。
首先,假设您有一个GeoJSON数据对象。第一步是解码它。
do {
switch try JSONDecoder().decode(GeoJSON.self, from: data) {
case .feature(let feature, _):
handleGeometry(feature.geometry)
case .featureCollection(let featureCollection, _):
for feature in featureCollection.features {
handleGeometry(feature.geometry)
}
case .geometry(let geometry, _):
handleGeometry(geometry)
}
} catch {
// Handle decoding error
}
然后您可以探索提供的不同几何形状。
func handleGeometry(_ geometry: GeoJSONGeometry?) {
guard let geometry = geometry else { return }
switch geometry {
case .point(let coordinates):
break
case .multiPoint(let coordinates):
break
case .lineString(let coordinates):
break
case .multiLineString(let coordinates):
break
case .polygon(let coordinates):
break
case .multiPolygon(let coordinates):
break
case .geometryCollection(let geometries):
for geometry in geometries {
handleGeometry(geometry)
}
}
}
如果您知道要查找的几何类型,您可以直接获取它。
func handleGeometry(_ geometry: GeoJSONGeometry?) {
guard case GeoJSONGeometry.polygon(let coordinates)? = geometry else { return }
displayPolygon(linearRings: coordinates)
}
安装
Swift包管理器
您可以使用Swift包管理器通过在您的Package.swift
文件中添加适当的描述来安装CodableGeoJSON
。
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.package(url: "https://github.com/guykogus/CodableGeoJSON.git", from: "1.2.0")
]
)
接下来,将CodableGeoJSON
添加到您的目标依赖项中,如下所示
.target(
name: "YOUR_TARGET_NAME",
dependencies: [
"CodableGeoJSON",
]
),
然后运行swift package update
。
许可证
CodableGeoJSON适用于MIT许可证。有关更多信息,请参阅LICENSE文件。