Geolocalización y mapas en Rust: revisión de bibliotecas y herramientas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations