簡體   English   中英

Openlayers 2. z軸和選擇控制

[英]Openlayers 2. z-axis and select control

我有幾個矢量圖層,一個有多邊形,一個有線條。 我們需要在連接到多邊形的線圖層上添加線條(數據庫過程需要多邊形ID,這些ID存儲在多邊形的屬性中)

所以我在lineLayer上有一個drawFeature控件,在polygonLayer上有一個selectFeature(在懸停時存儲ID而不是只選擇)。 它實際上工作得很好,除了添加時線層的z軸較低,因此它顯示了在多邊形下方繪制的新線。 寧願在多邊形上顯示線。 我知道這是因為當selectFeature控件處於活動狀態時,它將多邊形圖層的z索引設置為比lineLayer高。 我使用lineLayer.setZIndex(800)或其他方法手動將線層的z-index設置為高於多邊形層,這肯定會使新線繪制在多邊形上,但是selectFeature事件不會觸發。 我考慮了幾種解決方案,包括將drawFeature添加到多邊形層,然后在完成后將其移動到線層,但是它仍在多邊形下渲染,我什至在我的樣式圖上使用了“臨時”樣式的graphicZIndex多邊形層。 沒有用(我確實在多邊形圖層上將renderOptions zindexing設置為true)

我可能從錯誤的角度接近這個,所以我願意接受建議。 如果矢量層上有可用的函數,例如getFeatureByPosition(position),我可以在sketchStarted和sketchEnded事件上獲取位置並進行查詢,但是到目前為止,我一直找不到這樣的東西。

我現在不在我的開發盒上,萬一有人想知道為什么沒有代碼。 希望從工作中發布此信息,但基本網絡在顯示登錄頁面時出現問題(由於我認為是ssl)

所以我的解決方案需要一些東西。 首先,我需要從OL 2.10升級到最新的2.13.1。 大多數情況下,這是因為需要一個新的事件被添加到2.11(我認為或者可能是2.12),事件是“featureover”,可以在地圖級別捕獲,因此將觸發所有圖層,所以我不打算與Z-Index的選擇。 我從多邊形圖層中刪除了選擇控件,因為它不需要。

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

希望這會在類似情況下幫助其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM