Recursos de dimensionamento de mapa WebGL

Lançamos um editor de estilo . Saiba mais sobre como usá-lo, você pode configurar o cartão nas tarefas de serviço podem ser lidos em vc.ru . No Habré, queremos falar sobre o conceito StyleZoom, que também usamos no editor de estilos.



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á!



All Articles