У меня есть карта 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();
Изменить: Обнаружил это в 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;
},