2015-02-10 85 views
0

我有幾個矢量圖層有一個多邊形,一個有線。我們需要將線添加到附加到多邊形的線層(數據庫過程需要存儲在多邊形屬性中的多邊形ID)Openlayers 2. z軸和選擇控制

所以我對lineLayer有一個drawFeature控件,並且selectFeature (在懸停時存儲ID而不是僅選擇)在polygonLayer上。它實際上工作得很好,除了線圖層的z軸較小外,所以它顯示了在多邊形下繪製的新線條。寧願讓線顯示在多邊形上。我知道這是因爲當selectFeature控件處於活動狀態時,它將多邊形圖層的z-index設置爲高於lineLayer。 我使用lineLayer.setZIndex(800)或其他方式手動設置線層的z-index高於多邊形層,並且確實使新線繪製在多邊形上,但是然後selectFeature事件不會觸發。 我已經考慮了幾種解決方案,包括將drawFeature添加到我的多邊形圖層,然後在完成時將該特徵移動到線條圖層,但它仍然在多邊形下呈現,我甚至在我的樣式地圖的「臨時」樣式上使用了graphicZIndex在多邊形圖層上。無濟於事(我確實在多邊形圖層上設置了renderOptions zindexing爲真)

我可能會從錯誤的角度來處理這個問題,所以我願意提供建議。如果在矢量圖層上有一個像getFeatureByPosition(position)這樣的函數,我可以抓住sketchStarted上的位置,並對sketchEnded事件進行查詢,但到目前爲止,我一直無法找到類似的東西。

我現在不在我的開發箱中,以防萬一有人想知道爲什麼沒有代碼。想要發佈這個工作,但基地網絡有問題顯示登錄頁面(由於ssl我認爲)

回答

0

所以我的解決方案需要幾件事情。首先,我需要從OL 2.10升級到最新的2.13.1。大多數情況下,這是因爲需要添加到2.11(我認爲或者可能是2.12)的新事件,該事件是「特效」,可以在地圖級別捕獲,因此會在所有圖層上觸發,所以我沒有與選擇的Z索引。我從多邊形圖層中刪除了選擇控件,因爲它不是必需的。

var featureOverHandler = function(event){ 
    if (event.feature.layer.id == polygonLayer.id) { 
     selectedPolygonId = event.feature.attributes.POLYGON_ID; 
     console.log("Selected Polygon Id: " + selectedPolygonId); 
     map.events.unregister('featureover',map,featureOverHandler); 
     map.events.register('featureout',map,featureOutHandler); 
    } 
}; 
var featureOutHandler = function (event) { 
    if (event.feature.layer.id == polygonLayer.id) { 
     selectedPolygonId = 0; 
     console.log("Cleared Selected Polygon ID "); 
     map.events.unregister('featureout', map, featureOutHandler); 
     map.events.register('featureover', map, featureOverHandler); 
    } 
}; 

這些將捕獲當前懸停的多邊形。但後來我添加了一些事件來捕捉線條開始和結束的位置。從2.11開始,它們改變了「sketchstarted」事件的工作方式,您可以不再使用它來捕獲添加第一個點時指針所經過的多邊形。我在矢量圖層上使用了點回調。

var vDrawOptions = { 
    callbacks: { 
     "point": function (p) { 
      if (p.parent.components.length == 2) { 
       console.log("First Point added"); 
       startingPolygonId = selectedPolygonId; 
      } 
     } 
    } 
} 
vectorAddControl = new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Path,vDrawOptions); 

然而,「skecthcomplete」仍然可以用來捕捉終點(因此多邊形)

function vSketchComplete(evt) { 
    endingPolygonId = selectedPolygonId; 
}; 
vectorLayer.events.register('sketchcomplete', vectorLayer, vSketchComplete); 

希望這會幫助別人,在類似的情況。