#gis #acquisition #catalog

gis_puller

地理信息系统(GIS)数据集获取库

2 个版本

0.1.1 2021 年 12 月 16 日
0.1.0 2021 年 5 月 19 日

#6 in #acquisition

MIT/Apache

22KB
268

gis_puller

CI Crates.io Docs Deps License License MSRV

这个 Rust 包旨在抽象和实现一个通用的全球地理信息系统(GIS)数据目录和获取功能。

获取的目录将遵循数据提供者派生的结构分离。

为了构建在以下包之上,未来可以用于消费获取的数据等

  • gis_loader 将可用于通过此包将这些获取的数据集加载/转换到各种数据存储中
  • gis_api 将可用于提供 gRPC API 以消费加载的数据集

包括接口定义在内,所有内容都应视为不稳定。

支持的 GIS 数据源

已编目 GIS 数据集

  • 郊区/地区边界:澳大利亚(GDA94、GDA2020、GeoJSON)
  • 地址正向/反向查找数据:澳大利亚(GNAF)

另见 DIFFICULTIES.md

环境变量

  • USE_MODE = 环境变量 "default" 与 "development" | "integration" | "production" 运行时配置合并
  • GIS_CONFIG_PATH = GIS 数据源配置文件所在的文件系统路径
  • TEST_DATA_PATH = 从中读取模拟数据的文件系统路径,包括 "replay" 记录

使用方法

使用 Rust Cargo - 需要 cargo-edit

cargo add gis_puller

或手动编辑 Cargo.toml

[dependencies]
gis_puller = "0.1.0"

创建文档

env GIS_CONFIG_PATH=config RUN_MODE=development cargo doc --no-deps --open

使用 replay 或模拟数据源运行测试(包括 doctests 和运行示例)

env GIS_CONFIG_PATH=config TEST_DATA_PATH=test_data RUN_MODE=development cargo test

运行 clippy 以获得额外的 lint

cargo clippy --all-targets --all-features

运行 tarpaulin 以进行代码/示例测试覆盖率

env GIS_CONFIG_PATH=config TEST_DATA_PATH=test_data RUN_MODE=development cargo +nightly tarpaulin --run-types Tests,Doctests,Benchmarks,Examples,Lib,Bins -v

注意:Tarpaulin 需要 +nightly: rustup 工具链安装 nightly

@TODO 二进制包 -- 使用 gis_puller Docker 图像在 shell 中使用,例如使用从 data.gov.au 获取的澳大利亚地区边界数据集

docker run --rm -t -i -e env GIS_PULLER_CONFIGPATH=/gis/etc/gis_puller GIS_PULLER_DATAPATH=/gis/data gis_puller gis_puller pull --all au locality/boundary

或作为库使用

  • TBD: 接口 将在未来出现在 gis_puller::Puller 中

目前,使用 AU 地区/边界数据集,在开发中通过 doctest fetcher_matcher 使用以下内容,通过记录的结果作为模拟回放

mod mocks;
use mocks::http_server;
use httpmock::Method::GET;
use tokio::task;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
  let au_config = task::spawn_blocking(move || {
    gis_puller::settings::Settings::load("au")
  }).await?.unwrap();

  // @TODO: replace this mess with a macro_rules!
  let mut au_fetcher_matcher = (*au_config).fetcher_matcher.clone();

  let mock_server = mocks::http_server::serve().await?;
  let mock_path   = format!("/replay/data.gov.au/api/v0/search/datasets");
  let mock_query  = format!("localities-boundaries");

  let inject_replay = format!("test_data/replay/au/locality_boundaries.json");
  let inject_url = format!("https://127.0.0.1:{}{}", mock_server.port(), &mock_path);
  
  au_fetcher_matcher.rest_url = Some(inject_url);
  au_fetcher_matcher.query = Some(mock_query.clone());

  let mock = mock_server.mock(|when, then| {
    when.method(GET)       
      .path(&mock_path)
      .query_param("query", &mock_query);
    then.status(200)
      .header("Content-Type", "application/json")
      .body_from_file(&inject_replay);
  });

  let catalog = gis_puller::au::fetcher_matcher(&au_fetcher_matcher).await?;

  println!("Catalog = {:#?}", catalog);

  Ok(())
}  

未来接口的草稿


let puller_au = gis_puller::Puller::load('au').await?;

let sources_au = puller_au.sources('locality/boundary').await?;

// make sources_au Iterable for .iter()

sources_au.pull_all('/tmp').await?;
sources_au.pull_one('nsw').await?;

以下功能可以通过 Cargo 启用或禁用

  • 'xxx': 启用 xxx

许可证

根据以下之一许可

贡献

除非您明确声明,否则您有意提交以包含在作品中的任何贡献,根据 Apache-2.0 许可证定义,应按上述方式双许可,不附加任何额外条款或条件。

依赖项

~7–39MB
~630K SLoC