Géolocalisation et cartes en Rust : aperçu des bibliothèques et outils
Rust est un langage de programmation système de plus en plus utilisé pour créer des applications haute performance et sécurisées, y compris celles qui traitent des données géospatiales. Dans cet article, nous examinerons les principales bibliothèques de l'écosystème Rust pour la géolocalisation, les coordonnées et les cartes, et fournirons des exemples pratiques de code.
1. La bibliothèque geo — fondement des opérations géométriques
geo est une bibliothèque fondamentale pour travailler avec des types géométriques : points, lignes, polygones. Elle fournit des algorithmes pour calculer les distances, les surfaces, les intersections et les zones tampons. Elle est utilisée comme base pour de nombreuses autres 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); // Saint-Pétersbourg
let distance = p1.euclidean_distance(&p2); println!("Distance euclidienne : {:.2} degrés", distance);
// Création d'une ligne (itinéraire) let line = LineString::from(vec![ (37.6173, 55.7558), (30.3156, 59.9386), ]);
// Longueur de la ligne en degrés let length: f64 = line.euclidean_length(); println!("Longueur de la ligne : {:.2} degrés", length);}2. georust — écosystème pour les données géospatiales
Le groupe de crates georust comprend plusieurs bibliothèques complémentaires :
geo-types— types de données (Point, Polygon, MultiPolygon).geo-algorithms— algorithmes (tampon, triangulation de Delaunay, enveloppe convexe).proj— transformation de systèmes de coordonnées (par exemple, de WGS84 à la projection Mercator).gpx— lecture/écriture de fichiers GPX (format d'échange de traces GPS).
Exemple de transformation de coordonnées avec proj :
use proj::Proj;
fn main() { // Création d'un transformateur de WGS84 (EPSG:4326) vers Web Mercator (EPSG:3857) let from = "EPSG:4326"; let to = "EPSG:3857"; let transform = Proj::new_known_crs(from, to, None).unwrap();
// Coordonnées de Moscou let (x, y) = transform.convert((37.6173, 55.7558)).unwrap(); println!("Web Mercator : x={:.2}, y={:.2}", x, y);}3. navi — travail avec les cartes OpenStreetMap
navi est une bibliothèque pour télécharger et traiter des données cartographiques depuis OpenStreetMap (OSM). Elle permet d'extraire des routes, des bâtiments, des points d'intérêt (POI) et de construire des itinéraires. Son utilisation nécessite un fichier cartographique au format PBF.
use navi::{Map, NodeId, WayId};
fn main() { // Chargement de la carte depuis un fichier PBF let map = Map::from_pbf("moscou.osm.pbf").unwrap();
// Obtention de tous les nœuds (nodes) dans un rayon donné let center = (37.6173, 55.7558); let nodes_in_radius: Vec<NodeId> = map.nodes_within_radius(center, 1000.0).unwrap(); println!("Nœuds trouvés : {}", nodes_in_radius.len());
// Extraction des routes (highways) let ways: Vec<WayId> = map.ways().filter(|w| w.is_highway()).collect(); println!("Nombre de routes : {}", ways.len());}4. Visualisation de cartes : plotters + geo
Pour afficher des cartes en Rust, on peut utiliser la bibliothèque plotters en combinaison avec geo. Elle permet de dessiner des polygones, des lignes et des points sur un canevas et d'enregistrer le résultat au format PNG/SVG.
use plotters Aussi dans la bibliothèque
Envoi d'email en C++ : bibliothèques et exemples de code
Génération de PDF en Swift : création de documents pour iOS et macOS
Event Bus et le pattern Observer en JavaScript (Node.js) : implémentation et exemples