Se você já escreveu código que conversa com uma biblioteca de mapas, escreveu código que toca o viewport. O viewport é o estado em tempo de execução do mapa: onde ele está centralizado, o quão ampliado está, para onde está apontando e opcionalmente o quanto está inclinado. Todo pan, zoom, rotação e clique depende dele.
Este guia explica o que é um viewport, os quatro valores principais que o descrevem, como ele interage com tiles e bounding boxes e os padrões de produção para salvar, restaurar e compartilhar o estado do viewport.
Os Quatro Valores Principais
Um viewport de mapa web moderno é descrito por até quatro valores:
- Center (
{ lat, lng }): a coordenada geográfica no meio da tela. - Zoom (um número, frequentemente float): o quão ampliado o mapa está. Números maiores mostram áreas menores com mais detalhe.
- Bearing (um número em graus, padrão 0): a rotação do mapa a partir de "norte para cima". 90 significa que o leste está para cima.
- Pitch (um número em graus, 0 a ~85): a inclinação 3D. 0 é plano vista de cima, 60 é uma visão em forte perspectiva.
Toda biblioteca de mapas moderna (MapLibre GL, Mapbox GL, OpenLayers, Leaflet, MapAtlas Dynamic Maps) expõe esses como estado legível e gravável. Uma biblioteca somente 2D como o Leaflet pode não expor bearing ou pitch.
Níveis de Zoom em Detalhe
O nível de zoom é o mais perguntado dos quatro. É um número inteiro (ou fracionário) que mapeia o mundo para uma pirâmide de tiles:
- Zoom 0: mundo inteiro num único tile de 256x256
- Zoom 1: mundo dividido em 4 tiles
- Zoom 2: 16 tiles
- ...
- Zoom 14: ~268 milhões de tiles, escala de bairro
- Zoom 18: escala de prédio
- Zoom 22+: geralmente renderizado com upscaling de estilo vetorial em vez de dados de tiles frescos
Uma regra prática útil no equador: cada aumento de nível de zoom reduz pela metade a largura visível na tela. No zoom 14, uma tela tipicamente mostra alguns quarteirões. No zoom 10, uma área metropolitana. No zoom 6, um país. A resolução efetiva depende do tamanho da tela e da projeção (Web Mercator distorce norte-sul conforme você se move em direção aos polos).
A maioria do código de produção armazena zoom como float (ex: 14.5) porque animações de zoom suaves interpolam entre zooms inteiros. As buscas de tiles acontecem no nível inteiro arredondado para baixo ou para cima, dependendo da convenção da biblioteca.
Viewport vs Bounding Box
Um viewport é estado de câmera. Um bounding box é o retângulo geográfico atualmente visível. Você calcula o bbox a partir do viewport toda vez que precisa perguntar ao servidor "o que devo mostrar dentro desta visão?".
No código:
const bbox = map.getBounds(); // retorna { _sw: {lat, lng}, _ne: {lat, lng} }
const params = new URLSearchParams({
bbox: `${bbox._sw.lng},${bbox._sw.lat},${bbox._ne.lng},${bbox._ne.lat}`,
});
const features = await fetch(`/api/places?${params}`).then(r => r.json());
Esse padrão (calcular bbox a partir do viewport, enviar para o servidor, renderizar as features retornadas) é o coração de toda experiência de busca baseada em viewport: imóveis, listagens, localizadores de lojas, rastreamento de frotas, ride-share.
Como o Viewport Guia o Carregamento de Tiles
Quando o viewport muda, a biblioteca de mapas descobre quais tiles cobrem a nova área visível no nível de zoom atual, busca os tiles faltantes do servidor (ou de seu cache em memória) e os renderiza. Tiles já cacheados são reutilizados; tiles fora do viewport são mantidos por precaução caso o usuário faça pan de volta.
Um pan e zoom fluido parece contínuo porque a biblioteca está fazendo esse trabalho de forma assíncrona: desenha o que tem, busca o que precisa e atualiza o canvas conforme novos tiles chegam. Pipelines de vector tiles fazem trabalho extra para renderizar geometria em pixels na GPU, o que é por isso que mapas web modernos ficam nítidos em qualquer zoom e rotação.
Salvando e Compartilhando o Estado do Viewport
Armazenar o viewport na URL é o padrão para links de mapa compartilháveis. A maioria dos produtos usa um hash de URL como #map=14.5/52.5200/13.4050 (zoom, lat, lng). No carregamento da página, parse o hash e aplique o viewport. Na mudança de viewport, debounce por alguns cem milissegundos e atualize o hash para que o botão voltar do browser continue útil.
Para estado interno do browser entre abas ou sessões, uma chave localStorage com o mesmo formato funciona. Para páginas renderizadas no servidor, o viewport frequentemente aparece como query params para URLs amigáveis ao SEO (?zoom=14&lat=52.52&lng=13.405).
Viés de Viewport para Busca e Autocomplete
APIs de geocodificação aceitam o viewport (ou seu bbox) como parâmetro de viés. MapAtlas expõe boundary.rect.* para um filtro rígido e focus.point.* para um viés suave. Sem viés, o autocomplete para "Springfield" retorna qualquer Springfield que seja mais popular globalmente. Com o viés de viewport, o usuário digitando dentro do mapa de São Paulo recebe resultados de São Paulo primeiro.
Aplique esse viés a cada pressionamento de tecla. O custo é um parâmetro e sugestões significativamente mais relevantes.
Viewport Inicial: Por Onde Começar
A primeira coisa que todo app de mapa precisa decidir é por onde começar. Padrões comuns:
- Padrão para o locale do usuário: um usuário no Brasil começa em São Paulo, um usuário na França em Paris.
- Padrão para o último viewport do usuário: persista o viewport entre sessões.
- Padrão para os dados: se o mapa mostra resultados de busca, ajuste o bbox desses resultados na renderização inicial.
- Padrão para a geolocalização por IP do usuário: baixa precisão, sem necessidade de permissão, bom fallback.
- Solicite geolocalização do browser somente quando o usuário optar explicitamente: nunca no primeiro carregamento sem consentimento da UI.
Escolher um viewport inicial sensato é um detalhe pequeno com um grande efeito na qualidade percebida.
Como MapAtlas Expõe o Estado do Viewport
O componente Dynamic Maps da MapAtlas expõe a mesma API getCenter, getZoom, getBearing, getPitch e setView que todo mapa web para desenvolvedores oferece, com a adição de hospedagem exclusiva na UE e parâmetros de viés de viewport consistentes nos endpoints de Geocoding e Search. Para uma visão mais aprofundada de como o viewport interage com tiles e projeções, veja O Que É um Vector Tile e O Que É o Web Mercator.
Perguntas frequentes
O que é um viewport de mapa?
Um viewport de mapa é a janela visível de um mapa: a área geográfica atualmente exibida na tela, descrita por uma coordenada de centro (latitude e longitude), um nível de zoom (o quão aproximado ou afastado o mapa está) e opcionalmente um bearing (rotação) e pitch (inclinação 3D). Todo mapa web moderno (Google Maps, MapLibre, Mapbox GL, MapAtlas) expõe o viewport como estado que você pode ler e definir programaticamente. O viewport muda toda vez que o usuário faz pan, zoom, rotação ou inclinação no mapa.
O que é um nível de zoom?
O nível de zoom é um número inteiro (ou fracionário) que controla quanto do mundo está visível num tile de tamanho fixo. Zoom 0 encaixa o mundo inteiro num único tile de 256x256. Cada nível de zoom subsequente dobra a resolução: zoom 1 tem 4 tiles, zoom 2 tem 16, e assim por diante. Zoom 14 é aproximadamente escala de bairro, zoom 18 é aproximadamente escala de prédio. A maioria dos mapas de produção suporta níveis de zoom de 0 a 22 ou mais, embora os tiles subjacentes só existam até um determinado zoom e sejam superamostrados ou up-resolvidos além disso.
Qual é a diferença entre viewport e bounding box?
Um viewport é o estado da câmera (centro, zoom, bearing, pitch). Um bounding box é o retângulo geográfico que a câmera está mostrando atualmente. Você calcula o bbox a partir do viewport: dado um centro, zoom e tamanho de tela, a biblioteca de mapas calcula qual retângulo lat/lng está visível. O bbox é o que você passa para a API de geocodificação como viés de viewport, o que você consulta no banco de dados para features visíveis e o que você loga quando quer saber o que o usuário estava vendo.
Como salvo e restauro o viewport de um mapa?
Serialize os quatro valores principais (latitude do centro, longitude do centro, zoom, bearing se você suporta rotação) na URL ou no localStorage. Um padrão comum é um hash como #map=14.5/52.5200/13.4050 para zoom 14.5 no centro de Berlim. No carregamento da página, parse o hash e chame map.setView(...) ou map.flyTo(...). MapAtlas, MapLibre e Mapbox GL todos expõem uma API getCenter / getZoom / getBearing e um equivalente setView, portanto essa ida-e-volta é uma função auxiliar em qualquer código de produção.

