الجغرافيا والخرائط في Rust: نظرة عامة على الأدوات وأمثلة الكود
Rust هي لغة برمجة أنظمة تُستخدم بشكل متزايد لإنشاء خدمات عالية التحميل تعمل مع البيانات المكانية. بفضل الأداء العالي وأمان الذاكرة والمجتمع النشط، تقدم بيئة Rust العديد من المكتبات الناضجة للعمل مع الجغرافيا والخرائط وتنسيقات البيانات الجغرافية. في هذه المقالة، سنستعرض الأدوات الرئيسية: geo، georust (بما في ذلك gpx و geojson)، بالإضافة إلى التكامل مع مكتبات رسم الخرائط عبر WebAssembly.
1. المكتبة الأساسية: geo
مكتبة geo هي جوهر بيئة الحوسبة الجغرافية المكانية في Rust. توفر أنواع البيانات (النقاط، الخطوط، المضلعات)، والخوارزميات (حساب المسافات، المساحات، التقاطعات)، ودعم أنظمة الإحداثيات الشائعة (WGS84، UTM).
التثبيت
# Cargo.toml[dependencies]geo = "0.27"مثال: حساب المسافة بين نقطتين
use geo::{point, Distance};
fn main() { let moscow = point!(x: 37.6173, y: 55.7558); let london = point!(x: -0.1276, y: 51.5074);
// المسافة على الكرة (خوارزمية هافرسين) let distance = moscow.distance_haversine(&london); println!("المسافة من موسكو إلى لندن: {:.2} كم", distance / 1000.0);}تدعم المكتبة:
- أنواع الأشكال الهندسية:
Point،LineString،Polygon،MultiPointوغيرها. - الخوارزميات: التوسيع، تبسيط الخطوط (Ramer-Douglas-Peucker)، حساب النقطة المركزية.
- العمل مع أنظمة الإحداثيات عبر crate
proj.
2. العمل مع التنسيقات: GeoJSON و GPX
لقراءة وكتابة البيانات الجغرافية، تُستخدم crates منفصلة من بيئة georust.
GeoJSON
يسمح crate geojson بتسلسل/إلغاء تسلسل GeoJSON - وهو تنسيق قياسي لتبادل البيانات الجغرافية.
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!("الشكل الهندسي: {:?}", feature.geometry); }}GPX (تنسيق تبادل GPS)
صُمم crate gpx للعمل مع المسارات ونقاط المسار المسجلة بواسطة أجهزة 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!("اسم المسار: {:?}", track.name); for segment in track.segments { for point in segment.points { println!("نقطة: ({:.4}, {:.4})", point.point().x(), point.point().y()); } } }}3. عرض الخرائط: Leaflet.js عبر WASM
لعرض الخرائط على صفحة الويب، يمكن استخدام Leaflet.js مع Rust عبر WebAssembly. النهج الشائع هو إنشاء HTML/JavaScript من جانب Rust باستخدام crate wasm-bindgen وتضمين الخريطة عبر leaflet.js.
مثال: إنشاء خريطة مع علامة
// 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();
// إنشاء div للخريطة let map_div = document.create_element("div").unwrap(); map_div.set_attribute("id", "map").u