Géolocalisation et cartes en Rust : aperçu des outils et exemples de code
Rust est un langage de programmation système de plus en plus utilisé pour créer des services à forte charge traitant des données spatiales. Grâce à ses performances, sa sécurité mémoire et sa communauté active, l'écosystème Rust propose plusieurs bibliothèques matures pour la géolocalisation, les cartes et les formats de données géographiques. Dans cet article, nous examinons les outils clés : geo, georust (incluant gpx et geojson), ainsi que l'intégration avec des bibliothèques cartographiques via WebAssembly.
1. Bibliothèque principale : geo
La bibliothèque geo est le cœur de l'écosystème de calcul géospatial en Rust. Elle fournit des types de données (points, lignes, polygones), des algorithmes (calcul de distances, surfaces, intersections) et le support des systèmes de coordonnées courants (WGS84, UTM).
Installation
# Cargo.toml[dependencies]geo = "0.27"Exemple : calcul de la distance entre deux points
use geo::{point, Distance};
fn main() { let moscow = point!(x: 37.6173, y: 55.7558); let london = point!(x: -0.1276, y: 51.5074);
// Distance sphérique (algorithme de Haversine) let distance = moscow.distance_haversine(&london); println!("Distance de Moscou à Londres : {:.2} km", distance / 1000.0);}La bibliothèque prend en charge :
- Types de géométries :
Point,LineString,Polygon,MultiPoint, etc. - Algorithmes : bufferisation, simplification de lignes (Ramer-Douglas-Peucker), calcul du centroïde.
- Travail avec les SCR via la crate
proj.
2. Travail avec les formats : GeoJSON et GPX
Pour la lecture et l'écriture de données géographiques, des crates distinctes de l'écosystème georust sont utilisées.
GeoJSON
La crate geojson permet de sérialiser/désérialiser le GeoJSON, un format standard d'échange de données géographiques.
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!("Géométrie : {:?}", feature.geometry); }}GPX (GPS Exchange Format)
La crate gpx est conçue pour travailler avec les traces et les points de cheminement enregistrés par les appareils 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!("Nom de la trace : {:?}", track.name); for segment in track.segments { for point in segment.points { println!("Point : ({:.4}, {:.4})", point.point().x(), point.point().y()); } } }}3. Visualisation de cartes : Leaflet.js via WASM
Pour afficher des cartes sur une page web, vous pouvez utiliser Leaflet.js en combinaison avec Rust via WebAssembly. Une approche courante consiste à générer du HTML/JavaScript côté Rust avec la crate wasm-bindgen et à intégrer la carte via leaflet.js.
Exemple : création d'une carte avec un marqueur
// 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();
// Créer un div pour la carte let map_div = document.create_element("div").unwrap(); map_div.set_attribute("id", "map").u Aussi dans la bibliothèque
Travailler avec XML en Java : DOM, SAX, StAX et JAXB — guide complet
Boost.Filesystem C++ : guide complet avec exemples pratiques
Travailler avec YAML en Java : les bibliothèques SnakeYAML et Jackson
Migrations de bases de données en C++ : aperçu des outils et bibliothèques