====== OpenLayers: modificare gli stili ======
===== Foglio di stile =====
Nel codice HTML si include un foglio di stile dopo aver incluso OpenLayers:
Solo alcuni stili possono essere modificati, ad esempio:
#layerswitcher {
/* This will work: */
width: 250px;
/* Does not work: overridden by the JavaScript constructor. */
color: yellow;
float: left;
}
Non funziona quando lo stile viene definito dinamicamente dal JavaScript di OpenLayers, si vede chiaramente con Firebug.
===== JavaScript =====
Si possono passare dei parametri al costruttore di un oggetto oppure modificare delle proprietà all'oggetto stesso. Ad esempio:
var layerswitcher = new OpenLayers.Control.LayerSwitcher({
'div':OpenLayers.Util.getElement('layerswitcher'),
activeColor:'darkgreen'
});
map.addControl(layerswitcher);
layerswitcher.div.style.position = 'fixed';
layerswitcher.div.style.top = '0';
layerswitcher.div.style.right = '0';
layerswitcher.div.style.width = '180px';
layerswitcher.div.style.height = '400px';
Non funziona quando il costruttore non prevede il parametro oppure se l'oggetto non espone la proprietà. Altro problema è la poca documentazione, conviene vedere i sorgenti e cercare la stringa "style".
===== Modificare il JavaScript originale =====
Il codice di OpenLayers è organizzato in diversi file sorgente. In produzione - per motivi di performance - viene compattato e incluso nell'unico file **''OpenLayers.js''**. Per effettuare piccole modifiche è conveniente prendere il singolo file sorgente, modificarlo e includerlo separatamente.
Se si desidera ad esempio modificare un **''OpenLayers.Control''**, si copia il sorgente dello stesso dalla directory dei sorgenti (es. **''lib/OpenLayers/Control/LayerSwitcher.js''**) e lo si include nell'HTML come script dopo aver incluso **''OpenLayers.js''**:
In questo modo si può eliminare la posizione hard-coded del layer switcher (e definirla in un foglio di stile):
this.div.style.position = "absolute";
===== Utilizzare l'oggetto StyleMap =====
Esempio:
var styleMap = new OpenLayers.StyleMap({
"default": {
strokeWidth: 1,
strokeColor: "black",
fillColor: "red"},
"select": {
fillColor: "yellow"}
});
===== Definire lo stile di un Vector layer =====
Esempio:
var style = new OpenLayers.Style();
style.strokeColor = "#FF0000";
style.strokeWidth = 5;
style.strokeOpacity = 0.7;
style.fillColor = "#FFA500";
style.fillOpacity = 0.3;
var vector = new OpenLayers.Layer.Vector(label, {'style': style});
vector.addFeatures(
new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.LinearRing(points_array),
null,
style
)
);
===== Gesione zoom =====
Il livello **minimo** di **zoom** è associato al numero **zero** (slider tutto verso il simbolo **-**). Per sapere a quale valore di scala corrisponde ogni livello di zoom si può aggiungere questo codice al JavaScript:
map.events.register("zoomend", layer_name, function() {
alert("map Zoom: " + map.getZoom() + "\nmap Scale: " + map.getScale());
});
Il codice, associato formalmente ad un layer, viene in realtà eseguito al termine di ogni operazione di zoom e mostra il livello di zoom corrente e il valore di scala.
Aumentando un livello di zoom la scala raddoppia (dimezza il denominatore). Un layer può essere visibile solo a certi valori di scala impostando **''Layer.minScale''** e **''Layer.maxScale''**.
Ecco un esempio di come rendere visibile un layer solo ai livelli di zoom **5**, **6** e **7**:
^ ^ getZoom() ^ getScale() ^ Layer visibile ^
| **+** | 9 | 316388.450 | No |
| | 8 | 632776.900 | No |
| | | 1000000.000 | maxScale |
| | 7 | 1265553.800 | Sì |
| | 6 | 2531107.601 | Sì |
| | 5 | 5062215.202 | Sì |
| | | 9000000.000 | minScale |
| | 4 | 10124430.404 | No |
| | 3 | 20248860.809 | No |
| | 2 | 40497721.618 | No |
| | 1 | 80995443.236 | No |
| **-** | 0 | 161990886.472 | No |
I parametri **''Layer.minResolution''** e **''Layer.maxResolution''** invece non si capisce bene a cosa servono. Il valore impostato in Layer.maxResolution è il valore restituito da ''Layer.getResolution()'' al minimo livello di zoom (zoom 0). Ad ogni livello successivo di zoom, il valore di ''Layer.getResolution()'' è dimezzato fino a raggiungere ''Layer.minResolution''. Ma a che serve?