Geolocalização e Mapas em Rust: visão geral das bibliotecas e ferramentas
Rust é uma linguagem de programação de sistemas que está sendo cada vez mais usada para criar aplicações de alta carga e seguras, incluindo aquelas que trabalham com dados geográficos. Neste artigo, veremos as principais bibliotecas do ecossistema Rust para trabalhar com geolocalização, coordenadas e mapas, além de fornecer exemplos práticos de código.
1. Biblioteca geo — base para operações geométricas
geo é uma biblioteca fundamental para trabalhar com tipos geométricos: pontos, linhas, polígonos. Ela fornece algoritmos para cálculo de distâncias, áreas, interseções e zonas de buffer. É usada como base para muitos outros crates.
use geo::{Point, LineString, EuclideanDistance};
fn main() { let p1 = Point::new(37.6173, 55.7558); // Moscou let p2 = Point::new(30.3156, 59.9386); // São Petersburgo
let distance = p1.euclidean_distance(&p2); println!("Distância Euclidiana: {:.2} graus", distance);
// Criando uma linha (rota) let line = LineString::from(vec![ (37.6173, 55.7558), (30.3156, 59.9386), ]);
// Comprimento da linha em graus let length: f64 = line.euclidean_length(); println!("Comprimento da linha: {:.2} graus", length);}2. georust — ecossistema para dados geoespaciais
O grupo de crates georust inclui várias bibliotecas complementares:
geo-types— tipos de dados (Point, Polygon, MultiPolygon).geo-algorithms— algoritmos (buffer, triangulação de Delaunay, envoltória convexa).proj— transformação de sistemas de coordenadas (por exemplo, de WGS84 para projeção de Mercator).gpx— leitura/escrita de arquivos GPX (formato de troca de trilhas GPS).
Exemplo de transformação de coordenadas usando proj:
use proj::Proj;
fn main() { // Criando um transformador de WGS84 (EPSG:4326) para Web Mercator (EPSG:3857) let from = "EPSG:4326"; let to = "EPSG:3857"; let transform = Proj::new_known_crs(from, to, None).unwrap();
// Coordenadas de Moscou let (x, y) = transform.convert((37.6173, 55.7558)).unwrap(); println!("Web Mercator: x={:.2}, y={:.2}", x, y);}3. navi — trabalhando com mapas OpenStreetMap
navi é uma biblioteca para carregar e processar dados cartográficos do OpenStreetMap (OSM). Permite extrair estradas, edifícios, pontos de interesse (POI) e construir rotas. Para funcionar, é necessário um arquivo de mapa no formato PBF.
use navi::{Map, NodeId, WayId};
fn main() { // Carregando o mapa de um arquivo PBF let map = Map::from_pbf("moscow.osm.pbf").unwrap();
// Obtendo todos os nós (nodes) em um raio definido let center = (37.6173, 55.7558); let nodes_in_radius: Vec<NodeId> = map.nodes_within_radius(center, 1000.0).unwrap(); println!("Nós encontrados: {}", nodes_in_radius.len());
// Extraindo estradas (highways) let ways: Vec<WayId> = map.ways().filter(|w| w.is_highway()).collect(); println!("Quantidade de estradas: {}", ways.len());}4. Visualização de mapas: plotters + geo
Para exibir mapas em Rust, você pode usar a biblioteca plotters em conjunto com geo. Ela permite desenhar polígonos, linhas e pontos em uma tela e salvar o resultado em PNG/SVG.
use plotters Também na biblioteca
Rate Limiting em Java: bibliotecas e ferramentas para controle de requisições (Bucket4j, Resilience4j)
Cliente Elasticsearch C++: guia completo para trabalhar com o motor de busca
Envio de SMS em Swift (iOS/macOS): API MessageUI e serviços de terceiros
JavaMail (Jakarta Mail) para Java: guia completo com exemplos