2012-06-26 92 views
3

假設你有一個標記層和鼠標懸停顯示彈出式窗口的事件偵聽器,像如何移動與縮放級別無關的彈出位置?

var hints = new OpenLayers.Control.SelectFeature(wplayer, { 
    hover: true, 
    eventListeners: { 
    featurehighlighted: function(event) { 
     var feature = event.feature; 
     popup = new OpenLayers.Popup(null, 
     feature.geometry.getBounds().getCenterLonLat().add(3000, 3000), 
     new OpenLayers.Size(200,10), 
     feature.attributes.name, false, null); 
     ... 

到目前爲止是這種情況 - 和add(3000, 3000)轉移位置好嗎。但是我想要將其與當前縮放級別無關地以相同數量的像素進行移位。這樣實際的標記不會被彈出窗口阻止。

這意味着我必須將像(+ 15px,+ 15px)這樣的翻譯轉換爲當前顯示的開放層座標系。在僞代碼:

feature.geometry.getBounds().getCenterLonLat().add(Pixels(15,15).toMap()) 

任何想法如何使用openlayers方法做到這一點?

回答

3

有:

有了這些功能,我們可以計算翻譯是這樣的:

var ll = feature.geometry.getBounds().getCenterLonLat(); 
var px = map.getViewPortPxFromLonLat(ll, 72); 
px = px.add(15, -15); 
ll = map.getLonLatFromViewPortPx(px); 
... 
popup = new OpenLayers.Popup(null, ll, ...); 

可能,還有一種方法查詢當前的視口/屏幕分辨率(abov我只用72)。

+0

感謝分享:)順便說一下,它的工作原理沒有在2.12版本的分辨率。 –

+0

當縮放級別改變時,是否有一種更新彈出窗口位置的簡單方法?對我來說,這隻適用於第一次定位彈出窗口。 – Joel