Workshop Contents

Creative Commons-Licentie
Dit werk valt onder een Creative Commons Naamsvermelding-GelijkDelen 4.0 Internationaal-licentie.

Vector Tiles

the workshop starts here

Vector tile technologie is een nieuw alternatief op de traditionele raster image tiles voor web maps. Zij maken web maps sneller te publiceren en flexibeler vorm te geven.

Voor beginners ligt de focus op de front-end ontwikkeling. We maken een kaart met Maptiler . Daarna zetten we zelf een eenvoudige web-pagina met een kaart-viewer op te zetten met MapLibre.js. We gebruiken de Mapbox Style Specification om een eigen cartografische vormgeving te specificeren in de vorm van een style.json bestand. De vector tiles komen van Maptiler. Enige voorkennis van HTML, CSS en JavaScript is hierbij handig.

Maptiler kaart gebruiken

▶️ En ga naar Maptiler Cloud

▶️ Log in bij Maptiler of maak een account aan.

▶️ Zoek bij Maps de NL Cartiqo topo stijl op.

▶️ Scroll naar beneden en kopieer de Vector style JSON url. Die ziet er ong zo uit:

https://api.maptiler.com/maps/nl-cartiqo-topo/style.json?key=<yourAPIkey>

Maptiler kaart in Maplibre gebruiken

De style.json url van Maptiler kan je gebruiken in jouw MapLibre kaart. Zie de code hieronder.

▶️ Plak de url in jouw Maplibre kaart.

    var map = new maplibregl.Map({
      container: 'map',
      style: 'https://api.maptiler.com/maps/nl-cartiqo-topo/style.json?key=<yourAPIkey>',
      center: [5.12380, 52.09201],
      zoom: 8
    });

Bewerken stijl in Maputnik

🔗 A open source vector styling studio is Maputnik.

▶️ Ga naar Maputnik

▶️ Boven in het menu, klik op Open

▶️ Kopieer de style.json url van de Cartiqo stijl in het vak van Load from url en klik open url

▶️ Bewerk de stijl aan de linker kant.

‼️ Gezamelijke uitleg

Als je klaar bent exporteer dan jouw stijl bestand.

▶️ In het menu bovenin klik export

▶️ Vul jouw Maptiler key in en exporteer. Sla het bestand op in de folder van jouw web map .

Stijl json bestand ontdekken

▶️ Open het stijl json bestand op jouw computer in jouw tekst bewerkingsprogramma. Kijk er eens doorheen. Zie je hoe de lagen zijn opgebouwd?

The style.json

The map style itself is written as rules which define its visual appearance using the Mapbox GL Style Specification. It specifies:

This is the basics of a style.json:

{
    "version": 8,
    "name": "Mijn eigen Stijl",
    "sprite": "url",
    "glyphs": "url/{fontstack}/{range}.pbf",
    "sources": {...},
    "layers": [...]
}

The 2 most important for now are the sources and the layers. The sources tell us where our data is coming from. Vector Tiles or GeoJSON data for example. By setting layers we can style every separate layer available in the vector tiles and assigning it colours etc.

▶️ Kan je alle cruciale onderwerpen terug vinden in jouw bestand?

▶️ Ga naar de stijling specificatie van Maplibre/Mapbox .

Hier vind je de beschrijving van de stijling en wat er allemaal mogelijk is.

▶️ Gebruik dit bestand in jouw Maplibre kaart. Dat doe je zo:

    var map = new maplibregl.Map({
      container: 'map',
      style: './data/mijnstijl.json',
      center: [5.12380, 52.09201],
      zoom: 8
    });

‼️ Als dit niet werkt moet je een lokale server draaien

Stijl json opvragen met JavaScript

Het stijl object is ook op te vragen. Dit werkt altijd, of je kaart nu met een url of met een bestand maakt. Probeer maar eens.

▶️ Voeg de volgende code toe aan je JavaScript en kijk in de console.

map.on('load', function(){
    let stijl = map.getStyle()
    console.log(stijl)
})

Stijling aanpassen met JavaScript

Maplibre heeft een functie en die heet setPaintProperty. Daarmee kunnen we alle paint eigenschappen van een laag bewerken. Bijvoorbeeld de kleur.

map.on('load', function(){
    let stijl = map.getStyle()
    console.log(stijl)

    map.setPaintProperty('water', 'fill-color', '#40bcd8');
    map.setPaintProperty('highway-fill', 'line-color', '#ea4f57');
    map.setPaintProperty('highway-case', 'line-color', '#a7363b');
    map.setPaintProperty('road-fill-main-motor', 'line-color', '#ffaf3f');
    map.setPaintProperty('road-case-main-motor', 'line-color', '#a7363b');
})

Dit kunnen we natuurlijk ook combineren met een loop!

for (let i = 0; i < 5; i++) {
	console.log(i);
 }

We gaan een loop toepassen op alle lagen uit ons styling object.

▶️ Lees deze uitleg over forEach link

:arrow_forard: Maak een knop aan in de HTML en voeg daar een onClick event aan toe. Zorg dat de volgende functie wordt aangeroepen.

▶️ In de Javascript maken we een functie die wordt aangeroepen door deze knop.

function changeColors() {
    let stijl = mapLibreMap.getStyle()
    stijl.layers.forEach((layer) => {
        if (layer.type == "fill") {           
            let randomColor = "#" + Math.floor(Math.random()*16777215).toString(16)
            mapLibreMap.setPaintProperty( layer.id, "fill-color", randomColor);
        }
    });
}

▶️ Lees deze code. Wat denk je wat er gaat gebeuren als je op deze knop klikt?

Andere workshops en tips

Er zijn een heleboel mogelijkheden in JavaScript om je vector tile kaart aan te passen. Zo kan je extra lagen toevoegen, verwijderen, styling aanpassen en ga zo maar door. Kijk ook een naar de Maplibre documentatie. Ik heb nog meer workshops staan waar wat extra dingen staan uitgelegd. Vervang in deze workshops MapBox door Maplibre. Deze werken precies hetzelfde.

https://github.com/NieneB/mgi_workshop/wiki

https://github.com/NieneB/webmapping_for_developers/wiki/MapboxGL-part-1

You reached the end of this workshop!