2011-01-18 13 views
12

Ho una mappa OpenLayers con un livello base raster, un livello vettoriale e un livello marcatori in questo ordine. Visualizzano bene, nell'ordine corretto con i marcatori in cima ai vettori, grandiosi.Forzare un livello Marker OpenLayers per disegnare in alto e con livelli selezionabili sotto

Ma quando aggiungo un controllo SelectFeature e lo indirizza al livello vettoriale, viene improvvisamente disegnato sopra il livello dei marker, nonostante tutti gli sforzi per aumentare il livello del marker o impostare l'indice Z. Sembra che il controllo SelectFeature sovrascriva tutte le impostazioni dell'ordine di disegno. È questo di progettazione, o posso superare questo in qualche modo?

Le definizioni di layer:

var baselayer = new OpenLayers.Layer.WMS('Norden', 
'http://{myarcgisserver}/ArcGIS/services/mylayer/MapServer/WMSServer', { 
    layers :'1,2', 
    transparent :false, 
    width :'auto', 
    height :'auto', 
    filter :null 
}, { 
    isBaseLayer: true, 
    singleTile :true, 
    ratio :1, 
    alpha :false, 
    transitionEffect :'resize' 
}); 

var vectorLayer = new OpenLayers.Layer.Vector("Work orders", { 
    projection: new OpenLayers.Projection("EPSG:2400"), 
    strategies: [new OpenLayers.Strategy.Fixed(), refresh], 
    protocol: new OpenLayers.Protocol.HTTP({ 
     url: "/WorkOrder/WorkOrders.ashx?output=geojson", 
     format: new OpenLayers.Format.GeoJSON() 
    }) 
}); 

var markerlayer = new OpenLayers.Layer.Markers("Markers", { 
    projection: new OpenLayers.Projection("EPSG:2400"), 
    displayInLayerSwitcher: false 
} 
); 

La definizione di controllo:

var selectctrl = new OpenLayers.Control.SelectFeature(
    vectorLayer, 
    { 
     clickout: true, 
     toggle: false, 
     multiple: false, 
     hover: false, 
     toggleKey: "ctrlKey", // ctrl key removes from selection 
     multipleKey: "shiftKey", // shift key adds to selection 
     box: false 
    } 
); 

Attivazione: (Senza questo, gli strati disegnano nell'ordine corretto)

map.addControl(selectctrl); 

selectctrl.activate(); 

Edit: Trovati questo in OpenLayers.Handler.Feature, dove il "moveLayerToTop" si sente come il colpevole ... cercherà di superarlo, ma se qualcuno lo sa che è impossibile, per favore fatemelo sapere!

/** 
* Method: activate 
* Turn on the handler. Returns false if the handler was already active. 
* 
* Returns: 
* {Boolean} 
*/ 
activate: function() { 
    var activated = false; 
    if(OpenLayers.Handler.prototype.activate.apply(this, arguments)) { 
     this.moveLayerToTop(); 
     this.map.events.on({ 
      "removelayer": this.handleMapEvents, 
      "changelayer": this.handleMapEvents, 
      scope: this 
     }); 
     activated = true; 
    } 
    return activated; 
}, 

risposta

7

La risposta - se è ok per chiamare che si trova nella funzione di attivazione che ho citato sopra. Ho provato a sovrascriverlo e ho rimosso la chiamata a moveLayerToTop, e funziona come un incantesimo.

EDIT: ho finito per l'aggiunta di questo codice in un file js al di fuori della libreria di codice OL, ignorando i gestori funzione attivano. Questo perché altrimenti perderei la modifica su un aggiornamento della base di codice OpenLayers.

OpenLayers.Handler.Feature.prototype.activate = function() { 
    var activated = false; 
    if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) { 
     //this.moveLayerToTop(); 
     this.map.events.on({ 
      "removelayer": this.handleMapEvents, 
      "changelayer": this.handleMapEvents, 
      scope: this 
     }); 
     activated = true; 
    } 
    return activated; 
}; 
+0

Lei signore è una specie di genio! – Johnny

+0

@Johnny: haha, grazie! Hai reso la mia giornata! :-) –

+1

@Nikalas: Grazie Niklas per la soluzione di pubblicazione. Funziona molto bene e come previsto :) – Nachiket

2

Ho trovato questo quando ho avuto lo stesso problema, cercando di ottenere più livelli di reagire agli eventi del mouse.

La soluzione, nel caso in cui chiunque altro trovi questo thread è molto più semplice.

Il controllo SelectFeature accetta una serie di livelli Vector e se tutti i livelli di latenza necessari per reagire agli eventi del mouse (hover e clic) si trovano in quell'array, funzionano TUTTI, non solo quello spostato in alto.

La documentazione suggerisce di non utilizzare affatto i livelli degli indicatori. Mentre la mia soluzione ruota attorno ai campi geometrici di PostGIS e si presta a rendere i dati POINT in un livello vettoriale, tutto ciò che usa Marker può essere fatto in questo modo, e secondo OpenLayers, dovrebbe.

Quindi, la soluzione approvata a questo thread può essere molto più semplificata utilizzando livelli vettoriali per i marcatori e fare qualcosa di simile:

this.carSelect = new OpenLayers.Control.SelectFeature(
    [vectorsLayer, markersLayer], 
    { 
     'hover':true, 
     'callbacks': { 
      blah blah blah 
    } 
}); 

Questo registrerà gli eventi appropriati su entrambi gli strati e renderli entrambi vivono.

Spero che questo aiuti chiunque altro inciampa su questo problema.

Come detto altrove, l'uso di OpenLayers non è difficile, trovare il modo corretto di farlo è farlo.

+0

Interessante! Lo verificherò sicuramente. :-) –

+0

Mi sono imbattuto in questo stesso identico problema, grazie per i suggerimenti. Ora devo scoprire come inserire i marcatori all'interno di un livello Vector. Se ti interessa rendere la tua risposta più completa, potresti descrivere come farlo. – Hoffmann

Problemi correlati