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

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

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

ابدأ الدورة

الجيولوكيشن والخرائط في C++: المكتبات والأدوات للعمل مع البيانات المكانية



غالبًا ما يتطلب تطوير التطبيقات التي تعمل مع الجيولوكيشن والخرائط في C++ دمج مكتبات متخصصة. على عكس Python مع نظامه البيئي الغني (GeoPandas، Folium)، توفر C++ أدوات منخفضة المستوى ولكنها عالية الأداء. في هذه المقالة، سنستعرض المكتبات والمناهج الرئيسية للعمل مع الإحداثيات وعرض الخرائط والحسابات الجغرافية المكانية في C++.



1. المناهج الأساسية للعمل مع الجيولوكيشن



عادةً ما يتم تنفيذ الجيولوكيشن في C++ من خلال:

  • طلبات HTTP لواجهات API (مثل خدمات الترميز الجغرافي أو الطقس).
  • تحليل بيانات GPS من مسجلات NMEA أو ملفات GPX.
  • الحسابات الرياضية للمسافات (صيغة هافرسين) وتحويل الإحداثيات.


2. مكتبات طلبات HTTP (أساس الترميز الجغرافي)



للحصول على البيانات من خوادم الجيولوكيشن (مثل OpenStreetMap Nominatim)، يلزم العمل مع الشبكة. أفضل خيار لـ C++ هو libcurl.



libcurl

مكتبة متعددة الاستخدامات لنقل البيانات عبر URL. تدعم HTTP/HTTPS وFTP والبروتوكولات الأخرى. مثال على طلب لواجهة API Nominatim للترميز الجغرافي (الحصول على الإحداثيات من العنوان):



#include <curl/curl.h>#include <string>#include <sstream>

// دالة رد الاتصال لكتابة الرد في سلسلة نصيةstatic size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb;}

std::string geocodeAddress(const std::string& address) { CURL *curl = curl_easy_init(); std::string response; if(curl) { std::string url = "https://nominatim.openstreetmap.org/search?q=" + curl_easy_escape(curl, address.c_str(), address.length()) + "&format=json&limit=1"; curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); // مهم: تحديد User-Agent (متطلب Nominatim) curl_easy_setopt(curl, CURLOPT_USERAGENT, "MyCppApp/1.0"); curl_easy_perform(curl); curl_easy_cleanup(curl); } return response; // JSON مع الإحداثيات}


3. عرض الخرائط: MapLibre Native



إذا كنت بحاجة إلى تضمين خريطة تفاعلية في تطبيق سطح المكتب أو الهاتف المحمول بلغة C++، فإن أفضل حل هو MapLibre Native - وهو فرع مفتوح المصدر من Mapbox GL Native الشهير.



MapLibre Native

مكتبة لعرض الخرائط المتجهة والنقطية باستخدام OpenGL/OpenGL ES. تدعم:

  • تحميل أنماط MapLibre (المبنية على JSON).
  • رسم العلامات والخطوط والمضلعات.
  • مصادر بيانات مخصصة (GeoJSON، MVT).
  • التوافق عبر المنصات (Windows، Linux، macOS، iOS، Android).


مثال على تهيئة خريطة مركزها موسكو (جزء مبسط):



#include <mbgl/map/map.hpp>#include <mbgl/util/default_thread_pool.hpp>#include <mbgl/storage/default_file_source.hpp>

// إنشاء السياق والخريطةmbgl::DefaultFileSource fileSource("cache.db", ".");mbgl::DefaultThreadPool threadPool(4);mbgl::Map map(*fileSource, threadPool, mbgl::MapMode::Static);

// تعيين النمط (مثال: OpenStreetMap)map.setStyleURL("https://demotiles.maplibre.org/style.json");

// تعيين المركز ومستوى التكبيرmap.setLatLngZoom({55.7558, 37.6173}, 10); // موسكو، zoom 10


4. الحسابات الجغرافية المكانية: مكتبة Proj



لتحويل الإحداثيات بين الأنظمة المختلفة (WGS84، MSK، UTM)، تُستخدم مكتبة PROJ

توصيات