الجغرافيا والخرائط في Rust: نظرة عامة على المكتبات والأدوات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

الجغرافيا والخرائط في 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

توصيات