#openlayers-3
#openlayers-3
Вопрос:
Я хочу получить разные наложенные слои, нажав на карту, чтобы пользователь мог выбрать, какой из них хочет получить информацию об объекте через всплывающее окно. Я использую map.forEachFeatureAtPixel, но я просто получаю один из наложенных слоев.
var prue=[];
layers=[]
var displayFeatureInfo = function(pixel) {
var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) {
l=layer.get('name');
console.log("CAPA:",l)
layers.push(l);
console.log(layers);
if (layer == rustic_wfs){
var capa= "rustica";
prue[0]=capa;
return feature;};
if (layer == zonas_wfs){
var capa="zonas";
prue[0]=capa;
return feature;}
});
map.on('click', function(evt) {
displayFeatureInfo(evt.pixel);
});
Ответ №1:
ol.Map#forEachFeatureAtPixel
Будет вызываться со всеми объектами в указанном пикселе, пока вы не вернете истинное значение, что вы делаете в своем snippet ( return feature
) . Поэтому, чтобы получить все функции, никогда не возвращайте истинное значение. Функция должна выглядеть примерно так:
var layers = [];
map.forEachFeatureAtPixel(pixel, function(feature, layer) {
if (layers.indexOf(layer) == -1) {
layers.push(layer);
}
});
Ответ №2:
Попробуйте что-то вроде этого:
function displayFeatureInfo(evt) {
var txt = "";
olMap.forEachFeatureAtPixel(evt.pixel, function (feature, source) {
//In the feature is the information of layer
//In the source is the layer
//you can save the "source" in you array to get all layers
var features = feature.getProperties();
Object.getOwnPropertyNames(features).forEach(function (campo, idx, array) {
var valor = features[campo];
txt = "<b>" campo ":</b> " valor "<br />";
});
var coordinate = evt.coordinate;
content.innerHTML = "<p style='padding: 0px'><b>Información:</b></p>" txt "<br/>";
txt = "<br/>------------------------<br/><br/>";
overlay.setPosition(coordinate);
});
};
Игнорируйте «наложение» и «содержимое», это так, как я показываю всплывающее окно
Комментарии:
1. Я попытался сохранить исходные файлы или слои, а затем зациклить их, но я думаю, что проблема все еще существует. Когда я нажимаю на два наложенных слоя, он просто распознает один из них. Может быть, функция не предназначена для этой цели?
2. Посмотрите на вашу «функцию возврата», когда вы возвращаетесь в цикл, он прерывает цикл и не продолжает работу с другими слоями, другими словами, у вас есть только цикл из 1 итерации, я рекомендую сохранить объект в вашем массиве, что-то вроде «var layerinfo = {функции: объект, слои: layer}», а затем «layers.push (layerinfo)», чтобы вы могли получить все слои и все объекты после завершения цикла