2 个版本
0.1.1 | 2021 年 12 月 16 日 |
---|---|
0.1.0 | 2021 年 5 月 19 日 |
#6 in #acquisition
22KB
268 行
gis_puller
这个 Rust 包旨在抽象和实现一个通用的全球地理信息系统(GIS)数据目录和获取功能。
获取的目录将遵循数据提供者派生的结构分离。
为了构建在以下包之上,未来可以用于消费获取的数据等
- gis_loader 将可用于通过此包将这些获取的数据集加载/转换到各种数据存储中
- gis_api 将可用于提供 gRPC API 以消费加载的数据集
包括接口定义在内,所有内容都应视为不稳定。
支持的 GIS 数据源
- 澳大利亚 - 通过 https://data.gov.au/ 消耗 Geoscape
已编目 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,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
贡献
除非您明确声明,否则您有意提交以包含在作品中的任何贡献,根据 Apache-2.0 许可证定义,应按上述方式双许可,不附加任何额外条款或条件。
依赖项
~7–39MB
~630K SLoC