Visualizzare layer vettoriali con sistema di riferimento qualunque

Come si è detto altre volte, il sistema di riferimento usato di default in OpenLayers è il sistema proiettato WGS84/Spherical Mercator (o WGS84/Pseudo Mercator) identificato dall’ EPSG 3857. Se si vuole visualizzare un layer vettoriale che adotta questo stesso SR (Sistema di Riferimento), non si deve fare niente: basta aggiungerlo alla mappa ed esso sarà immediatamente sovrapposto nel modo corretto.

Qui vediamo per esempio il codice con cui rappresentiamo sulla mappa-base di OSM, un layer vettoriale in formato geoJSON (il file si chiama “edifici.geojson”) avente come SR l’EPSG 3857 :

Notiamo che nella definizione del layer vettoriale non è stato indicato nulla a proposito del suo SR.

Quando invece il SR del vettore è diverso da EPSG 3857 e da EPSG 4326 (WGS84), allora bisogna dichiararlo esplicitamente. Per esempio nel caso dell’oggetto ol.format.GeoJSON, va specificato il parametro defaultDataProjection:

ol.format.GeoJSON

Se per esempio il SR  è l’ EPSG 3004 (che corrisponde a Roma40/Gauss-Boaga fuso Est), il codice precedente cambia così:

Ma c’è un problema: nelle librerie di OpenLayers sono definiti solo l’ EPSG 3857 e il 4326, quindi gli altri eventuali ESPG usati non vengono riconosciuti! In altre parole, il codice scritto sopra da solo non basta, bisogna definire cosa è l’ EPSG:3004‘.

Per farlo bisogna usare la libreria proj4js (http://proj4js.org/) che può essere richiamata:

  • direttamente da una CDN: https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.4.3/proj4.js;
  • scaricando in locale il file proj4.js che si trova dentro la cartella “dist” nella repo Github: proj4js/proj4js;

e poi si definisce l’ EPSG adoperando la funzione proj4.defs:

Per sapere qual’è la stringa PROJ.4 che descrive il nostro SR, ci sono vari modi; uno è quello di andare sul sito http://epsg.io/ e cercare l’ESPG che ci interessa. Questo per esempio è il risultato della ricerca del codice 3004:

epsg.io ricerca

Poi cliccando sul nome del SR trovato (Monte Mario/Italy zone 2) si apre una pagina che contiene tutte le informazioni su di esso (epsg.io/3004) ed in particolare troviamo tutti i formati per l’ export della sua definizione, tra cui anche quello in PROJ.4. Ce lo copiamo e lo andiamo a sostituire nella funzione proj4.defs. Questo è quindi il codice completo:

Questo è un esempio completo in cui viene mostrato un layer geoJSON (avente EPSG:3004) che rappresenta gli edifici di un quartiere di Perugia. Potete fare la prova a togliere dal codice la definizione dell’ ESPG:3004 o l’indicazione della defaultDataProjection del geoJSON e vedrete che il layer non sarà più visibile sulla mappa!

N.B.
Il sistema di riferimento (CRS) di default dei file geoJSON è il WGS84 (EPSG:4326) ed è anche quello consigliato dalle specifiche del formato. Quando un geoJSON ha un CRS differente, appare (dentro il file) anche l’attributo crs, come nel seguente esempio:

Ovviamente quanto visto nell’esempio prima riportato, vale in generale in tutti gli altri casi in cui dobbiamo istanziare un layer vettoriale che abbia come SR un certo EPSG differente da quello di default. Per fare qualche esempio:

  • nel metodo readFeatures(..) dell’oggetto ol.format.WFS o dell’oggetto ol.format.GeoJSON, si specifica nel parametro dataProjection;
  • nel metodo setProjection(..) dell’oggetto ol.VectorTile, si specifica nel parametro Projection.

Questo di seguito è per esempio il codice che legge un vettore geoJSON come “variabile” e non come file, nel caso che il suo SR sia l’EPSG 32633 (WGS 84/UTM zone 33N):

condividi: