Geolocalização e Mapas em Rust: Visão Geral de Ferramentas e Exemplos de Código
Rust é uma linguagem de programação de sistemas que está sendo cada vez mais usada para criar serviços de alta carga que trabalham com dados espaciais. Graças ao desempenho, segurança de memória e comunidade ativa, o ecossistema Rust oferece várias bibliotecas maduras para trabalhar com geolocalização, mapas e formatos de dados geoespaciais. Neste artigo, examinaremos as principais ferramentas: geo, georust (incluindo gpx e geojson), bem como a integração com bibliotecas de mapeamento via WebAssembly.
1. Biblioteca Principal: geo
A biblioteca geo é o núcleo do ecossistema de computação geoespacial em Rust. Ela fornece tipos de dados (pontos, linhas, polígonos), algoritmos (cálculo de distâncias, área, interseções) e suporte para sistemas de coordenadas populares (WGS84, UTM).
Instalação
# Cargo.toml[dependencies]geo = "0.27"Exemplo: Cálculo da Distância Entre Dois Pontos
use geo::{point, Distance};
fn main() { let moscow = point!(x: 37.6173, y: 55.7558); let london = point!(x: -0.1276, y: 51.5074);
// Distância na esfera (algoritmo de Haversine) let distance = moscow.distance_haversine(&london); println!("Distância de Moscou a Londres: {:.2} km", distance / 1000.0);}A biblioteca suporta:
- Tipos de geometria:
Point,LineString,Polygon,MultiPointe outros. - Algoritmos: bufferização, simplificação de linhas (Ramer-Douglas-Peucker), cálculo de centróide.
- Trabalho com CRS através da crate
proj.
2. Trabalhando com Formatos: GeoJSON e GPX
Para leitura e escrita de dados geoespaciais, são usadas crates separadas do ecossistema georust.
GeoJSON
A crate geojson permite serializar/desserializar GeoJSON — o formato padrão para troca de dados geoespaciais.
use geojson::{Feature, GeoJson, Geometry, Value};use serde_json;
fn main() { let geojson_str = r#"{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [37.6173, 55.7558] }, "properties": { "name": "Moscow" } }"#;
let geojson: GeoJson = geojson_str.parse().unwrap(); if let GeoJson::Feature(feature) = geojson { println!("Geometria: {:?}", feature.geometry); }}GPX (GPS Exchange Format)
A crate gpx é projetada para trabalhar com trilhas e waypoints gravados por dispositivos GPS.
use gpx::read;use std::fs::File;
fn main() { let file = File::open("track.gpx").unwrap(); let gpx = read(file).unwrap();
for track in gpx.tracks { println!("Nome da trilha: {:?}", track.name); for segment in track.segments { for point in segment.points { println!("Ponto: ({:.4}, {:.4})", point.point().x(), point.point().y()); } } }}3. Visualização de Mapas: Leaflet.js via WASM
Para exibir mapas em uma página web, você pode usar Leaflet.js em conjunto com Rust via WebAssembly. Uma abordagem popular é gerar HTML/JavaScript no lado do Rust usando a crate wasm-bindgen e incorporar o mapa via leaflet.js.
Exemplo: Criando um Mapa com um Marcador
// cargo.toml[dependencies]wasm-bindgen = "0.2"
// main.rsuse wasm_bindgen::prelude::*;
#[wasm_bindgen]pub fn init_map() { let window = web_sys::window().unwrap(); let document = window.document().unwrap();
// Cria um div para o mapa let map_div = document.create_element("div").unwrap(); map_div.set_attribute("id", "map").u Também na biblioteca
Planejador de Tarefas em C# (.NET): Quartz.NET, Hangfire e Coravel
Registro de Logs para TypeScript: Biblioteca Winston
Trabalhando com Kafka em TypeScript: biblioteca KafkaJS para Node.js
Migrações de banco de dados em Node.js: Visão geral de ferramentas e exemplos