#geospatial #layer #geographic #run-time #tasks #polygon #task-execution

bin+lib arcgis_rust

基于 Rust 的地理空间智能库,受 ArcGIS Runtime 启发

4 个版本

0.1.2 2024 年 6 月 1 日
0.1.1-alpha2024 年 5 月 31 日
0.1.0-alpha2024 年 5 月 30 日

地理空间 中排名第 117

Download history 257/week @ 2024-05-28 13/week @ 2024-06-04 2/week @ 2024-06-11 34/week @ 2024-07-02 108/week @ 2024-07-30

每月下载量 108

MIT 许可协议 MIT

24KB
152 行 代码

ArcGIS Runtime in Rust 🗺️

🗺️  _~^~^~_   🔧
\) /  o o  \ (/
  '_   -   _'
  / '-----' \

注意:此运行时仍在开发中,请报告任何错误或问题,以帮助我们使此运行时更加可靠!

欢迎使用 ArcGIS Rust!该项目是一个基于 Rust 的地理空间智能库,受 ArcGIS Runtime 启发。它提供核心地理空间类型、渲染能力和地理处理和定位任务的执行。

目录

简介

该项目旨在提供 Rust 的综合地理空间智能库。它包括

  • 核心地理空间类型(点、多边形、边界框等)
  • 用于管理地理特征的要素层
  • 使用 wgpu 进行地图视图渲染的能力
  • 使用 reqwest 执行地理处理和定位任务的执行

安装

要在项目中使用此库,请将以下内容添加到您的 Cargo.toml

[dependencies]
arcgis_rust = { git = "https://github.com/dfridkin/arcgis-rust-runtime.git" }
geo = "0.23.0"
wgpu = "0.12.0"
winit = "0.26.0"
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

使用

示例

创建和使用地理空间类型

use arcgis_rust::core::geometry::*;
use geo::point;

fn main() {
    let point = point!(x: 1.0, y: 2.0);
    println!("Point: {:?}", point);

    let envelope = Envelope {
        min: point!(x: 0.0, y: 0.0),
        max: point!(x: 10.0, y: 10.0),
    };

    let point_inside = point!(x: 5.0, y: 5.0);
    let point_outside = point!(x: 15.0, y: 15.0);

    println!("Point inside: {}", envelope.contains(&point_inside));
    println!("Point outside: {}", envelope.contains(&point_outside));
}

执行地理处理任务

use arcgis_rust::tasks::geoprocessing::GeoprocessingTask;
use tokio;

#[tokio::main]
async fn main() {
    let geoprocessing_task = GeoprocessingTask {
        url: "https://example.com/arcgis/rest/services/GP/Service".to_string(),
    };

    match geoprocessing_task.execute("parameters").await {
        Ok(result) => println!("Geoprocessing result: {}", result),
        Err(e) => println!("Error: {}", e),
    }
}

API 规范

核心模块

表示具有 x 和 y 坐标的 2D 点。

#[derive(Debug, Clone)]
pub struct Point {
    pub x: f64,
    pub y: f64,
}

边界框

表示由其最小和最大坐标定义的矩形边界框。

#[derive(Debug, Clone)]
pub struct Envelope {
    pub min: Point<f64>,
    pub max: Point<f64>,

    pub fn contains(&self, point: &Point<f64>) -> bool;
}

交集

计算两个几何体的交集。


use arcgis_rust::core::geometry::{Polygon, run_intersection};

let poly1 = polygon![
    (x: 0.0, y: 0.0),
    (x: 10.0, y: 0.0),
    (x: 10.0, y: 10.0),
    (x: 0.0, y: 10.0),
    (x: 0.0, y: 0.0)
];
let poly2 = polygon![
    (x: 5.0, y: 5.0),
    (x: 15.0, y: 5.0),
    (x: 15.0, y: 15.0),
    (x: 5.0, y: 15.0),
    (x: 5.0, y: 5.0)
];
let intersection = run_intersection(&poly1, &poly2);

println!("Intersection: {:?}", intersection);

并集

将多个几何体合并为一个单一几何体。


use arcgis_rust::core::geometry::{Polygon, run_union};

let poly1 = polygon![
    (x: 0.0, y: 0.0),
    (x: 10.0, y: 0.0),
    (x: 10.0, y: 10.0),
    (x: 0.0, y: 10.0),
    (x: 0.0, y: 0.0)
];
let poly2 = polygon![
    (x: 5.0, y: 5.0),
    (x: 15.0, y: 5.0),
    (x: 15.0, y: 15.0),
    (x: 5.0, y: 15.0),
    (x: 5.0, y: 5.0)
];
let union = run_union(&poly1, &poly2);

println!("Union: {:?}", union);

边界

检索几何体的边界。


use arcgis_rust::core::geometry::{Polygon, calculate_boundaries};

let poly = polygon![
    (x: 0.0, y: 0.0),
    (x: 10.0, y: 0.0),
    (x: 10.0, y: 10.0),
    (x: 0.0, y: 10.0),
    (x: 0.0, y: 0.0)
];
let boundaries = calculate_boundaries(&poly);

println!("Boundaries: {:?}", boundaries);

数据模块

要素

表示具有几何和属性的地理要素。


#[derive(Debug, Clone)]
pub struct Feature {
    pub geometry: Geometry<f64>,
    pub attributes: HashMap<String, String>,
}

要素层

管理要素集合。


pub struct FeatureLayer {
    pub features: Vec<Feature>,

    pub fn query(&self, envelope: &Envelope) -> Vec<&Feature>;
}

渲染模块

地图视图

管理地图视图的渲染。


pub struct MapView {
    pub fn new(event_loop: &EventLoop<()>) -> Self;
    pub fn add_layer(&mut self, layer: Box<dyn Layer>);
    pub fn render(&self);
}

用于定义可渲染层的特性。


pub trait Layer {
    fn render(&self);
}

任务模块

地理处理任务

执行地理处理任务。


pub struct GeoprocessingTask {
    pub url: String,

    pub async fn execute(&self, parameters: &str) -> Result<String, reqwest::Error>;
}

定位任务

执行地理编码任务。


pub struct LocatorTask {
    pub url: String,

    pub async fn geocode(&self, address: &str) -> Result<Point<f64>, reqwest::Error>;
}

贡献

我们欢迎贡献,使这个项目更加出色!要贡献,请按照以下步骤操作

Fork the repository.
Create a new branch (git checkout -b feature-branch).
Make your changes.
Commit your changes (git commit -m 'Add new feature').
Push to the branch (git push origin feature-branch).
Open a pull request.

许可协议

本项目采用MIT许可证。详情请参阅LICENSE文件。

编码愉快,愿您的Rust之旅充满快乐和发现!🦀❤️

依赖项

~14–33MB
~501K SLoC