У меня есть карта OpenLayers с растровым базовым слоем, векторным слоем и слоем маркеров в этом порядке. Они отображаются нормально, в правильном порядке с маркерами сверху векторов, отлично.
Но когда я добавляю элемент управления SelectFeature и указываю его на векторный слой, он внезапно рисуется над слоем маркеров, несмотря на все попытки поднять слой маркера или установить индекс Z. Кажется, что элемент управления SelectFeature переопределяет все настройки порядка рисования. Это по замыслу, или я могу как-то преодолеть это?
Определения слоя:
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
}
);
Определение контроля:
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
}
);
Активация: (без этого слои отрисовываются в правильном порядке)
map.addControl(selectctrl);
selectctrl.activate();
Edit:
Нашел это в OpenLayers.Handler.Feature, где «moveLayerToTop» чувствует себя виновником ... Попробую преодолеть это, но если кто-то знает, что это невозможно, пожалуйста, дайте мне знать!
/**
* 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;
},