Geolocalización y mapas en Rust: revisión de bibliotecas para trabajar con coordenadas

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 bibliotecas y herramientas

Rust es un lenguaje de programación de sistemas que se utiliza cada vez más para crear aplicaciones de alta carga y seguras, incluidas aquellas que trabajan con datos geoespaciales. En este artículo, revisaremos las principales bibliotecas del ecosistema Rust para trabajar con geolocalización, coordenadas y mapas, y proporcionaremos ejemplos prácticos de código.



1. Biblioteca geo — base de operaciones geométricas

geo es una biblioteca fundamental para trabajar con tipos geométricos: puntos, líneas, polígonos. Proporciona algoritmos para calcular distancias, áreas, intersecciones y zonas de influencia. Se utiliza como base para muchos otros crates.



use geo::{Point, LineString, EuclideanDistance};

fn main() { let p1 = Point::new(37.6173, 55.7558); // Moscú let p2 = Point::new(30.3156, 59.9386); // San Petersburgo

let distance = p1.euclidean_distance(&p2); println!("Distancia euclidiana: {:.2} grados", distance);

// Creación de una línea (ruta) let line = LineString::from(vec![ (37.6173, 55.7558), (30.3156, 59.9386), ]);

// Longitud de la línea en grados let length: f64 = line.euclidean_length(); println!("Longitud de la línea: {:.2} grados", length);}


2. georust — ecosistema para datos geoespaciales

El grupo de crates georust incluye varias bibliotecas complementarias:

  • geo-types — tipos de datos (Point, Polygon, MultiPolygon).
  • geo-algorithms — algoritmos (zonas de influencia, triangulación de Delaunay, envolvente convexa).
  • proj — transformación de sistemas de coordenadas (por ejemplo, de WGS84 a proyección Mercator).
  • gpx — lectura/escritura de archivos GPX (formato de intercambio de tracks GPS).


Ejemplo de transformación de coordenadas con proj:

use proj::Proj;

fn main() { // Creamos un transformador de WGS84 (EPSG:4326) a Web Mercator (EPSG:3857) let from = "EPSG:4326"; let to = "EPSG:3857"; let transform = Proj::new_known_crs(from, to, None).unwrap();

// Coordenadas de Moscú let (x, y) = transform.convert((37.6173, 55.7558)).unwrap(); println!("Web Mercator: x={:.2}, y={:.2}", x, y);}


3. navi — trabajo con mapas de OpenStreetMap

navi es una biblioteca para descargar y procesar datos cartográficos de OpenStreetMap (OSM). Permite extraer carreteras, edificios, puntos de interés (POI) y construir rutas. Para funcionar requiere un archivo de mapa en formato PBF.



use navi::{Map, NodeId, WayId};

fn main() { // Cargamos el mapa desde un archivo PBF let map = Map::from_pbf("moscow.osm.pbf").unwrap();

// Obtenemos todos los nodos en un radio dado let center = (37.6173, 55.7558); let nodes_in_radius: Vec<NodeId> = map.nodes_within_radius(center, 1000.0).unwrap(); println!("Nodos encontrados: {}", nodes_in_radius.len());

// Extraemos las carreteras (highways) let ways: Vec<WayId> = map.ways().filter(|w| w.is_highway()).collect(); println!("Cantidad de carreteras: {}", ways.len());}


4. Visualización de mapas: plotters + geo

Para mostrar mapas en Rust se puede usar la biblioteca plotters junto con geo. Permite dibujar polígonos, líneas y puntos en un lienzo y guardar el resultado en PNG/SVG.



use plotters                    

Recommendations