GitHub License CI

GeoProjector

这是一个仅使用 Swift 编写的库,用于计算和绘制地图投影。

目前仍处于早期阶段,存在一些小问题,尚未稳定。

此库的目标

依赖项

此库是 Maparoni 映射相关 Swift 库套件的一部分,并依赖于

用法

安装

如上所述,此库尚未稳定!

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

.package(
  name: "GeoProjector", url: "https://github.com/maparoni/geoprojector", 
  branch: "main" // no tagged versions yet 
)

投影

投影是使用 Projection 协议定义的,该协议定义了预期的 project 方法,以及一些附加信息,例如投影的地图边界的形状。

投影本身可通过 Projections 命名空间(即,一个无 case 枚举)获得,该命名空间提供了不同投影的实现。请注意,这些实现基于弧度,但有各种辅助方法可用于处理 GeoJSON 和以度为单位的坐标。

用法示例

import GeoProjector

let projection = Projections.Orthographic(
  reference: GeoJSON.Position(latitude: 0, longitude: 100)
)
let sydney = GeoJSON.Position(latitude: -33.8, longitude: 151.3)
let projected = projection.point(
  for: sydney, 
  size: .init(width: 100, height: 100) // the maximum size of the canvas
)?.0

请注意,投影点与平台上常见的点对齐,因此 macOS 的 (x: 0, y: 0) 用于左下角地图坐标 (latitude: -180, longitude: -90),而其他平台的 (x: 0, y: 0) 用于左上角地图坐标 (latitude: -180, longitude: 90)

地图 (AppKit)

GeoDrawer 库包含一个名为 GeoMapView 的 NSView 和一个名为 GeoMap 的相应 SwiftUI 视图。您可以使用它们来获取地图视图以在上面绘制内容。

import SwiftUI
import GeoDrawer

struct MyMap: View {

  var body: some View {
    GeoMap(
      contents: try! GeoDrawer.Content.world(),
      projection: Projections.Cassini()
    )
  }
  
}

鸣谢

此仓库中的代码全部由我自己,Adrian Schönig 编写,但如果没有以下宝贵资源的帮助,它不可能如此顺利地完成

许可证

此库在 MIT 许可证 下可用。请根据这些条款随意使用它。

示例 是公共领域,可以自由改编。