Geolocalização e mapas em C++: visão geral de bibliotecas e ferramentas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Geolocalização e mapas em C++: visão geral de bibliotecas, ferramentas e exemplos de código



O desenvolvimento de aplicações relacionadas à geolocalização e cartografia na linguagem C++ requer o uso de bibliotecas especializadas. Ao contrário de Python ou JavaScript, onde o ecossistema para trabalhar com geodados é mais "pronto para uso", em C++ é necessário conectar ferramentas poderosas, mas de foco restrito. Neste artigo, analisaremos as principais bibliotecas e abordagens para trabalhar com coordenadas, mapas e geodados em C++.



1. Nível básico: trabalho com coordenadas e requisições HTTP



Antes de partir para a artilharia pesada, vale a pena dominar o básico. Para obter dados de localização (por exemplo, através de um receptor GPS ou API), utiliza-se entrada/saída padrão e requisições de rede.



Biblioteca libcurl — é a principal ferramenta para requisições HTTP. Com ela, é possível acessar APIs de geolocalização (por exemplo, ip-api.com ou openstreetmap.org).



Exemplo de obtenção de coordenadas por endereço 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 << "Resposta do servidor: " << response << std::endl; // Em seguida, fazemos o parsing do JSON (por exemplo, com nlohmann/json) } curl_easy_cleanup(curl); } return 0;}


Para fazer o parsing de respostas JSON de serviços geo, recomenda-se usar a biblioteca nlohmann/json — ela é simples e eficiente.



2. Projeções e transformações de coordenadas: biblioteca Proj



Ao trabalhar com geolocalização, muitas vezes é necessário converter coordenadas de um sistema para outro (por exemplo, de WGS84 para a projeção de Mercator). Para isso, existe a lendária biblioteca Proj (PROJ) — o padrão de facto para projeções cartográficas em C e C++.



Exemplo de conversão de coordenadas de graus para 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 (latitude/longitude) "EPSG:32637", // UTM zone 37N nullptr);

if (transformation == nullptr) { std::cerr << "Erro ao criar transformação" << std::endl; return 1; }

PJ_COORD coord; coord.lp.lam = 37.6173; // Longitude (Moscou) coord.lp.phi = 55.7558; // Latitude

PJ_COORD result = proj_trans(transformation, PJ_FWD, coord); std::cout << "X (leste): " << 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. Trabalho com mapas raster e vetoriais: GDAL



GDAL (Geospatial Data Abstraction Library) — é um canivete suíço para trabalhar com geodados. Ela suporta dezenas de formatos: GeoTIFF, Shapefile, GeoJSON, KML e outros. O GDAL permite ler, escrever e analisar tanto dados raster (imagens de satélite) quanto vetoriais (fronteiras de países, estradas).



Exemplo de leitura de coordenadas de um Shapefile:



#include <gdal/gdal_priv.h>#include <gdal/ogrsf_frmts.h>#include <iostream>

int main() {

Recommendations