تحديد المواقع والخرائط في Rust: نظرة عامة على المكتبات وأمثلة عملية
Rust هي لغة برمجة أنظمة تكتسب شعبية في المجالات التي تتطلب أداءً عاليًا وأمانًا. العمل مع البيانات الجغرافية ليس استثناءً. إذا كنت تطور خدمة لتتبع المركبات، أو نظام معلومات جغرافي، أو ببساطة تريد إضافة خريطة تفاعلية إلى موقعك، فإن نظام Rust البيئي يقدم عدة حلول ناضجة. في هذه المقالة، سنستعرض المكتبات الرئيسية لتحديد المواقع وعرض الخرائط، بالإضافة إلى تقديم أمثلة عملية على الكود.
1. مكتبة geo — أساس الحسابات الهندسية
توفر مكتبة geo (crate geo-types و geo) أنواع البيانات الأساسية: النقاط، الخطوط، المضلعات، بالإضافة إلى الخوارزميات للعمل معها. وهي الأساس للعديد من حزم geo الأخرى.
// 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);
// المسافة حسب صيغة هافرسين (بالأمتار) let dist = haversine_distance(&moscow, &spb); println!("المسافة موسكو — سانت بطرسبرغ: {:.0} كم", dist / 1000.0);
// إنشاء مضلع 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!("مساحة المضلع: {:?}", polygon.unsigned_area());}الإمكانيات:
- الأنواع: Point، Line، LineString، Polygon، MultiPoint، GeometryCollection
- الخوارزميات: مسافة هافرسين، فينسنتي، المساحة، المركز، التوسيع، التقاطعات
- التسلسل عبر serde (التوافق مع GeoJSON)
2. geoutils — العمل مع GPS وتنسيقات البيانات
تتخصص حزمة geoutils في تحليل والتحقق من صحة بيانات GPS. يمكنها قراءة سلاسل NMEA (البروتوكول القياسي لأجهزة استقبال GPS) وتحويل الإحداثيات.
// cargo add geoutilsuse geoutils::{Location, Distance};
fn main() { // إنشاء نقطة من خط العرض/خط الطول let point_a = Location::new(55.7558, 37.6173).unwrap(); let point_b = Location::new(59.9343, 30.3351).unwrap();
// المسافة حسب صيغة هافرسين let dist = point_a.distance_to(&point_b).unwrap(); println!("المسافة: {} كم", dist.as_kilometers());
// تحليل سلسلة NMEA (مثال) 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!("تحليل NMEA: {:?}", loc); }}الميزات:
- تحليل NMEA-0183 (GPGGA، GPRMC)
- دعم التنسيقات: DMS (درجات/دقائق/ثواني)، الدرجات العشرية
- التحويل بين أنظمة الإحداثيات (WGS84، UTM)
3. mapbox-gl-native-rs — عرض الخرائط في Rust
لعرض الخرائط في تطبيقات سطح المكتب أو التطبيقات المضمنة، يمكن استخدام غلاف Rust لمكتبة Mapbox GL Native. تتيح المكتبة عرض المربعات المتجهة، ووضع العلامات والمضلعات، والتحكم في الأنماط.
// مثال مبسط — يتطلب إعداد البيئة// 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"));
// إضافة علامة map.add_marker(37.6173, 55.7558, "موسكو");
// العرض في مخزن مؤقت (مثل PNG) let img = map.render_to_image(); img.save("map.png").unwrap();}ملاحظة: يتطلب العمل تثبيت