#timezone #geospatial #time #zone #api-version #cli

bin+lib rtz

一个通过二进制、库或服务器轻松处理地理查找的工具

13 个版本

0.7.0 2024年8月15日
0.5.3 2023年8月4日
0.4.3 2023年7月26日
0.3.2 2023年7月22日
0.1.0 2023年7月20日

命令行工具 中排名第 2387

MIT 许可证

145KB
2.5K SLoC

Build and Test codecov Version Crates.io GitHub all releases npm Documentation Rust License:MIT

rtz

一个独立的地理查找库/二进制/服务器,适用于 Rust / JS (通过 WASM) (免费服务器:tz.twitchax.com),使用来自 Natural EarthOpenStreetMap 数据集的数据。

免费服务器

服务器部署在全球四个地区,可在 tz.twitchax.com 访问。每个地区目前能够支持约 8,000 RPS,部署在以下地区:sea、iad、ams、hkg。

此外,服务器现在将尝试在 API 版本中不破坏向后兼容性。这意味着服务器将(尝试)不更改给定 API 版本的响应格式,将(尝试)不删除响应中的任何字段。这并不意味着服务器不会向响应中添加字段,但它将(尝试)不删除它们。

请求形式为 http://tz.twitchax.com/api/v1/osm/tz/{lng}/{lat}。您还可以查看 API 文档 以探索其他端点和版本策略。

示例请求

$ curl http://tz.twitchax.com/api/v1/osm/tz/30/30

[{"id":12,"identifier":"Africa/Cairo","shortIdentifier":"EEST","offset":"UTC+03:00","rawOffset":10800,"rawBaseOffset":7200,"rawDstOffset":3600,"zone":3.0,"currentTime":"2023-07-25T23:39:59.385469400+03:00"}]

HTTPS 也可用,但不建议使用,因为客户端和服务器性能开销大,且没有传输敏感数据。

二进制使用

安装

Windows

$ iwr https://github.com/twitchax/rtz/releases/latest/download/rtz_x86_64-pc-windows-gnu.zip
$ Expand-Archive rtz_x86_64-pc-windows-gnu.zip -DestinationPath C:\Users\%USERNAME%\AppData\Local\Programs\rtz

Mac OS (Apple Silicon)

$ curl -LO https://github.com/twitchax/rtz/releases/latest/download/rtz_aarch64-apple-darwin.zip
$ unzip rtz_aarch64-apple-darwin.zip -d /usr/local/bin
$ chmod a+x /usr/local/bin/rtz

Linux

$ curl -LO https://github.com/twitchax/rtz/releases/latest/download/rtz_x86_64-unknown-linux-gnu.zip
$ unzip rtz_x86_64-unknown-linux-gnu.zip -d /usr/local/bin
$ chmod a+x /usr/local/bin/rtz

Cargo

$ cargo install rtz

NPM

$ npm install --save rtzweb

帮助文档

$ rtz

A tool to easily work with geo lookups via a binary, a library, or a server.

Usage: rtz [COMMAND]

Commands:
  ned           The Natural Earth Data dataset based operations
  osm           The OpenStreetMap dataset based operations
  dump-geojson  Resolve a timezone from a lng,lat pair using the OSM dataset
  serve         Serve the timezone API
  help          Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

解析时区

$ rtz ned tz "-87.62,41.88"

Identifier:      America/Chicago
UTC Offset:      UTC-06:00
Offset Seconds:  -21600
Description:     Canada (almost all of Saskatchewan), Costa Rica, El Salvador, Ecuador (Galapagos Islands), Guatemala, Honduras, Mexico (most), Nicaragua,
DST Description: Canada (Manitoba), United States (Illinois, most of Texas)

使用 Wasmer 运行

wasmer run twitchax/rtz@latest -- ned tz 30,30

运行服务器

$ cargo install rtz --features web
$ rtz serve
$ docker run -it --rm -p 8082 twitchax/rtz

库使用

将其添加到您的 Cargo.toml

[dependencies]
rtz = "*" #choose a version

示例

use rtzlib::NedTimezone;
use rtzlib::CanPerformGeoLookup;

// Query a time zone for a given `(lng,lat)`.
assert_eq!(
    NedTimezone::lookup(-121., 46.)[0]
        .identifier
        .as_ref()
        .unwrap(),
    "America/Los_Angeles"
);

JS 使用

npm 包可在 此处 获取。

首先,像其他任何 ES 模块一样加载模块。

import * as rtz from 'rtzweb/rtzlib.js';

然后,您可以像在 Rust 中一样使用库。

let tz = rtz.getTimezoneNed(-121, 46);
tz.identifier; // "America/Los_Angeles"

功能标志

库和二进制都支持各种功能标志。以下是可用的标志

  • 顶级
    • default= ["cli"]
    • full= ["tz-ned", "tz-osm", "admin-osm", "自包含"]
  • 数据集
    • tz-ned:启用Natural Earth时区数据集及其相关库函数。
    • tz-osm:启用OpenStreetMap时区数据集及其相关库函数。
    • admin-osm:启用OpenStreetMap行政数据集及其相关库函数。
  • 二进制配置
    • cli:启用命令行界面功能,如果只编译库则可以移除。
    • self-contained:启用自包含功能,将数据集嵌入到二进制文件中构建。
    • double-precision:在所有地方使用f64类型用于GeometryPolygon数据类型,比f32更精确但占用更多空间。
    • unsimplified:生成未简化的数据缓存。需要更多的二进制/内存开销,但更精确。使用原始数据集的详细级别。默认情况下,简化到0.0001(通常)的epsilon。
    • extrasimplified:生成额外的简化数据缓存。需要更少的二进制/内存开销,但精度较低。将简化epsilon设置为0.01(通常)。
    • owned-decode:在bincode库的decode功能中使用owned而不是borrow。这通过不直接从二进制映射数据来增加内存占用,但降低了unsafe或黑暗艺术的危险性。
  • 特殊修饰符
    • wasm:启用WASM功能,通过wasm-pack构建NPM包或生成wasi二进制文件所必需。
    • web = ["full"]:启用serve子命令,该命令启动一个Rocket网络服务器,可以响应当地时区请求。
  • 其他注意事项
    • wasm / wasi构建目前与reqwestzip不兼容,因此wasm / wasi构建需要self-contained功能。

数据更新

上次更新时间为2024.08.08。该日期的数据源如下

  • OSM行政数据。此数据从OSM行星文件下载,然后本地处理以提取行政边界。
  • OSM时区数据。此数据从时区边界构建程序的最新生成版本中下载,并由该代码自动处理。
  • NED时区数据。此数据从NED矢量存储库的master分支下载,并由该代码自动处理。

性能

一般

该实现通过使用内置缓存来换取性能,该缓存提高了平均时区解析精度约96倍,最坏情况下的解析精度约10倍。使用OSM数据集时,平均时区查找时间为约 930 ns,使用NED数据集时约为 460 ns。最坏情况下的查找时间约为 6 - 10 μs

Bench

对于随机城市,使用OSM数据集的查找时间约为 1.5 μs,使用NED数据集的查找时间约为 400 ns

Bench

免费服务器

以下是使用1000个并发实现从 (lng,lat) 对到数据中心之一的时区解析的示例性能,达到8000 RPS。

Drill Perf 1

以下是使用100个并发实现从 (lng,lat) 对到数据中心之一的时区解析的示例性能,平均响应时间为 24 ms

Drill Perf 2

测试

cargo test --features web

基准测试

cargo bench --features web

许可证

MIT

依赖项

~12–50MB
~737K SLoC