الجغرافيا المكانية والخرائط في C++: نظرة عامة على المكتبات والأدوات وأمثلة الأكواد
يتطلب تطوير التطبيقات المتعلقة بالجغرافيا المكانية ورسم الخرائط بلغة C++ استخدام مكتبات متخصصة. على عكس Python أو JavaScript، حيث يكون النظام البيئي للعمل مع البيانات الجغرافية أكثر "جاهزية"، في C++ من الضروري ربط أدوات قوية ولكنها متخصصة. في هذه المقالة، سنستعرض المكتبات والمناهج الرئيسية للعمل مع الإحداثيات والخرائط والبيانات الجغرافية في C++.
1. المستوى الأساسي: العمل مع الإحداثيات وطلبات HTTP
قبل الانتقال إلى الأدوات الثقيلة، من المفيد إتقان الأساسيات. للحصول على بيانات الموقع (على سبيل المثال، عبر مستقبل GPS أو API)، يتم استخدام الإدخال/الإخراج القياسي وطلبات الشبكة.
مكتبة libcurl هي الأداة الرئيسية لطلبات HTTP. يمكن استخدامها للوصول إلى واجهات برمجة التطبيقات (API) للجغرافيا المكانية (مثل ip-api.com أو openstreetmap.org).
مثال للحصول على الإحداثيات حسب عنوان IP:
#include <curl/curl.h>#include <string>#include <iostream>
size_t writeCallback(void* contents, size_t size, size_t nmemb, std::string* output) { size_t totalSize = size * nmemb; output->append((char*)contents, totalSize); return totalSize;}
int main() { CURL* curl = curl_easy_init(); if (curl) { std::string response; curl_easy_setopt(curl, CURLOPT_URL, "http://ip-api.com/json/"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); CURLcode res = curl_easy_perform(curl); if (res == CURLE_OK) { std::cout << "الرد من الخادم: " << response << std::endl; // ثم تحليل JSON (على سبيل المثال، باستخدام nlohmann/json) } curl_easy_cleanup(curl); } return 0;}لتحليل استجابات JSON من خدمات الجغرافيا المكانية، يُوصى باستخدام مكتبة nlohmann/json - فهي بسيطة وفعالة.
2. الإسقاطات وتحويل الإحداثيات: مكتبة Proj
عند العمل مع الجغرافيا المكانية، غالبًا ما يكون من الضروري تحويل الإحداثيات من نظام إلى آخر (على سبيل المثال، من WGS84 إلى إسقاط مركاتور). لهذا الغرض، توجد المكتبة الأسطورية Proj (PROJ) - المعيار الفعلي لإسقاطات الخرائط في C و C++.
مثال لتحويل الإحداثيات من الدرجات إلى الأمتار (UTM):
#include <proj.h>#include <iostream>
int main() { PJ_CONTEXT* ctx = proj_context_create(); PJ* transformation = proj_create_crs_to_crs(ctx, "EPSG:4326", // WGS84 (خط العرض/خط الطول) "EPSG:32637", // UTM zone 37N nullptr);
if (transformation == nullptr) { std::cerr << "خطأ في إنشاء التحويل" << std::endl; return 1; }
PJ_COORD coord; coord.lp.lam = 37.6173; // خط الطول (موسكو) coord.lp.phi = 55.7558; // خط العرض
PJ_COORD result = proj_trans(transformation, PJ_FWD, coord); std::cout << "X (شرق): " << result.xy.x << " م" << std::endl; std::cout << "Y (شمال): " << result.xy.y << " م" << std::endl;
proj_destroy(transformation); proj_context_destroy(ctx); return 0;}3. العمل مع الخرائط النقطية والمتجهة: GDAL
GDAL (Geospatial Data Abstraction Library) هي أداة متعددة الاستخدامات للعمل مع البيانات الجغرافية. تدعم عشرات التنسيقات: GeoTIFF، Shapefile، GeoJSON، KML وغيرها. تسمح GDAL بقراءة وكتابة وتحليل كل من البيانات النقطية (صور الأقمار الصناعية) والمتجهة (حدود الدول، الطرق).
مثال لقراءة الإحداثيات من ملف Shapefile:
#include <gdal/gdal_priv.h>#include <gdal/ogrsf_frmts.h>#include <iostream>
int main() {