2011-01-18 6 views
12

Tengo un mapa OpenLayers con una capa base ráster, una capa vectorial y una capa marcadores en ese orden. Se muestran bien, en el orden correcto con los marcadores en la parte superior de los vectores, genial.Obligar a una capa OpenLayers Markers a dibujar en la parte superior y tener capas seleccionables debajo de

Pero cuando agrego un control SelectFeature y lo señalo a la capa vectorial, de repente se dibuja sobre la capa de marcadores, a pesar de todos los esfuerzos para elevar la capa de marcador o establecer el índice Z. Parece que el control SelectFeature anula todas las configuraciones de orden de dibujo. ¿Es esto por diseño, o puedo superar esto de alguna manera?

Las definiciones de capa:

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 definición de control:

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 
    } 
); 

de activación: (Sin esto, las capas se basan en el orden correcto)

map.addControl(selectctrl); 

selectctrl.activate(); 

Editar: Encontrado esto en OpenLayers.Handler.Feature, donde el "moveLayerToTop" se siente como el culpable ... Trataré de superarlo, pero si alguien sabe que es imposible, ¡por favor hágamelo saber!

/** 
* 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; 
}, 

Respuesta

7

La respuesta - si es correcto llamarlo que se encuentra en la función de activación que menciono arriba. Traté de anular eso y eliminé la llamada a moveLayerToTop, y funciona como un amuleto.

EDITAR: que terminó añadiendo este código en un archivo js fuera de la biblioteca de códigos OL, anulando los manipuladores de función activan. Esto se debe a que, de lo contrario, perdería el cambio en una actualización de la base de código 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

¡Usted señor es una especie de genio! – Johnny

+0

@Johnny: jaja, gracias! ¡Me has alegrado el día! :-) –

+1

@Nikalas: Gracias Niklas por publicar la solución. Funciona muy bien y como se esperaba :) – Nachiket

2

Encontré esto cuando tuve el mismo problema, tratando de obtener varias capas para reaccionar a los eventos del mouse.

La solución, por si acaso alguien más encuentra este hilo es mucho más simple.

El control SelectFeature toma una matriz de capas Vector y si todas las laters que necesita para reaccionar a los eventos del mouse (hover y hacer clic) están en esa matriz, TODAS funcionan, no solo la que se movió a la parte superior.

La documentación sugiere que no se deben usar capas de marcadores. Si bien mi solución gira en torno a los campos de geometría PostGIS y se presta para renderizar datos POINT en una capa vectorial, todo lo que use Marcadores se puede hacer de esta manera, y según OpenLayers, debería hacerlo.

Por lo tanto, la solución aprobada a este hilo se puede simplifica mucho el uso de capas vectoriales para los marcadores y hacer algo como esto:

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

Esto registrará los eventos correspondientes en ambas capas y hacer que ambos viven.

Espero que esto ayude a cualquier persona a tropezar con este problema.

Como dije en otro lugar, usar OpenLayers no es difícil, es encontrar la manera correcta de hacer las cosas con él.

+0

¡Interesante! Definitivamente verificará esto. :-) –

+0

Me encontré con este mismo problema exacto, gracias por los consejos. Ahora tengo que descubrir cómo poner marcadores dentro de una capa Vector. Si le interesa completar su respuesta, puede describir cómo hacerlo. – Hoffmann

Cuestiones relacionadas