Nos últimos posts falamos bastante sobre vector tiles, que mapas belos e responsivos são melhor construídos usando essa tecnologia e que o PostgreSQL com PostGIS podem produzir vector tiles “on-the-fly“.

No entanto, para usar vector tiles em um mapa bonito e responsivo, você precisa acessar esses tiles através do protocolo HTTP e solicitá-los usando uma URL no formato XYZ.



É possível você escrever seu próprio wrapper HTTP para o gerador de vector tiles do PostGIS, mas você não precisa, pois a Crunchy Data já fez isso por você.

O pg_tileserv é um servidor de vector tiles leve, criado especificamente para publicar tiles de um banco de dados PostgreSQL/PostGIS, que possui os seguintes recursos:

  • Escrito em Go para permitir a implantação simples de binários sem cadeias de dependência complexas ou problemas de versão de biblioteca.
  • Padrões prontos para execução, para que a implantação básica exija apenas definir uma sequência de configurações do banco de dados e executar o programa.
  • Interface web simples para explorar os serviços de tiles publicados e visualizar os serviços como mapas.
  • Filtragem de atributos em tempo real para remover as colunas que você não deseja recuperar do servidor, para tiles menores e mais rápidos.
  • Geração de tiles com base em funções, para que você possa gerar tiles a partir de qualquer função que capte as coordenadas XYZ e produza tiles MVT.



Deseja ver o pg_tileserv em ação? Aqui está uma demonstração em cinco etapas! (A maioria das etapas envolve apenas a obtenção de alguns dados espaciais em um banco de dados: se você já possui um banco de dados, pule para a etapa 3 e insira suas próprias informações de conexão com o banco de dados).

1. Crie um banco de dados e ative o PostGIS.

createdb postgisftw
psql -d postgisftw -c 'create extension postgis'

2. Faça o download de alguns dados espaciais e carregue-os no PostGIS.

curl -L -o https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries.zip
unzip ne_50m_admin_0_countries.zip
shp2pgsql -s 4326 -D -I ne_50m_admin_0_countries | psql -d postgisftw

3. Baixe e descompacte o binário pg_tileserv para sua plataforma:

4. Defina a variável de ambiente DATABASE_URL para apontar para seu banco de dados e inicie o serviço.

export DATABASE_URL=postgresql://postgres@localhost:5432/postgisftw
./pg_tileserv --debug

5. Acesse pelo seu navegador a URL da interface web do serviço.

http://localhost:7800

6. Agora explore os dados.

O serviço inclui uma interface visualizável e uma API baseada em JSON. O ponto de partida da API JSON é:

http://localhost:7800/index.json

Você pode ver exemplos de mapas configurados usando a API JSON, através da interface web:



Usando os dados carregados neste exemplo, a construção de um mapa na web que visualiza os tiles é tão simples quanto apontar para a URL de origem da tile. Um mapa na web pode ser tão pequeno quanto estes exemplos ( Leaflet, Openlayers, Mapbox GL JS):

<html lang="en">
<head>
<meta charset="utf-8">
<title>Vector Tiles in Leaflet</title>

<!-- CSS for Leaflet map  -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css"
integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
crossorigin="" />

<!-- JS for Leaflet map  -->
<script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js"
integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og=="
crossorigin=""></script>

<!-- Leaflet plugin for vector tiles support -->
<script type="text/javascript"  src="https://unpkg.com/leaflet.vectorgrid@1.2.0"></script>

<!-- Set up a full-screen map -->
<style>
html, body, #map { height: 100%; width: 100%; }
body { padding: 0; margin: 0; }
#map { z-index: 1; }
</style>

</head>

<body>

<!-- Put the map in this element -->
<div id="map"></div>

<script>
// Leaflet map object
var map = L.map('map').setView([0, 0], 2);

// Add a base map layer to the map
var baseUrl = "https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png";
var baseLayer = L.tileLayer(baseUrl).addTo(map);

// Add the tile layer to the map
// https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries.zip
var vectorServer = "http://localhost:7800/";
var vectorLayerId = "public.ne_50m_admin_0_countries";
var vectorUrl = vectorServer + vectorLayerId + "/{z}/{x}/{y}.pbf";
var vectorTileStyling = {};
// Rendering options
vectorTileStyling[vectorLayerId] = {
"fill": true,
"fillColor": "green",
"fillOpacity": 0.1,
"color": "green",
"opacity": 0.7,
"weight": 2
};
var vectorTileOptions = {
"rendererFactory": L.canvas.tile,
"vectorTileLayerStyles": vectorTileStyling
};
var vectorLayer = L.vectorGrid.protobuf(vectorUrl, vectorTileOptions).addTo(map);

</script>

</body>
</html>

O código acima, vai gerar um mapa assim:



Fonte: Crunchy Data Blog