Open Layers: applicare stili agli elementi di layers vettoriali

ATTENZIONE! Il post ha più di 2 anni e le informazioni contenute potrebbero essere obsolete (ad esempio a causa di un aggiornamento di versione rispetto agli elementi descritti o links modificati da siti esterni).

Con OpenLayers è possibile visualizzare overlays vettoriali sopra alle mappe per mostrare ad esempio informazioni aggiuntive di un punto / zona. Ai vettori aggiunti è possibile applicare degli stili differenti (dimensioni, colori, icone, ...) in base alle proprietà di ciascun oggetto (feature) tramite la classe OpenLayers.Rule() . Un insieme di "features" sono descritte in formato GeoJSON nel seguente modo:


{ "type": "FeatureCollection",
 "features":
 [
  {
  "type":"Feature",
  "id":"OpenLayers.Feature.Vector_1",
  "properties":{
   "colore":"1"
  },
  "geometry":{
   "type":"Point",
   "coordinates":["13.38920500", "45.67558400"]
  },
  "crs":{
   "type":"name",
   "properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}
  }
 },
  {
  "type":"Feature",
  "id":"OpenLayers.Feature.Vector_2",
  "properties":{
   "colore":"2",
  },
  "geometry":{
   "type":"Point",
   "coordinates":["13.38921800", "45.67546900"]
  },
  "crs":{
   "type":"name",
   "properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}
  }
 },
  {
  "type":"Feature",
  "id":"OpenLayers.Feature.Vector_3",
  "properties":{
   "colore":"3",
  },
  "geometry":{
   "type":"Point",
   "coordinates":["13.38917800", "45.67540000"]
  },
  "crs":{
   "type":"name",
   "properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}
  }
 }
   ]
}

Ogni feature presenta una serie di parametri per identificare univocamente l'oggetto (id), la posizione (geometry) e  il sistema di riferimento (crs) , i quali vengono automaticamente interpretati da OpenLayers. All'interno di  "properties" è invece possibile definire una serie di parametri custom (nell'esempio c'è solo il colore ma se ne possono aggiungere altri in base alle necessità). Nel codice seguente è possibile vedere come vengono definiti gli stili nel metodo addLayers() tramite la creazione di regole personalizzate in base al parametro "colore" delle features. Successivamente nel metodo showElements() le features vengono aggiunte al layer vettoriale. E' possibile visualizzare il codice completo nel codice sorgente della pagina DEMO.


function Mappa ( options ) {

 //codice INIZIALIZZAZIONE

 // World Geodetic System 1984 projection
 this.WGS84 = new OpenLayers.Projection("EPSG:4326");
 // WGS84 Google Mercator projection
 this.WGS84_google_mercator = new OpenLayers.Projection("EPSG:900913");
 //layers
 this.near_elements_layer = null;

 //codice AGGIUNTA MAPPE BASE

 /**
 * Aggiunge layer vettoriale
 */
 this.addLayers = function(){
  //stile base dei punti vettoriali
  var style = new OpenLayers.Style({
   fillOpacity : 0.8,
   pointRadius : 5,
   strokeWidth : 0,
   graphicName : "circle",
   cursor: 'pointer'
  });
  //stili personalizzati in base alla proprietà "colore"
  var rA = new OpenLayers.Rule({
   filter: new OpenLayers.Filter.Comparison({
    property: "colore",type: OpenLayers.Filter.Comparison.EQUAL_TO,value: 1
   }),
   symbolizer: {fillColor: "#00ff00"}
  });
  var rB = new OpenLayers.Rule({
   filter: new OpenLayers.Filter.Comparison({
    property: "colore",type: OpenLayers.Filter.Comparison.EQUAL_TO,value: 2
   }),
   symbolizer: {fillColor: "#0000ff"}
  });
  var rC = new OpenLayers.Rule({
   filter: new OpenLayers.Filter.Comparison({
    property: "colore",type: OpenLayers.Filter.Comparison.EQUAL_TO,value: 3
   }),
   symbolizer: {fillColor: "#ff0000"}
  });
  var rD = new OpenLayers.Rule({
   filter: new OpenLayers.Filter.Comparison({
    property: "colore",type: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO,value: 4
   }),
   symbolizer: {fillColor: "#000000"}
  });

  style.addRules([rA,rB,rC,rD]);
  //creazione del layer
  this.near_elements_layer = new OpenLayers.Layer.Vector("Elementi vicini", {
   displayInLayerSwitcher:false,
   name:'near_elements_layer',
   projection: this.WGS84,
   styleMap: style //stili da applicare al layer
  });

  //aggiunge layer alla mappa
  this.map.addLayers([this.near_elements_layer]);
 }
 /**
 * Visualizzazione degli elementi
 */
 this.showElements = function(){
  //ricava lista features da una textarea (possono essere ricavate anche tramite AJAX o altri metodi)
  var data = $('.input_data').val();
  $this = this;
  //eliminazione features aggiunte in precedenza (se presenti)
  $this.near_elements_layer.destroyFeatures();
  //inizializzazione del formato di lettura GeoJSON:
  //i punti della features sono in formato WGS84
  var geojson_format = new OpenLayers.Format.GeoJSON({
   'internalProjection': $this.map.baseLayer.projection,
   'externalProjection': $this.WGS84
  });
  //lettura delle features
  var features = geojson_format.read(data);
  //aggiunte degli elementi sul layer vettoriale
  if(features.length > 0){
   $this.near_elements_layer.addFeatures(features);
  }
 }

 //codice GESTIONE MAPPA
}

I tipi di comparazione previsti dai filtri sono:

  • OpenLayers.Filter.Comparison.EQUAL_TO = “==”;
  • OpenLayers.Filter.Comparison.NOT_EQUAL_TO = “!=”;
  • OpenLayers.Filter.Comparison.LESS_THAN = “<”;
  • OpenLayers.Filter.Comparison.GREATER_THAN = “>”;
  • OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO = “<=”;
  • OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = “>=”;
  • OpenLayers.Filter.Comparison.BETWEEN = “..”;
  • OpenLayers.Filter.Comparison.LIKE = “~”;

Links:

Condividi questo post


Commenti