Geolocalización y mapas en C++: revisión de bibliotecas, herramientas y ejemplos de código
El desarrollo de aplicaciones relacionadas con geolocalización y cartografía en el lenguaje C++ requiere el uso de bibliotecas especializadas. A diferencia de Python o JavaScript, donde el ecosistema para trabajar con geodatos es más "listo para usar", en C++ es necesario conectar herramientas potentes pero especializadas. En este artículo analizaremos las bibliotecas y enfoques clave para trabajar con coordenadas, mapas y geodatos en C++.
1. Nivel básico: trabajo con coordenadas y solicitudes HTTP
Antes de pasar a la artillería pesada, vale la pena dominar los fundamentos. Para obtener datos de ubicación (por ejemplo, a través de un receptor GPS o una API) se utilizan la entrada/salida estándar y las solicitudes de red.
La biblioteca libcurl es la herramienta principal para solicitudes HTTP. Con ella se puede acceder a APIs de geolocalización (por ejemplo, ip-api.com o openstreetmap.org).
Ejemplo de obtención de coordenadas por dirección 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 << "Respuesta del servidor: " << response << std::endl; // Luego parseamos JSON (por ejemplo, con nlohmann/json) } curl_easy_cleanup(curl); } return 0;}Para el parsing de respuestas JSON de servicios geo, se recomienda usar la biblioteca nlohmann/json — es simple y eficiente.
2. Proyecciones y transformaciones de coordenadas: biblioteca Proj
Al trabajar con geolocalización, a menudo es necesario convertir coordenadas de un sistema a otro (por ejemplo, de WGS84 a proyección Mercator). Para esto existe la legendaria biblioteca Proj (PROJ) — el estándar de facto para proyecciones cartográficas en C y C++.
Ejemplo de conversión de coordenadas de grados a metros (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 (latitud/longitud) "EPSG:32637", // UTM zone 37N nullptr);
if (transformation == nullptr) { std::cerr << "Error al crear la transformación" << std::endl; return 1; }
PJ_COORD coord; coord.lp.lam = 37.6173; // Longitud (Moscú) coord.lp.phi = 55.7558; // Latitud
PJ_COORD result = proj_trans(transformation, PJ_FWD, coord); std::cout << "X (este): " << result.xy.x << " m" << std::endl; std::cout << "Y (norte): " << result.xy.y << " m" << std::endl;
proj_destroy(transformation); proj_context_destroy(ctx); return 0;}3. Trabajo con mapas raster y vectoriales: GDAL
GDAL (Geospatial Data Abstraction Library) es la navaja suiza para trabajar con geodatos. Soporta decenas de formatos: GeoTIFF, Shapefile, GeoJSON, KML y otros. GDAL permite leer, escribir y analizar tanto datos raster (imágenes satelitales) como vectoriales (límites de países, carreteras).
Ejemplo de lectura de coordenadas desde un Shapefile:
#include <gdal/gdal_priv.h>#include <gdal/ogrsf_frmts.h>#include <iostream>
int main() {