Geolocalização e Mapas em Rust: Visão Geral de Bibliotecas e Ferramentas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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, MultiPoint e 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

Recommendations