CodableGeoJSON 3.0.0

CodableGeoJSON 3.0.0

Guy Kogus 维护。



  • guykogus

CodableGeoJSON

CocoaPods Compatible Carthage compatible SPM compatible

此 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"
}

您可以使用 structtypealias 定义模型。

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)
}

安装

CocoaPods

要使用CocoaPods将CodableGeoJSON集成到您的Xcode项目中,请在您的Podfile中指定它

pod 'CodableGeoJSON'
Carthage

要使用Carthage将CodableGeoJSON集成到您的Xcode项目中,请在您的Cartfile中指定它

github "guykogus/CodableGeoJSON"
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文件。