I metodi di stilizzazione visti finora offrono già molte opzioni per costruire visualizzazioni avanzate e specifiche. OpenLayers aggiunge anche alcuni metodi di “metarappresentazione” per visualizzare i dati tramite strumenti grafici e visuali derivati. Due tra i più famosi e impiegati sono la clusterizzazione di oggetti puntuali e le heatmap (mappe di densità).

Cluster

Per clustering si intende il raggruppamento di oggetti (puntuali). In OL ogni cluster puntuale, definito semplicemente in base ad una vicinanza grafica tra gli elementi puntuali (distanza minima in pixel), può essere rappresentato come un singolo punto. Trattandosi di distanze in pixel i raggruppamenti variano al variare della risoluzione, ovvero dello zoom. A zoom bassi avremo meno cluster contenenti un numero maggiore di punti. Via via che lo zoom aumenta i cluster vengono separati in cluster sempre meno numerosi, fino ad arrivare eventualmente alla visualizzazione dei singoli elementi originali.

Nel seguente esempio vengono generati randomicamente un migliaio di punti attorno ad una serie di punti di origine (layer “seed”). I punti geometrici generati, ovvero le feature contenenti tali punti, vengono isneriti in un ol.source.Vector usato come sorgente di un’altra sorgente ol.source.Cluster. Un layer vettoriale viene costruito sulla base di quest’ultima sorgente e inserito in mappa. Tramite la definizione della simbologia del vettoriale, e in particolare tramite l’uso di un’etichetta ol.style.Text costruita dinamicamente sulla base del numero di feature contenute in ogni elemento vengono visualizzati il numero di punti rappresentati da “punto cluster”.

Heatmap

Le heatmap in OL possono essere create usando un layer di tipo ol.layer.Heatmap. Il risultato sarà una mappa di densità simile a quella che si otterrebbe da una Kernel Density Estimation con kernel normale (gaussiano). È possibile ottenere una mappa di densità pesata se configuriamo il parametro weight di ol.layer.Heatmap. In questo parametro possiamo definire una funzione di calcolo dei pesi, oppure passare il nome del campo di un attributo delle feature presenti nella sorgente vettoriale. Come in ogni elaborazione basata su kernel è necessario definire i parametri per definirne le caratteristiche. In ol.layer.Heatmap si possono usare le proprietà blur e radius che, come si può intuire, vanno a determinare dimensione e forma. Anche in questo caso le dimensioni sono in px, per cui la heatmap varia in funzione del livello di zoom.

ol.layer.ImageCanvas

Nel caso volessimo avere un layer “disegnabile” con i metodi delle API del Canvas del browser, OpenLayers offre i layer di tipo ol.layer.ImageCanvas. Nella costruzione del layer possiamo definire la funzione di disegno tramite l’opzione canvasFunction. Alla funzione viene passato come parametro l’elemento Canvas del layer, sul quale potremo operare liberamente secondo le nostre necessità.

Qua ne possiamo vedere un esempio nel quale viene creato un layer vettoriale usando la libreria grafica D3.js.

preCompose e postCompose

Ad un livello ancora più avanzato OL ci offre infine la possibilità di operare direttamente sulle strutture e le funzioni di base utilizzate per il disegno degli oggetti sul browser. Operando a questo livello abbiamo la possibilità di manipolare la grafica degli oggetti e della mappa sfruttando tutte le funzionalità offerte non più da OL ma dal motore grafico stesso del browser.

La tecnica più comune per poter manipolare le routine di rendering di OL è quello di “agganciarsi” agli eventi preCompose e postCompose emessi dalla mappa ogni volta che sta per essere disegnata o non appena è stata disegnata. La particolarità di questi eventi è che, attraverso di essi, è possibile accedere a vari oggetti (contesti) che ci permettono di accedere alle primitive che vengono disegnate, accedere al canvas del browser, modificare gli elementi che saranno disegnati e come saranno disegnati.

Sul sito di OL si possono trovare vari esempi che fanno uso di questa tecnica, usata spesso per generare animazioni altrimenti impossibili da costruire con gli oggetti standard di OL.