Geolocalização e Mapas em JavaScript (Node.js): das coordenadas à visualização
As aplicações web modernas cada vez mais exigem trabalho com dados geográficos: desde a simples determinação da localização do usuário até a construção de rotas complexas e mapas interativos. No ecossistema Node.js, existem diversas ferramentas que permitem resolver essas tarefas. Neste artigo, vamos explorar as principais bibliotecas para geolocalização e mapas, além de apresentar exemplos práticos de seu uso.
1. Conceitos básicos: geolocalização e geocodificação
Antes de mergulharmos no código, vamos esclarecer os termos:
- Geolocalização — determinação da localização física de um dispositivo (geralmente por IP, GPS ou Wi-Fi).
- Geocodificação — conversão de um endereço (por exemplo, "Moscou, Praça Vermelha") em coordenadas geográficas (latitude, longitude).
- Geocodificação reversa — conversão de coordenadas em um endereço legível.
Em Node.js, para essas tarefas, a biblioteca mais utilizada é node-geocoder, que suporta diversos provedores (Google Maps, OpenStreetMap, Nominatim, entre outros).
2. Instalação e configuração do node-geocoder
Para começar, instale o pacote:
npm install node-geocoderExemplo de uso básico com o provedor OpenStreetMap (Nominatim):
const NodeGeocoder = require('node-geocoder');
const options = { provider: 'openstreetmap',};
const geocoder = NodeGeocoder(options);
// Geocodificação de endereçogeocoder.geocode('Moscou, Kremlin') .then((res) => { console.log('Coordenadas:', res[0].latitude, res[0].longitude); }) .catch((err) => { console.log('Erro:', err); });
// Geocodificação reversageocoder.reverse({ lat: 55.7522, lon: 37.6156 }) .then((res) => { console.log('Endereço:', res[0].formattedAddress); }) .catch((err) => { console.log('Erro:', err); });Observe: o serviço Nominatim tem limitações no número de requisições (1 requisição por segundo). Para produção, é melhor usar provedores pagos (Google, Here) ou configurar seu próprio servidor Nominatim.
3. Trabalhando com mapas no lado do servidor: Leaflet e OpenStreetMap
A biblioteca JavaScript mais popular para mapas interativos é o Leaflet. Ela funciona no navegador, mas você pode gerar mapas no servidor com Node.js e enviá-los ao cliente como HTML estático ou imagem.
Para gerar mapas estáticos (imagens), use o pacote leaflet-static ou node-static-map. Veja um exemplo com leaflet-static:
npm install leaflet-staticExemplo de criação de uma imagem de mapa com um marcador:
const LeafletStatic = require('leaflet-static');
const map = new LeafletStatic({ center: [55.7522, 37.6156], // Moscou zoom: 12, size: [800, 600], layers: [ { tileLayer: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', attribution: '© OpenStreetMap contributors' } ], markers: [ { lat: 55.7522, lng: 37.6156, popup: 'Praça Vermelha' } ]});
map.render() .then((buffer) => { // Salva a imagem require('fs').writeFileSync('map.png', buffer); console.log('Mapa salvo como map.png'); }) .catch((err) => { console.error('Erro:', err); });Essa abordagem é útil para criar prévias de mapas, relatórios ou campanhas de e-mail.
4. Determinação de localização por IP
Para determinar a geolocalização por endereço IP em Node.js, o pacote geoip-lite é frequentemente usado. Ele utiliza o banco de dados local GeoLite2 da MaxMind.
npm install geoip-liteExemplo:
const geoip = require('geoip-lite');
const ip = '8.8.8 Também na biblioteca
SnapKit para Swift: guia completo com exemplos
Processamento de Markdown em TypeScript: bibliotecas, parsers e aplicação prática