#openstreetmap #gis #maps

osm-rs

查询OpenStreetMap对象

1个不稳定版本

0.1.0 2024年4月28日

#138 in 地理空间


aeloc 中使用

MIT 许可证

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