2015-07-08 32 views
7

Nie mogę znaleźć sposobu przejścia z elementu w zdarzeniu wyboru do warstwy, która może być częścią bez przechodzenia przez wszystkie funkcje wszystkich warstw mapy lub przechowywania sztucznego identyfikatora warstwy w każdym obiekcie przy tworzeniu . Czy to jeszcze nie jest możliwe?Jak uzyskać warstwę z funkcji w Openlayers 3?

ol.js 3.7.0 ol.interaction.Selection -> kliknij -> zwrotna (event) {event.selected [0]}

W innej części mojego app, chciałbym przejść od funkcja do warstwy, aby określić styl używany w tej funkcji, w szczególności to, czy jest ona widoczna, czy nie.

ol.Feature.getStyle() || ol.Feature -> (warstwa?) -> getStyle()

+0

Jonatas za odpowiedź dla wyboru, aby użyć filtra, działa z dodatkowym zastrzeżeniem, że muszę przechowywać wszystkie elementy, które przechodzą przez funkcję "filtru" w lokalnej tablicy, i w procedurze wyboru zdarzenia (wywołania zwrotnego), dopasowują wybraną funkcję do jeden z tych elementów tablicy i wyczyść tablicę. – ryansstack

Odpowiedz

9

Można spróbować z funkcją filtra:

var select = new ol.interaction.Select({ 
    condition: ..., 
    filter: function(feature, layer){ 
     console.info(feature); 
     console.info(layer.get('name')); 
    } 
}); 

UPDATE

wymyśliłem tego prototypied metodzie robi praca:

http://jsfiddle.net/jonataswalker/r242y7ke/

/** 
* This is a workaround. 
* Returns the associated layer. 
* @param {ol.Map} map. 
* @return {ol.layer.Vector} Layer. 
*/ 
ol.Feature.prototype.getLayer = function(map) { 
    var this_ = this, layer_, layersToLookFor = []; 
    /** 
    * Populates array layersToLookFor with only 
    * layers that have features 
    */ 
    var check = function(layer){ 
     var source = layer.getSource(); 
     if(source instanceof ol.source.Vector){ 
      var features = source.getFeatures(); 
      if(features.length > 0){ 
       layersToLookFor.push({ 
        layer: layer, 
        features: features 
       }); 
      } 
     } 
    }; 
    //loop through map layers 
    map.getLayers().forEach(function(layer){ 
     if (layer instanceof ol.layer.Group) { 
      layer.getLayers().forEach(check); 
     } else { 
      check(layer); 
     } 
    }); 
    layersToLookFor.forEach(function(obj){ 
     var found = obj.features.some(function(feature){ 
      return this_ === feature; 
     }); 
     if(found){ 
      //this is the layer we want 
      layer_ = obj.layer; 
     } 
    }); 
    return layer_; 
}; 

select.on('select', function(evt){ 
    var feature = evt.selected[0]; 
    if(feature){ 
     var layer = feature.getLayer(map); 

     console.info(layer.getStyle()); 
     console.info(layer.get('name')); 
    } 
}); 
+0

Widziałem to, ale w innej części mojej aplikacji chciałbym przejść od funkcji do warstwy ... dodam ją do pytania. Ale spróbuję tej sugestii, jeśli to zadziała ... na razie wystarczająco dobrze :) – ryansstack

+0

Co powiesz na zapisanie referencji do późniejszego użycia? –

+0

Jeśli chodzi o przechowywanie odniesień zewnętrznych, jest to jeden sposób, ale jestem zainteresowany tym pytaniem, aby wiedzieć, czy istnieje sposób przejścia z funkcji do warstwy w ramach – ryansstack