Откройте слой 3, нажмите на слой лучших методов

Я новичок в OL.

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

Я должен заявить, что я не пишу проект с нуля, и я на самом деле унаследовал очень простую, но сложную систему.

Система получает слои из MapGuide 2.5.

Вот как карта инициируется:

 var map = new ol.Map({
            loadTilesWhileInteracting:true,
            layers: this.layers,
            target: this._element[0],
            controls: controls,
            interactions: interactions,
            view: view
        });

 view.fit(that.extent, map.getSize());

Я попытался добавить взаимодействие выбора - это не сработало (мое обещание никогда не вызывалось).

var select_interaction = new ol.interaction.Select();

select_interaction.getFeatures().on("add", function (e) { 
     var feature = e.element; //the feature selected
});

map.addInteraction(select_interaction);

Я старался:

map.on('click', function (evt) {
            var feature = map.forEachFeatureAtPixel(evt.pixel,
              function (feature, layer) {
                  debugger;
                  this.log("fff")
              });
        });

В этом случае обещание работает, но я не получаю никаких функций.

РЕДАКТИРОВАТЬ:

Я также попробовал:

var feature = map.forEachLayerAtPixel(evt.pixel,
              function (feature, layer) {..}

но я получаю исключение:

uncaught security error:  Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.  ol.js:341

Как я могу это сделать?

Спасибо идо

1 ответ

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

Благодаря комментарию @kagelos мне удалось решить проблему, просто отфильтровав слои и пройдя только векторные слои.

Типы слоев грубо разделены на две категории в OL. Слои изображений (плитки и т. Д.) И векторные слои. Вы должны проверить содержимое this.layers, которое вы передаете в качестве аргумента в конструктор карты, и посмотреть, какой тип слоев он содержит. Вы можете напрямую взаимодействовать только со слоями векторного типа.

Вот окончательный код:

Map.forEachLayerAtPixel( cursorPosition, function ( _layer ) {

  // you will get the vector layer here

}, this, function ( _layer ) {

    if ( _layer instanceof ol.layer.Vector ) {
        return true;
    }
});
Другие вопросы по тегам