Заставить слой маркеров OpenLayers рисовать сверху, а под ним выбрать слои - PullRequest
12 голосов
/ 18 января 2011

У меня есть карта 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;
},

Ответы [ 2 ]

7 голосов
/ 27 января 2011

Ответ - если это нормально, вызывать его, используя функцию активации, о которой я упоминал выше. Я попытался переопределить это и удалил вызов moveLayerToTop, и он работает как шарм.

EDIT : Я закончил тем, что добавил этот код в файл js вне библиотеки кода OL, переопределяя функцию активации обработчиков. Это потому, что в противном случае я бы потерял изменения при обновлении базы кода 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;
};
2 голосов
/ 18 сентября 2012

Я обнаружил это, когда у меня возникла та же проблема, когда я пытался заставить несколько слоев реагировать на события мыши.

Решение, на тот случай, если кто-то еще обнаружит этот поток, намного проще.

Элемент управления SelectFeature принимает массив векторных слоев, и если все последующие элементы, которые вам нужно реагировать на события мыши (при наведении и щелчке), находятся в этом массиве, они ВСЕ работают, а не только тот, который был перемещен в верхнюю часть.

Документация предлагает вообще не использовать слои маркеров.В то время как мое решение вращается вокруг геометрических полей PostGIS и позволяет визуализировать данные POINT в векторном слое, все, что использует маркеры, может быть сделано таким образом, и, согласно OpenLayers, должно.

Итак, утвержденное решение для этогонить можно значительно упростить, используя векторные слои для маркеров и делая что-то вроде этого:

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

Это зарегистрирует соответствующие события на обоих слоях и оживит их оба.

Я надеюсь, что этоПомогает другим, спотыкающимся в этом вопросе.

Как уже было сказано, использование OpenLayers не сложно, найти правильный способ сделать что-то с ним - это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...