Géolocalisation et cartes en Rust : aperçu des bibliothèques et exemples pratiques
Rust est un langage de programmation système qui gagne en popularité dans les domaines nécessitant des performances et une sécurité élevées. Le travail avec les données géographiques ne fait pas exception. Si vous développez un service de suivi de transport, un système d'information géographique ou souhaitez simplement ajouter une carte interactive à un site, l'écosystème Rust propose plusieurs solutions matures. Dans cet article, nous examinerons les bibliothèques clés pour la géolocalisation et l'affichage de cartes, et fournirons des exemples pratiques de code.
1. La bibliothèque geo — la base des calculs géométriques
La bibliothèque geo (crates geo-types et geo) fournit les types de données de base : points, lignes, polygones, ainsi que des algorithmes pour travailler avec eux. Elle est le fondement de nombreux autres crates géographiques.
// cargo add geo-types geouse geo_types::{Point, LineString, Polygon};use geo::algorithm::haversine_distance;
fn main() { let moscow = Point::new(37.6173, 55.7558); let spb = Point::new(30.3351, 60.0);
// Distance haversine (en mètres) let dist = haversine_distance(&moscow, &spb); println!("Distance Moscou — Saint-Pétersbourg : {:.0} km", dist / 1000.0);
// Création d'un polygone let coords = vec![ (37.0, 55.0), (38.0, 55.0), (38.0, 56.0), (37.0, 56.0), (37.0, 55.0), ]; let polygon = Polygon::new( LineString::from(coords), vec![], ); println!("Aire du polygone : {:?}", polygon.unsigned_area());}Fonctionnalités :
- Types : Point, Line, LineString, Polygon, MultiPoint, GeometryCollection
- Algorithmes : distance de Haversine, de Vincenty, aire, centroïde, tampon, intersections
- Sérialisation via serde (compatibilité avec GeoJSON)
2. geoutils — travail avec le GPS et les formats de données
Le crate geoutils est spécialisé dans l'analyse et la validation des données GPS. Il sait lire les chaînes NMEA (protocole standard des récepteurs GPS) et convertir les coordonnées.
// cargo add geoutilsuse geoutils::{Location, Distance};
fn main() { // Création d'un point à partir de latitude/longitude let point_a = Location::new(55.7558, 37.6173).unwrap(); let point_b = Location::new(59.9343, 30.3351).unwrap();
// Distance haversine let dist = point_a.distance_to(&point_b).unwrap(); println!("Distance : {} km", dist.as_kilometers());
// Analyse d'une chaîne NMEA (exemple) let nmea = "$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47"; if let Ok(loc) = Location::from_nmea(nmea) { println!("Analyse NMEA : {:?}", loc); }}Caractéristiques :
- Analyse de NMEA-0183 (GPGGA, GPRMC)
- Prise en charge des formats : DMS (degrés/minutes/secondes), degrés décimaux
- Conversion entre systèmes de coordonnées (WGS84, UTM)
3. mapbox-gl-native-rs — rendu de cartes en Rust
Pour afficher des cartes dans des applications de bureau ou embarquées, vous pouvez utiliser le wrapper Rust pour Mapbox GL Native. La bibliothèque permet de rendre des tuiles vectorielles, d'ajouter des marqueurs et des polygones, et de gérer les styles.
// Exemple simplifié — nécessite une configuration de l'environnement// cargo add mapbox-gl-native-rsuse mapbox_gl_native_rs::{Map, MapOptions, Style};
fn main() { let opts = MapOptions::new() .size(800, 600) .center(37.6173, 55.7558) .zoom(10.0);
let mut map = Map::new(opts); map.load_style(Style::from_url("https://demotiles.mapbox.com/style.json"));
// Ajout d'un marqueur map.add_marker(37.6173, 55.7558, "Moscou");
// Rendu dans un tampon (par exemple, en PNG) let img = map.render_to_image(); img.save("map.png").unwrap();}Remarque : Pour fonctionner, nécessite l'installation
Aussi dans la bibliothèque
Apprentissage automatique en C# (.NET) : aperçu des bibliothèques et outils
Traitement d'images en Java : redimensionnement et recadrage (resize, crop)
Traitement JSON en Swift : Codable, JSONSerialization et exemples pratiques
Internationalisation (i18n) en Rust : bibliothèques gettext-rs et fluent-rs