Com a disponibilização do formato MVT no PostGIS via função ST_AsMVT(), mais e mais pessoas estão gerando seus tiles diretamente do banco de dados. Isso geralmente envolve algumas etapas comuns:

  • Expor os tiles a partir de uma API web sobre o HTTP
  • Conversão de coordenadas dos tiles para impulsionar a geração do tile

As coordenadas do tile consistem em três valores:

  • zoom , o nível da “pirâmide” de tiles
  • x , a coordenada do tile nesse zoom, contando a partir da esquerda, começando em zero
  • y , a coordenada do tile nesse zoom, contando a partir do topo, começando em zero



A maioria das coordenadas de referência dos tiles são construídas na projeção “spherical mercator”, que é uma projeção plana que cobre a maior parte do planeta, embora com distorções substanciais de distância quanto mais ao norte você for.

Conhecendo o nível de zoom e as coordenadas do tile, a matemática para encontrar os limites da projeção mercator é bastante direta. Veja:



A maioria das pessoas que geram tiles a partir do banco de dados escreve seu próprio “wrapper” para conversão da coordenada do tile em mercator.

Parece complicado fazer isso, por isso foi adicionado a função ST_TileEnvelope() ao PostGIS. Por padrão, a função ST_TileEnvelope obtém o zoom, as coordenadas x e y e gera os limites na projeção Spherical Mercator.

SELECT ST_AsText(ST_TileEnvelope(3, 4, 2));


                    st_astext                                       
----------------------------------------------------
 POLYGON((0 5009377.5,0 10018755,5009377.5 10018755,
          5009377.5 5009377.5,0 5009377.5))

Se você precisar gerar tiles em outro sistema de coordenadas – um caso de uso raro, mas não impossível -, você poderá trocar o sistema de referência espacial e definir limites diferentes do conjunto de tiles por meio do parâmetro bounds, que pode codificar os limites do plano e o sistema de referência espacial em uma geometria:

SELECT ST_AsText(ST_TileEnvelope(
    3, 4, 2, 
    bounds => ST_MakeEnvelope(0, 0, 1000000, 1000000, 3005)
    ));

Observe que as mesmas coordenadas do tile geram limites diferentes – porque os limites do tile no nível base são diferentes.

                      st_astext                                     
--------------------------------------------------------
 POLYGON((500000 625000,500000 750000,625000 750000,
          625000 625000,500000 625000))

A função ST_TileEnvelope também pode gerar tiles não quadrados, basta você fornecer limites não quadrados.

Fonte: Clever Elephant Blog