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