C++ में जियोलोकेशन और मैप्स: स्थानिक डेटा के लिए लाइब्रेरी और टूल्स
C++ में जियोलोकेशन और मैप्स से जुड़े ऐप्लिकेशन बनाने के लिए अक्सर विशेष लाइब्रेरी की ज़रूरत होती है। Python के मुकाबले (जहाँ GeoPandas, Folium जैसी लाइब्रेरी हैं), C++ ज़्यादा लो-लेवल लेकिन हाई-परफॉर्मेंस टूल्स देता है। इस आर्टिकल में हम C++ में कोऑर्डिनेट, मैप डिस्प्ले और जियोस्पेशियल कैलकुलेशन के लिए ज़रूरी लाइब्रेरी और तरीकों पर चर्चा करेंगे।
1. जियोलोकेशन के मुख्य तरीके
C++ में जियोलोकेशन आमतौर पर इन तरीकों से काम करता है:
- API को HTTP रिक्वेस्ट (जैसे जियोकोडिंग या मौसम सेवाओं के लिए)।
- GPS डेटा पार्स करना NMEA लॉगर या GPX फ़ाइलों से।
- गणितीय गणना दूरी (हैवरसाइन फ़ॉर्मूला) और कोऑर्डिनेट ट्रांसफ़ॉर्मेशन।
2. HTTP रिक्वेस्ट के लिए लाइब्रेरी (जियोकोडिंग का आधार)
जियोलोकेशन सर्वर (जैसे OpenStreetMap Nominatim) से डेटा लेने के लिए नेटवर्क सपोर्ट चाहिए। C++ के लिए सबसे अच्छा विकल्प libcurl है।
libcurl
URL के ज़रिए डेटा ट्रांसफ़र करने वाली सार्वभौमिक लाइब्रेरी। यह HTTP/HTTPS, FTP और दूसरे प्रोटोकॉल को सपोर्ट करती है। Nominatim API पर जियोकोडिंग (पते से कोऑर्डिनेट पाना) का उदाहरण:
#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 का Open Source फ़ोर्क है।
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 लाइब्रेरी (वर्जन 9+) का उपयोग किया जाता है। यह GIS इंडस्ट्री में डी-फ़ैक्टो स्टैंडर्ड है।