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
145KB
2.5K SLoC
rtz
一个独立的地理查找库/二进制/服务器,适用于 Rust / JS (通过 WASM) (免费服务器:tz.twitchax.com),使用来自 Natural Earth 和 OpenStreetMap 数据集的数据。
免费服务器
服务器部署在全球四个地区,可在 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
类型用于Geometry
和Polygon
数据类型,比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
构建目前与reqwest
和zip
不兼容,因此wasm
/wasi
构建需要self-contained
功能。
数据更新
上次更新时间为2024.08.08。该日期的数据源如下
- OSM行政数据。此数据从OSM行星文件下载,然后本地处理以提取行政边界。
- OSM时区数据。此数据从时区边界构建程序的最新生成版本中下载,并由该代码自动处理。
- NED时区数据。此数据从NED矢量存储库的
master
分支下载,并由该代码自动处理。
性能
一般
该实现通过使用内置缓存来换取性能,该缓存提高了平均时区解析精度约96倍,最坏情况下的解析精度约10倍。使用OSM数据集时,平均时区查找时间为约 930 ns
,使用NED数据集时约为 460 ns
。最坏情况下的查找时间约为 6 - 10 μs
。
对于随机城市,使用OSM数据集的查找时间约为 1.5 μs
,使用NED数据集的查找时间约为 400 ns
。
免费服务器
以下是使用1000个并发实现从 (lng,lat)
对到数据中心之一的时区解析的示例性能,达到8000 RPS。
以下是使用100个并发实现从 (lng,lat)
对到数据中心之一的时区解析的示例性能,平均响应时间为 24 ms
。
测试
cargo test --features web
基准测试
cargo bench --features web
许可证
MIT
依赖项
~12–50MB
~737K SLoC