2016-09-06 2 views
1

Ich versuche, eine Maus Hover-Ereignis mit dem folgenden Verfahren aus der offiziellen OL3 Beispiele Seite genommen zu erstellen:Openlayers 3 hasFeatureAtPixel Filter für Schicht

http://openlayers.org/en/latest/examples/earthquake-clusters.html

ich nur die Aktion auszulösen müssen, wenn sie über ein Schweben bestimmte Schicht. Nachdem ich die offizielle Dokumentation konsultiert hatte, entdeckte ich, dass Sie mit hasFeatureAtPixel eine Layer-Filter-Funktion verwenden können, aber es scheint nicht zu funktionieren.

map.on('pointermove', function(evt) { 
    if (evt.dragging) { 
     return; 
    } 
    var pixel = map.getEventPixel(evt.originalEvent); 
    var hit = map.hasFeatureAtPixel(pixel, function(feature, layer) { 
     console.log(layer); 
     console.log(feature);  
    }); 
}); 

Die console.log Anrufe führen in Feature-Objekte in der Konsole gegeben werden, aber keine Schicht, Objekte, werden diese als "undefined zurückgegeben. Es sind die Ebenenobjekte, die ich testen muss, ob die Ebene die richtige ist.

Irgendwelche Ideen, warum das nicht funktioniert?

Antwort

1

Die Filterfunktion erhält ein Argument, den Layer-Kandidaten und es sollte einen booleschen Wert zurückgeben.

From API Docs.

Lasst uns sagen, dass Sie eine Schicht wie haben:

map.on('pointermove', function(e) { 
    if (e.dragging) return; 

    var hit = map.hasFeatureAtPixel(e.pixel, function(layer) { 
    return layer.get('name') === 'test'; // boolean 
    }); 
    map.getTarget().style.cursor = hit ? 'pointer' : ''; 
}); 
+0

Meine Vektorebenen haben leider keine Namen, ich vergleiche normalerweise Layerobjekte, um die Layer zu identifizieren. Ist nicht das erste Argument in der Layer-Filter-Funktion ein Feature, keine Ebene? Aus diesem Grund habe ich eine console.out-Methode demonstriert, weil ich von der Layer-Filter-Funktion nicht auf die Ebene zugreifen kann, sie erscheint als undefiniert. Ich werde das aber versuchen, danke :) –

+0

Es spielt keine Rolle, wie Sie die Schicht, die Sie wollen, überprüfen, die Frage ist, wie die Schicht Filter implementieren. Siehe aktualisierte Antwort. –

+0

Mein Fehler war die Verwendung eines falschen Beispielcodes, um mein Problem zu lösen. Das Problem war einfach, das Argument in der Filterfunktion ist die Ebene, nicht das Feature, wie Sie gezeigt haben. Problem gelöst. –

2

Tatsächlich ist die API neu geschrieben (v4:

var vectorLayer = new ol.layer.Vector({ 
    name: 'test', 
    // ... 
}); 

Sie können eine Schicht Filterfunktion wie hinzuzufügen. 0,1), das Arbeitsbeispiel ist wie folgt:

var hit = map.hasFeatureAtPixel(e.pixel, { 
    layerFilter: function (layer) { 
     return layer.get('name') === 'test'; 
    } 
}); 
+0

Mann, das hat mir heute wirklich meine Haut gerettet, ich war verrückt geworden, um herauszufinden, warum es nicht funktioniert hat. Es ist wahr, es ist in der API, aber die Art der Umsetzung ist nicht so klar für diejenigen, die, wie ich, sind nicht so an JS gewöhnt. –