Skill de Mapas
Inteligência de localização usando fontes de dados abertas e gratuitas. 8 comandos, 44 categorias de POIs, zero dependências (apenas stdlib do Python), sem necessidade de chave de API.
Fontes de dados: OpenStreetMap/Nominatim, Overpass API, OSRM, TimeAPI.io.
Este skill substitui o antigo skill find-nearby — toda a funcionalidade do find-nearby está coberta pelo comando nearby abaixo, com o mesmo atalho --near "<lugar>" e suporte a múltiplas categorias.
Quando Usar
- O usuário envia um pin de localização do Telegram (latitude/longitude na mensagem) →
nearby - O usuário quer coordenadas para um nome de lugar →
search - O usuário tem coordenadas e quer o endereço →
reverse - O usuário pergunta por restaurantes, hospitais, farmácias, hotéis próximos, etc. →
nearby - O usuário quer distância ou tempo de viagem dirigindo/caminhando/andando de bicicleta →
distance - O usuário quer direções passo a passo entre dois lugares →
directions - O usuário quer informações de fuso horário para uma localização →
timezone - O usuário quer pesquisar POIs dentro de uma área geográfica →
area+bbox
Pré-requisitos
Python 3.8+ (apenas stdlib — não precisa de pip install).
Caminho do script: ~/.hermes/skills/maps/scripts/maps_client.py
Comandos
MAPS=~/.hermes/skills/maps/scripts/maps_client.py
search — Geocodificar um nome de lugar
python3 $MAPS search "Torre Eiffel"
python3 $MAPS search "1600 Pennsylvania Ave, Washington DC"
Retorna: lat, lon, nome de exibição, tipo, bounding box, pontuação de relevância.
reverse — Coordenadas para endereço
python3 $MAPS reverse 48.8584 2.2945
Retorna: detalhamento completo do endereço (rua, cidade, estado, país, CEP).
nearby — Encontrar lugares por categoria
# Por coordenadas (por exemplo, de um pin de localização do Telegram)
python3 $MAPS nearby 48.8584 2.2945 restaurante --limit 10
python3 $MAPS nearby 40.7128 -74.0060 hospital --radius 2000
# Por endereço / cidade / CEP / ponto de referência — --near faz geocodificação automática
python3 $MAPS nearby --near "Times Square, Nova York" --category cafe
python3 $MAPS nearby --near "90210" --category farmacia
# Múltiplas categorias mescladas em uma única consulta
python3 $MAPS nearby --near "centro de Austin" --category restaurante --category bar --limit 10
46 categorias: restaurante, cafe, bar, hospital, farmacia, hotel, guest_house, camp_site, supermercado, atm, posto_de_gasolina, estacionamento, museu, parque, escola, universidade, banco, policia, corpo_de_bombeiros, biblioteca, aeroporto, estacao_de_trem, ponto_de_onibus, igreja, mesquita, sinagoga, dentista, medico, cinema, teatro, academia, piscina, correios, loja_de_conveniencia, padaria, libraria, lavanderia, lava_rapido, aluguel_de_carros, aluguel_de_bicicletas, taxi, veterinario, zoologico, playground, estadio, boate.
Cada resultado inclui: name, address, lat/lon, distance_m,
maps_url (link clicável do Google Maps), directions_url (direções do Google Maps
a partir do ponto de pesquisa) e tags promovidas quando disponíveis —
cuisine, hours (horário de funcionamento), phone, website.
distance — Distância e tempo de viagem
python3 $MAPS distance "Paris" --to "Lyon"
python3 $MAPS distance "Nova York" --to "Boston" --mode carro
python3 $MAPS distance "Big Ben" --to "Ponte da Torre" --mode caminhada
Modos: carro (padrão), caminhada, bicicleta. Retorna distância rodoviária, duração e distância em linha reta para comparação.
directions — Navegação passo a passo
python3 $MAPS directions "Torre Eiffel" --to "Museu do Louvre" --mode caminhada
python3 $MAPS directions "Aeroporto JFK" --to "Times Square" --mode carro
Retorna etapas numeradas com instrução, distância, duração, nome da rua e tipo de manobra (virar, partir, chegar, etc.).
timezone — Fuso horário para coordenadas
python3 $MAPS timezone 48.8584 2.2945
python3 $MAPS timezone 35.6762 139.6503
Retorna nome do fuso horário, offset UTC e horário local atual.
area — Bounding box e área para um lugar
python3 $MAPS area "Manhattan, Nova York"
python3 $MAPS area "Londres"
Retorna coordenadas da bounding box, largura/altura em km e área aproximada. Útil como entrada para o comando bbox.
bbox — Pesquisar dentro de uma bounding box
python3 $MAPS bbox 40.75 -74.00 40.77 -73.98 restaurante --limit 20
Encontra POIs dentro de um retângulo geográfico. Use area primeiro para obter as
coordenadas da bounding box de um lugar nomeado.
Trabalhando com Pins de Localização do Telegram
Quando um usuário envia um pin de localização, a mensagem contém os campos
latitude: e longitude:. Extraia esses valores e passe-os diretamente para nearby:
# O usuário enviou um pin em 36.17, -115.14 e perguntou "encontre cafés perto"
python3 $MAPS nearby 36.17 -115.14 cafe --radius 1500
Apresente os resultados como uma lista numerada com nomes, distâncias e o campo
maps_url para que o usuário tenha um link tocável para abrir no chat. Para perguntas
"está aberto agora?", verifique o campo hours; se estiver ausente ou pouco claro,
verifique com web_search, pois os horários do OSM são mantidos pela comunidade e
nem sempre estão atualizados.
Exemplos de Fluxo de Trabalho
"Encontre restaurantes italianos perto do Coliseu":
nearby --near "Coliseu Roma" --category restaurante --radius 500— um comando, geocodificação automática
"O que há perto deste pin de localização que enviaram?":
- Extrair lat/lon da mensagem do Telegram
nearby LAT LON cafe --radius 1500
"Como faço para caminhar do hotel até o centro de convenções?":
directions "Nome do Hotel" --to "Centro de Convenções" --mode caminhada
"Quais restaurantes há no centro de Seattle?":
area "Centro de Seattle"→ obter bounding boxbbox S W N E restaurante --limit 30
Armadilhas
- Termos de Uso do Nominatim: máximo 1 req/s (tratado automaticamente pelo script)
nearbyrequer lat/lon OU--near "<endereço>"— um dos dois é necessário- A cobertura de roteamento do OSRM é melhor para Europa e América do Norte
- A Overpass API pode ser lenta durante horários de pico; o script automaticamente faz fallback entre mirrors (overpass-api.de → overpass.kumi.systems)
distanceedirectionsusam a flag--topara o destino (não posicional)- Se um CEP sozinho der resultados ambíguos globalmente, inclua país/estado
Verificação
python3 ~/.hermes/skills/maps/scripts/maps_client.py search "Estátua da Liberdade"
# Deve retornar lat ~40.689, lon ~-74.044
python3 ~/.hermes/skills/maps/scripts/maps_client.py nearby --near "Times Square" --category restaurante --limit 3
# Deve retornar uma lista de restaurantes a ~500m da Times Square