OL3: получение наложенных слоев по координате

#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)», чтобы вы могли получить все слои и все объекты после завершения цикла