Geolokalisierung und Karten in C++: Überblick über Bibliotheken und Werkzeuge

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Geolokalisierung und Karten in C++: Bibliotheken und Werkzeuge für die Arbeit mit räumlichen Daten



Die Entwicklung von Anwendungen, die mit Geolokalisierung und Karten in C++ arbeiten, erfordert oft die Integration spezialisierter Bibliotheken. Im Gegensatz zu Python mit seinem reichhaltigen Ökosystem (GeoPandas, Folium) bietet C++ eher low-level, aber leistungsstarke Werkzeuge. In diesem Artikel betrachten wir die wichtigsten Bibliotheken und Ansätze für die Arbeit mit Koordinaten, Kartenanzeige und georäumlichen Berechnungen in C++.



1. Grundlegende Ansätze für die Arbeit mit Geolokalisierung



Geolokalisierung in C++ wird in der Regel realisiert durch:

  • HTTP-Anfragen an APIs (z. B. an Geokodierungs- oder Wetterdienste).
  • Parsen von GPS-Daten aus NMEA-Loggern oder GPX-Dateien.
  • Mathematische Berechnungen von Entfernungen (Haversine-Formel) und Koordinatentransformationen.


2. Bibliotheken für HTTP-Anfragen (Grundlage der Geokodierung)



Um Daten von Geolokalisierungsservern (z. B. OpenStreetMap Nominatim) zu erhalten, ist Netzwerkkommunikation erforderlich. Die beste Wahl für C++ ist libcurl.



libcurl

Eine universelle Bibliothek zur Datenübertragung über URLs. Unterstützt HTTP/HTTPS, FTP und andere Protokolle. Beispiel einer Anfrage an die Nominatim-API zur Geokodierung (Ermittlung von Koordinaten aus einer Adresse):



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

// Callback zum Schreiben der Antwort in einen Stringstatic 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); // Wichtig: User-Agent angeben (Anforderung von Nominatim) curl_easy_setopt(curl, CURLOPT_USERAGENT, "MyCppApp/1.0"); curl_easy_perform(curl); curl_easy_cleanup(curl); } return response; // JSON mit Koordinaten}


3. Kartenanzeige: MapLibre Native



Wenn eine interaktive Karte in eine Desktop- oder mobile C++-Anwendung eingebettet werden soll, ist die beste Lösung MapLibre Native – ein Open-Source-Fork des beliebten Mapbox GL Native.



MapLibre Native

Eine Bibliothek zum Rendern von Vektor- und Rasterkarten mit OpenGL/OpenGL ES. Unterstützt:

  • Laden von MapLibre-Stilen (basierend auf JSON).
  • Zeichnen von Markern, Linien, Polygonen.
  • Benutzerdefinierte Datenquellen (GeoJSON, MVT).
  • Plattformunabhängigkeit (Windows, Linux, macOS, iOS, Android).


Beispiel für die Initialisierung einer Karte mit Zentrum in Moskau (vereinfachter Ausschnitt):



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

// Erstellung von Kontext und Kartembgl::DefaultFileSource fileSource("cache.db", ".");mbgl::DefaultThreadPool threadPool(4);mbgl::Map map(*fileSource, threadPool, mbgl::MapMode::Static);

// Festlegen des Stils (z. B. OpenStreetMap)map.setStyleURL("https://demotiles.maplibre.org/style.json");

// Festlegen von Zentrum und Zoommap.setLatLngZoom({55.7558, 37.6173}, 10); // Moskau, Zoom 10


4. Georäumliche Berechnungen: Bibliothek Proj



Für die Umrechnung von Koordinaten zwischen verschiedenen Systemen (WGS84, MSK, UTM) wird die Bibliothek PROJ

Empfehlungen