Откройте слой 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;
}
});