Abaixo do corte - uma breve história sobre os níveis de zoom: por que na forma padrão eles não são adequados para grandes áreas e como a escala afeta o carregamento de blocos e a aparência do mapa.

Nível de zoom
Para indicar a escala no mapa 2GIS WebGL, como em muitos outros mapas, um número é usado - nível de zoom ou apenas zoom. Um zoom de zero corresponde a uma escala de mapa que encaixa o mundo inteiro em um quadrado de 256 × 256 px.

Mapa-múndi com zoom = 0
Ampliar em um corresponde a esticar o mapa duas vezes. No primeiro zoom, o mundo inteiro terá 256 × 2 = 512 px. Na quarta, obtemos o tamanho 256 × 2 × 2 × 2 × 2 = 4096 px.
Este sistema permite designar a gama de escalas com números fáceis de entender. Por exemplo, zoom = 11 é cerca de uma grande cidade na tela, zoom = 19 permite que você veja edifícios e passagens entre eles em detalhes.
Projeção mercator
Os mapas 2GIS usam a projeção cartográfica de Mercator. Uma projeção cartográfica é uma forma de exibir uma superfície esférica da Terra em um mapa plano.
Como um avião e uma bola não são a mesma coisa, qualquer projeção de mapa distorce a forma ou o tamanho dos objetos. Na projeção de Mercator, os objetos em latitudes elevadas no mapa parecem maiores do que os objetos no equador. Portanto, nesses mapas, a Groenlândia parece do tamanho da África, embora na verdade sua área seja 14 vezes menor que a África. Aqui você pode ver como a projeção distorce o tamanho dos países.

Se a Rússia for trazida para mais perto do equador, seu tamanho no mapa será significativamente reduzido
O alongamento dos objetos é proporcional a 1 / cos (lat), onde lat é a latitude do objeto. Dessa fórmula, segue-se que os objetos na latitude de São Petersburgo (lat = 60 °) no mapa serão alongados duas vezes. E objetos nos Pólos Norte ou Sul (lat = 90 °) se estenderão indefinidamente. É por isso que os pólos nunca são desenhados nos mapas na projeção de Mercator - tudo ao norte e ao sul de ≈85 ° de latitude é cortado neles.
Você pode ler mais sobre a projeção de Mercator neste material visual e fascinante .
Problemas com zoom e projeção de Mercator
O principal problema com os zooms decorre das propriedades da projeção de Mercator: o mesmo nível de zoom em diferentes latitudes corresponde a diferentes escalas reais do mapa.
Vamos comparar as imagens do mapa no 14º zoom em Murmansk (latitude 69 °) e Tashkent (latitude 41 °).

15º zoom em Murmansk

15º zoom em Tashkent Você
pode ver o quanto o tamanho da casa difere. Em Murmansk, eles são grandes, em Tashkent, o mapa é raso.
Ao definir o estilo do mapa, queremos dar a ele uma aparência específica. Para fazer isso, definimos a largura das estradas em pixels, dependendo do zoom ou zoom a partir do qual começamos a mostrar as casas. Os estilos escritos para uma latitude serão muito diferentes em outra. O significado inerente a eles será distorcido, pois os zooms significarão uma escala real diferente.
Decisão
Para resolver este problema, introduzimos o conceito de styleZoom, que pode ser diferente do zoom usual.
Zoom normal | StyleZoom |
Define a escala de objetos | Determina quais blocos carregar |
Escrito em url | Determina a qual escala aplicar estilos |
Usado nos métodos getZoom / setZoom familiares | Usado nos métodos getStyleZoom / setStyleZoom |
Corresponde a blocos de bitmap |
styleZoom é calculado a partir do zoom e da latitude usando a seguinte fórmula: styleZoom = zoom + log2 (1 / (2 * cos (lat)).
As seguintes propriedades styleZoom seguem a fórmula:
- A 60 ° de latitude styleZoom = zoom. Como os estilos foram originalmente escritos em Novosibirsk e Moscou, decidimos tomar essa latitude como base.
- Em latitudes <60 ° styleZoom <zoom. No equador, styleZoom = zoom - 1.
- Em latitudes> 60 ° styleZoom> zoom.
Agora vamos ver como Tashkent e Murmansk ficarão com styleZoom = 15.

Tashkent, styleZoom = 15 (zoom ≈ 15,59)

Murmansk, styleZoom = 15 (zoom ≈ 14,53)
É claramente visto que styleZoom corresponde à escala real do mapa, independentemente da latitude: em casa visualmente não diferem em tamanho, o mapa parece o mesmo em duas cidades diferentes.
Limitações
O mecanismo de correção tem desvantagens que aparecem em dois cenários para trabalhar com o mapa.
zoom <9
Em pequenos zooms, quando o mundo inteiro ou a maior parte dele está visível na tela, arrastar o mapa para cima e para baixo leva a grandes mudanças na latitude e, consequentemente, no estiloZoom.
Ao arrastar e soltar, isso pode levar ao carregamento de novos blocos, troca de estilos, aparecimento ou desaparecimento de objetos, etc. Para evitar este efeito, com zoom <9 a correção é desabilitada e styleZoom é definido para zoom.
lat> 60 °
Em latitudes muito altas, styleZoom torna-se um zoom muito maior. Como styleZoom é responsável por quais blocos carregar, pode acontecer, por exemplo, que no 14º zoom carregaremos e exibiremos os blocos do 16º zoom. O 16º bloco de zoom é 16 vezes menor em área do que o 14º bloco de zoom. E se geralmente ≈30 tiles caem na tela, então, neste caso, haverá 480. E o número de tiles afeta muito o desempenho. Para não carregar a placa de vídeo nessas latitudes, em lat> 60 ° a correção é desabilitada e styleZoom também é equiparado ao zoom.
Em vez de saída
Conecte a API de nossos mapas WebGL e mapas de design para as tarefas de seu serviço, sem se preocupar com a aparência deles em diferentes cidades.
Agradecimentos especiais a Lesha Fedosov pelo post. Lyokha, olá!