OpenLocationCodeFramework 3.0.0

OpenLocationCodeFramework 3.0.0

测试已测试
Lang语言 SwiftSwift
许可证 Apache-2.0
发布最新发布2019年4月
SPM支持 SPM

William Denniss 维护。



  • William Denniss

Swift 和 Objective-C 中的 Open Location Code

Build Status Carthage compatible

在十进制度坐标和 Open Location Codes 之间进行转换。对于给定的参考位置缩短和恢复 Open Location Codes。

这个仓库是 Open Location Code 的 Swift 实现。它支持在 iOS、macOS、tvOS 和 watchOS 上的 Swift 和 Objective-C 项目,以及 Linux 上的 Swift 项目。该主仓库为许多其他语言提供了 Open Location Code 支持。

关于 Open Location Codes

Open Location Codes 是一种短小的 10-11 位字符代码,可以用作替代街道地址。这些代码可以在离线状态下生成和解码,并使用一个减少了字符集的编码方式,最大限度地减少码中包含单词的可能性。

代码可以向附近的地点进行短缩。这意味着在许多情况下,只需代码的四个到七个字符。为了恢复原始代码,不需要相同的地点,只要提供附近的地点即可。

代码表示矩形区域而不是点,代码越长,区域越小。10 位字符的代码表示 13.5x13.5 米的区域(赤道处。11 位字符的代码表示大约 2.8x3.5 米的区域。

使用了两种编码算法。前 10 个字符是字符对,一个用于纬度,一个用于经度,使用 20 进制。每个字符对将码的面积减少一个因子 400。只有偶数长度的码是有意义的,因为奇数长度的长度会有 20:1 的比值。在位置 11,算法发生改变,每个字符从 4x5 网格中选取一个位置。这允许单字符细化。

支持的环境

此库作为iOS、macOS、tvOS和watchOS的Swift和Objective-C Cocoa Framework提供,以及macOS和Linux的纯Swift模块提供。

Swift版本

  • Swift 5.0的Open Location Code for Swift的3.x版本。
  • Swift 4.0的Open Location Code for Swift的2.x版本。
  • Swift 3.2的Open Location Code for Swift的1.x版本已设计,但不再维护。

构建

Cocoa框架

构建框架

xcodebuild -project OpenLocationCode.xcodeproj -scheme OpenLocationCode_iOS -configuration Release
xcodebuild -project OpenLocationCode.xcodeproj -scheme OpenLocationCode_macOS -configuration Release
xcodebuild -project OpenLocationCode.xcodeproj -scheme OpenLocationCode_tvOS -configuration Release
xcodebuild -project OpenLocationCode.xcodeproj -scheme OpenLocationCode_watchOS -configuration Release

或者,如果您已安装 Carthage

carthage build --no-skip-current

测试框架

xcodebuild test -project OpenLocationCode.xcodeproj -scheme OpenLocationCode_macOS -destination 'platform=OS X,arch=x86_64'

Swift模块

构建纯Swift模块

swift build

测试纯Swift模块

swift test

包含Dockerfile以在Linux容器中构建和运行纯Swift模块

docker build .

Swift代码示例

import OpenLocationCode

// Encode a location with default code length.
if let code = OpenLocationCode.encode(latitude: 37.421908,
                                      longitude: -122.084681) {
  print("Open Location Code: \(code)")
}

// Encode a location with specific code length.
if let code10Digit = OpenLocationCode.encode(latitude: 37.421908,
                                             longitude: -122.084681,
                                             codeLength: 10) {
  print("Open Location Code: \(code10Digit)")
}

// Decode a full code:
if let coord = OpenLocationCode.decode("849VCWC8+Q48") {
  print("Center is \(coord.latitudeCenter), \(coord.longitudeCenter)")
}

// Attempt to trim the first characters from a code:
if let shortCode = OpenLocationCode.shorten(code: "849VCWC8+Q48",
                                            latitude: 37.4,
                                            longitude: -122.0) {
  print("Short code: \(shortCode)")
}

// Recover the full code from a short code:
if let fullCode = OpenLocationCode.recoverNearest(shortcode: "CWC8+Q48",
                                                  referenceLatitude: 37.4,
                                                  referenceLongitude: -122.0) {
  print("Recovered full code: \(fullCode)")
}

Objective-C 代码示例

@import OpenLocationCode;

// ...

// Encode a location with default code length.
NSString *code = [OLCConverter encodeLatitude:37.421908
                                    longitude:-122.084681];
NSLog(@"Open Location Code: %@", code);

// Encode a location with specific code length.
NSString *code10Digit = [OLCConverter encodeLatitude:37.421908
                                           longitude:-122.084681
                                          codeLength:10];
NSLog(@"Open Location Code: %@", code10Digit);

// Decode a full code:
OLCArea *coord = [OLCConverter decode:@"849VCWC8+Q48"];
NSLog(@"Center is %.6f, %.6f", coord.latitudeCenter, coord.longitudeCenter);

// Attempt to trim the first characters from a code:
NSString *shortCode = [OLCConverter shortenCode:@"849VCWC8+Q48"
                                       latitude:37.4
                                      longitude:-122.0];
NSLog(@"Short Code: %@", shortCode);

// Recover the full code from a short code:
NSString *recoveredCode = [OLCConverter recoverNearestWithShortcode:@"CWC8+Q48"
                                                  referenceLatitude:37.4
                                                 referenceLongitude:-122.1];
NSLog(@"Recovered Full Code: %@", recoveredCode);

本地测试 CI

要运行 Travis CI 测试,请安装

gem install wwtd
gem install xcpretty

然后运行

wwtd

您的 Xcode 和 macOS 版本需要与 Travis 的 osx_image 配置相匹配。