Swift 和 Objective-C 中的 Open Location Code
在十进制度坐标和 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
配置相匹配。