For et par år siden havde jeg en opgave, hvor jeg skulle bygge en mobilklient, der både skulle have offline-support, mulighed for at downloade og håndtere mange vektorlag, og brugeren skulle kunne ændre transparens på lagene. Vector tiles var derfor en oplagt løsning til denne opgave. Dog stødte jeg ind i nogle problemer, bl.a. fordi det var nødvendigt at bruge et svensk referencesystem, hvilket ikke, på daværende tidspunkt, var understøttet af værktøjerne til oprettelse af vector tiles. Dengang klarede jeg opgaven ved at sammensætte mit eget værktøj i Java, men det irriterede mig, at oprettelse af vector tiles krævede specialværktøjer, hvor af flere af disse programmer benyttede en PostGIS-database som datakilde. Så hvorfor ikke danne vector tiles direkte i PostGIS, hvilket potentielt ville simplificere og effektivisere processen med oprettelse af vector tiles?
Open source funktioner til PostGIS
Jeg valgte således at bidrage til communitiet ved at udvikle open source PostGIS funktioner til oprettelse af vector tiles i to Protobuf-baserede formater: Mapbox Vector Tiles og Geobuf. Protobuf er en binær encoding-specifikation fra Google til strukturede data. Protobuf kan populært sagt betragtes som en binær ækvivalent til XML. Mine funktioner er nu en del af den officelle PostGIS version 2.4 release.
De nye PostGIS-funktioner:
- Giver mulighed for brugerdefinerede projektioner, fx UTM zone 32N
- Simplificerer arbejdsprocessen ved oprettelse af vector tiles, da antallet af værktøjer, der skal bruges, mindskes til blot en enkelt SQL-forespørgsel
- Mindsker potentielt det totale I/O load på computeren, og CPUen bruges mere optimalt
De to nye funktioner til oprettelse af vector tiles, som jeg har lavet, er:
- ST_AsMVTGeom. Denne funktion bruges til at omdanne en geometri til en ‘tilet’ datarepræsentation i det specificerede koordinatsystem.
- ST_AsMVT. Dette er en aggreringsfunktion, der bruges til at kode et sæt af rækker med transformeret geometri (her bruges ST_AsMVTGeom) og attributter til binært vector tiles format.
En ny open source-funktion til GeoBuf
Udover de to funktioner til oprettelse af vector tiles lavede jeg desuden en funktion til GeoBuf. GeoBuf er et godt alternativ til GeoJSON, hvis du har store datamængder, der skal vises på klientsiden. Denne funktion er desuden et godt alternativ til vector tiles, når du har brug for adgang til den originale datakilde - uden at miste detaljer.
- ST_AsGeobuf. Denne funktion minder om GeoJSON, men er mere kompakt.
Et praktisk eksempel på af de nye funktioner
Her ser I SQL’en, der kan bruges til at oprette en tile for en bounding box (ST_MakeBox2D) i sfærisk merkator.
MVTILE.SQL:
SELECT ST_AsMVT(q) FROM (SELECT id, ST_AsMVTGeom( geometry, ST_MakeBox2D(ST_Point(:xmin,:ymin), ST_Point(:xmax,:ymax)) ) AS geom FROM foss4g.ne_50m_land_3857 WHERE geometry && ST_MakeEnvelope(:xmin,:ymin,:xmax,:ymax,3857) ) as q
Datakilden i dette eksempel (ne_50m_land_3857) er et polygonlag med jordens kontinenter. I SQL’en identificeres først, hvilke geometrier, der skærer den specifikke tile. Derefter bruges ST_AsMVTGeom til at transformere geometrien til en ‘tilet’ repræsentation, med default-parametre for buffer og klip. Til sidst bruges ST_AsMVT til at aggregere det forespurgte og transformere til rækker i en binær vector tile.
Dette er således den minimale SQL, der er behov for. Herefter kan psql bruges til at oprette en tile for den første kvadrant af verden.
PSQL:
psql -At \ -v xmin=-20037508.342789244 \ -v ymin=0 \ -v xmax=0 \ -v ymax=20037508.342789244 \ -f mvtile.sql | xxd -r -p >./1/0/0.pbf
Bemærk, at resultatet fra psql ikke er en rå binær fil, men derimod hex-encoded. Jeg bruger derfor “xxd”-kommandoen til at omforme til en rå binær fil (.pbf).
Resultatet af den første sql bliver en enkelt tile:
SQLen kan justeres, så der oprettes 4 tiles, der dækker hele verdenen. Her vist med OpenLayers 4.0:
Vises denne med OpenLayers 4.2, bliver visningen mindre gnidret:
Opløsningen kan justeres, så landenens afgrænsning bliver smukkere:
Og her et eksempel på tiles der tildeles tilfældige fyldfarver
Sådan kommer du selv igang med at producere vector tiles
Funktionerne findes i PostGIS 2.4. Har du ikke allerede PostGIS installeret i din PostgreSQL-database, kan du hente den her.
Kontakt os, hvis du har brug for sparring eller hjælp til, hvordan du kommer igang og kommer videre med vector tiles.
Om forfatteren
Björn Harrtell er seniorudvikler hos Septima og bidrager til en række open source-projekter, herunder PostGIS, OpenLayers og GeoServer.
Björn er en del af PostGIS’ kerneudviklergruppe og er manden bag JSTS, der er en portering af JTS til JavaScript.
Fordele ved vector tiles
Vector tiles gør det muligt at lave lækre kort, hvor data vises hurtigt med den ønskede kartografi. Ved at bruge vector tiles bliver data først stylet i klienten fx en webbrowser, mobilapp eller et desktop-program. Derfor er det muligt at anvende brugerdefinerede stilarter, fremfor prædefinerede, til visning af data. Vector tiles giver således stor fleksibilitet i de kartografikse muligheder, samtidig med at formatet er kompakt og egnet til offlinevisning på mobile enheder.