Geolokalisierung und Karten in Rust: Überblick über Werkzeuge und Codebeispiele
Rust ist eine systemnahe Programmiersprache, die zunehmend für die Erstellung hochlastiger Dienste verwendet wird, die mit räumlichen Daten arbeiten. Dank der Leistungsfähigkeit, Speichersicherheit und einer aktiven Community bietet das Rust-Ökosystem mehrere ausgereifte Bibliotheken für die Arbeit mit Geolokalisierung, Karten und Geodatenformaten. In diesem Artikel betrachten wir die wichtigsten Werkzeuge: geo, georust (einschließlich gpx und geojson) sowie die Integration mit Kartierungsbibliotheken über WebAssembly.
1. Hauptbibliothek: geo
Die Bibliothek geo ist der Kern des Ökosystems für georäumliche Berechnungen in Rust. Sie bietet Datentypen (Punkte, Linien, Polygone), Algorithmen (Berechnung von Entfernungen, Flächen, Überschneidungen) und Unterstützung für gängige Koordinatensysteme (WGS84, UTM).
Installation
# Cargo.toml[dependencies]geo = "0.27"Beispiel: Berechnung der Entfernung zwischen zwei Punkten
use geo::{point, Distance};
fn main() { let moscow = point!(x: 37.6173, y: 55.7558); let london = point!(x: -0.1276, y: 51.5074);
// Entfernung auf der Kugel (Haversine-Algorithmus) let distance = moscow.distance_haversine(&london); println!("Entfernung von Moskau nach London: {:.2} km", distance / 1000.0);}Die Bibliothek unterstützt:
- Geometrietypen:
Point,LineString,Polygon,MultiPointu.a. - Algorithmen: Pufferung, Linienvereinfachung (Ramer-Douglas-Peucker), Berechnung des Schwerpunkts.
- Arbeit mit CRS über die Crate
proj.
2. Arbeit mit Formaten: GeoJSON und GPX
Zum Lesen und Schreiben von Geodaten werden separate Crates aus dem georust-Ökosystem verwendet.
GeoJSON
Die Crate geojson ermöglicht die Serialisierung/Deserialisierung von GeoJSON – einem Standardformat für den Austausch von Geodaten.
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!("Geometrie: {:?}", feature.geometry); }}GPX (GPS Exchange Format)
Die Crate gpx ist für die Arbeit mit Tracks und Wegpunkten gedacht, die von GPS-Geräten aufgezeichnet wurden.
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!("Track-Name: {:?}", track.name); for segment in track.segments { for point in segment.points { println!("Punkt: ({:.4}, {:.4})", point.point().x(), point.point().y()); } } }}3. Kartenvisualisierung: Leaflet.js über WASM
Zur Anzeige von Karten auf einer Webseite kann Leaflet.js in Verbindung mit Rust über WebAssembly verwendet werden. Ein gängiger Ansatz ist die Generierung von HTML/JavaScript auf der Rust-Seite mit Hilfe der Crate wasm-bindgen und die Einbettung der Karte über leaflet.js.
Beispiel: Erstellen einer Karte mit Marker
// 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();
// Erstelle ein div für die Karte let map_div = document.create_element("div").unwrap(); map_div.set_attribute("id", "map").u Auch in der Bibliothek
CLI-Frameworks für Java: Überblick und Vergleich der besten Tools
Java Management Extensions (JMX) — Überwachung von Java-Anwendungen
E-Mail-Versand mit Kotlin: Bibliotheken, Beispiele und SMTP-Konfiguration