#uri #parser #geolocation #uniform-resource #latitude-longitude #resources #rfc5870

geo-uri

用于解析和生成地理定位的统一资源标识符(geo URIs)的crate。

5个版本

0.2.2 2024年4月3日
0.2.1 2023年3月11日
0.2.0 2022年10月1日
0.1.1 2022年9月30日
0.1.0 2022年9月30日

#396解析器实现

Download history 50/week @ 2024-04-22 217/week @ 2024-04-29 197/week @ 2024-05-06 51/week @ 2024-05-13 82/week @ 2024-05-20 57/week @ 2024-05-27 36/week @ 2024-06-03 82/week @ 2024-06-10 51/week @ 2024-06-17 59/week @ 2024-06-24 197/week @ 2024-07-01 208/week @ 2024-07-08 360/week @ 2024-07-15 120/week @ 2024-07-22 209/week @ 2024-07-29 123/week @ 2024-08-05

828 每月下载

MIT 许可证

40KB
665

geo-uri-rs

一个根据IEEE RFC 5870 设计的用于地理定位统一资源标识符(geo URIs)的Rust crate。此crate支持按照正确格式解析和生成geo URIs。其解析器目前比提议的标准更为宽松。

它支持由纬度和经度指定的地理位置,但也可选地支持高度和不确定半径。目前唯一支持的坐标参考系统是 WGS-84

使用方法

只需运行以下命令即可将此库添加到项目中

$ cargo add geo-uri
    Updating crates.io index
      Adding geo-uri vX.Y.Z to dependencies.

解析

使用字符串上的 TryFrom 特性或 parse 方法将geo URI字符串解析为 GeoUri 结构体

use geo_uri::GeoUri;

let geo_uri = GeoUri::try_from("geo:52.107,5.134,3.6;u=1000").expect("valid geo URI");
assert_eq!(geo_uri.latitude(), 52.107);
assert_eq!(geo_uri.longitude(), 5.134);
assert_eq!(geo_uri.altitude(), Some(3.6));
assert_eq!(geo_uri.uncertainty(), Some(1000.0));

let geo_uri: GeoUri = "geo:52.107,5.134;u=2000.0".parse().expect("valid geo URI");
assert_eq!(geo_uri.latitude(), 52.107);
assert_eq!(geo_uri.longitude(), 5.134);
assert_eq!(geo_uri.altitude(), None);
assert_eq!(geo_uri.uncertainty(), Some(2000.0));

也可以直接调用parse函数

use geo_uri::GeoUri;

let geo_uri = GeoUri::parse("geo:52.107,5.134,3.6").expect("valid geo URI");
assert_eq!(geo_uri.latitude(), 52.107);
assert_eq!(geo_uri.longitude(), 5.134);
assert_eq!(geo_uri.altitude(), Some(3.6));
assert_eq!(geo_uri.uncertainty(), None);

生成

使用 GeoUriBuilder 构建一个 GeoUri 结构体。然后,使用 ToStringDisplay 特性生成geo URI字符串

use geo_uri::GeoUri;

let geo_uri = GeoUri::builder()
    .latitude(52.107)
    .longitude(5.134)
    .uncertainty(1_000.0)
    .build()
    .unwrap();

assert_eq!(
    geo_uri.to_string(),
    String::from("geo:52.107,5.134;u=1000")
);
assert_eq!(
    format!("{geo_uri}"),
    String::from("geo:52.107,5.134;u=1000")
);

也可以使用 TryFrom 特性从坐标元组中构建一个 GeoUri 结构体

use geo_uri::GeoUri;

let geo_uri = GeoUri::try_from((52.107, 5.134)).expect("valid coordinates");
let geo_uri = GeoUri::try_from((52.107, 5.134, 3.6)).expect("valid coordinates");

特性: url

您可以通过启用 url 特性将 Url 结构体从 url crate转换。

首先在您的 Cargo.toml 中启用特性

geo-uri = { version = "X.Y.Z", features = ["url"] }

然后您可以这样做

use geo_uri::GeoUri;
use url::Url;

let url = Url::parse("geo:52.107,5.134,3.6").expect("valid URL");
let geo_uri = GeoUri::try_from(&url).expect("valid geo URI");
let geo_url = Url::from(geo_uri);

assert_eq!(url, geo_url);

请注意,总是可以将一个 GeoUri 转换为 Url,但反之则不总是成立!这是因为“geo:” URI 方案后面的坐标和参数的格式可能无效!

特性: serde

如果您启用了 serde 特性,GeoUri 将实现 serde::Serializeserde::Deserialize。有关更多信息,请参阅 serde 文档。

geo-uri = { version = "X.Y.Z", features = ["serde"] }

许可证

geo-uri-rs 采用了 MIT 许可证(请参阅 LICENSE 文件或 http://opensource.org/licenses/MIT)。

依赖

~0.8–1.6MB
~37K SLoC