Geolocalización y mapas en Rust: revisión de herramientas y ejemplos de código
Rust es un lenguaje de programación de sistemas que se utiliza cada vez más para crear servicios de alta carga que trabajan con datos espaciales. Gracias a su rendimiento, seguridad de memoria y comunidad activa, el ecosistema de Rust ofrece varias bibliotecas maduras para trabajar con geolocalización, mapas y formatos de datos geoespaciales. En este artículo, revisaremos las herramientas clave: geo, georust (incluyendo gpx y geojson), así como la integración con bibliotecas cartográficas a través de WebAssembly.
1. Biblioteca principal: geo
La biblioteca geo es el núcleo del ecosistema de computación geoespacial en Rust. Proporciona tipos de datos (puntos, líneas, polígonos), algoritmos (cálculo de distancias, áreas, intersecciones) y soporte para sistemas de coordenadas populares (WGS84, UTM).
Instalación
# Cargo.toml[dependencies]geo = "0.27"Ejemplo: cálculo de distancia entre dos puntos
use geo::{point, Distance};
fn main() { let moscow = point!(x: 37.6173, y: 55.7558); let london = point!(x: -0.1276, y: 51.5074);
// Distancia esférica (algoritmo de Haversine) let distance = moscow.distance_haversine(&london); println!("Distancia de Moscú a Londres: {:.2} km", distance / 1000.0);}La biblioteca soporta:
- Tipos de geometría:
Point,LineString,Polygon,MultiPointy otros. - Algoritmos: buffer, simplificación de líneas (Ramer-Douglas-Peucker), cálculo de centroide.
- Trabajo con CRS a través del crate
proj.
2. Trabajo con formatos: GeoJSON y GPX
Para leer y escribir datos geoespaciales se utilizan crates separados del ecosistema georust.
GeoJSON
El crate geojson permite serializar/deserializar GeoJSON, el formato estándar para el intercambio de datos geoespaciales.
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!("Geometría: {:?}", feature.geometry); }}GPX (GPS Exchange Format)
El crate gpx está diseñado para trabajar con tracks y waypoints registrados 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!("Nombre del track: {:?}", track.name); for segment in track.segments { for point in segment.points { println!("Punto: ({:.4}, {:.4})", point.point().x(), point.point().y()); } } }}3. Visualización de mapas: Leaflet.js a través de WASM
Para mostrar mapas en una página web se puede usar Leaflet.js junto con Rust a través de WebAssembly. Un enfoque popular es generar HTML/JavaScript del lado de Rust usando el crate wasm-bindgen e incrustar el mapa mediante leaflet.js.
Ejemplo: creación de un mapa con un 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();
// Creamos un div para el mapa let map_div = document.create_element("div").unwrap(); map_div.set_attribute("id", "map").u