1个不稳定版本
0.1.0 | 2024年4月28日 |
---|
#138 in 地理空间
在 aeloc 中使用
18KB
250 行
osm-rs
查询OpenStreetMap数据库。
使用时请务必小心。 查询OSM可能会轻松占用Overpass服务器。
示例
边界框
use osm_rs::overpass::{BoundingBox, Config};
#[tokio::main]
async fn main() {
let c: Config = Config {
url: "https://overpass-api.de/api/interpreter".to_string(),
timeout: 25,
key: "amenity".to_string(),
val: "cafe".to_string(),
};
let b: BoundingBox = BoundingBox {
xmin: 51.305219521963295,
ymin: -0.7690429687500001,
xmax: 51.82219818336938,
ymax: 0.5273437500000064,
};
let resp = b.search(&c).await.expect("failed query");
}
地理编码
use osm_rs::nominatim::{Config, Geocode};
#[tokio::main]
async fn main() {
let c: Config = Config {
url: "https://nominatim.openstreetmap.org/search".to_string(),
timeout: 25,
};
let g = Geocode {
q: Some("Boston".to_string()),
street: None,
city: None,
county: None,
state: None,
country: None,
postalcode: None,
};
let resp = g.search(&c).await.unwrap();
assert_eq!(resp[0].lat, 42.3554334);
assert_eq!(resp[0].lon, -71.060511);
}
反向地理编码
use osm_rs::nominatim::{Config, ReverseGeocode};
#[tokio::main]
async fn main() {
let c: Config = Config {
url: "https://nominatim.openstreetmap.org/reverse".to_string(),
timeout: 25,
};
let g = ReverseGeocode {
lat: 42.3554334,
lon: -71.060511,
};
let resp = g.search(&c).await.unwrap();
assert_eq!(resp.osm_id, 5331978048);
}
致谢
Roland Olbricht 编写了Overpass解释器,没有它这个工具就不存在。
依赖
~8–19MB
~277K SLoC