2016-09-06 89 views
1

我試圖使用從官方OL3例子頁面採取以下方法來創建一個鼠標懸停事件3 hasFeatureAtPixel過濾器:的OpenLayers的層

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

我只需要觸發動作懸停在當特定層。在諮詢過官方文檔後,我發現你可以使用hasFeatureAtPixel的圖層過濾功能,但它看起來並沒有工作。

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);  
    }); 
}); 

console.log調用導致在控制檯中給出要素對象,但沒有圖層對象,這些對象返回爲'undefined'。它是我需要測試圖層是否正確的圖層對象。

任何想法爲什麼這不起作用?

回答

1

過濾器函數將接收一個參數,層候選者和 它應該返回一個布爾值。

From API Docs.

比方說,你有一個像層:

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

您可以添加一個圖層過濾器功能,如:

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

不幸的是,我的矢量圖層沒有名稱,我通常比較圖層對象來識別圖層。另外,不是圖層過濾器函數中的第一個參數,而不是圖層?這就是爲什麼我演示了一個console.out方法,因爲我似乎無法從圖層過濾器函數中獲取圖層,因此未定義。我會嘗試這個,雖然,謝謝:) –

+0

你會檢查你想要的圖層的方式並不重要,問題是如何實現圖層過濾器。查看更新的答案。 –

+0

我的錯誤是使用不正確的示例代碼來嘗試解決我的問題。問題很簡單,過濾器函數中的參數是圖層,而不是您已經演示的功能。問題解決了。 –

2

其實API被重寫(V4。 0.1),工作示例如下:

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

男人,今天真的救了我的皮,我瘋了,試圖找出爲什麼它不起作用。這是真的,它在API中,但是對於像我這樣的人來說,實現它的方式並不那麼習慣JS。 –