2011-01-18 7 views
12

私は、ラスターベースレイヤー、ベクターレイヤー、マーカーレイヤーの順にOpenLayersマップを持っています。それらは、ベクトルの上にマーカーがある、正しい順序で、うまく表示されます。OpenLayersマーカーレイヤーを上に描画し、選択可能なレイヤーを下に置くようにします

しかしSelectFeatureコントロールを追加してベクトルレイヤーをポイントすると、マーカーレイヤーを上げたりZインデックスを設定したりしても、突然マーカーレイヤーの上に描画されます。 SelectFeatureコントロールは、すべての描画順序設定をオーバーライドするようです。これは設計によるのですか、それとも何とかこれを克服できますか?

層定義:

var baselayer = new OpenLayers.Layer.WMS('Norden', 
'http://{myarcgisserver}/ArcGIS/services/mylayer/MapServer/WMSServer', { 
    layers :'1,2', 
    transparent :false, 
    width :'auto', 
    height :'auto', 
    filter :null 
}, { 
    isBaseLayer: true, 
    singleTile :true, 
    ratio :1, 
    alpha :false, 
    transitionEffect :'resize' 
}); 

var vectorLayer = new OpenLayers.Layer.Vector("Work orders", { 
    projection: new OpenLayers.Projection("EPSG:2400"), 
    strategies: [new OpenLayers.Strategy.Fixed(), refresh], 
    protocol: new OpenLayers.Protocol.HTTP({ 
     url: "/WorkOrder/WorkOrders.ashx?output=geojson", 
     format: new OpenLayers.Format.GeoJSON() 
    }) 
}); 

var markerlayer = new OpenLayers.Layer.Markers("Markers", { 
    projection: new OpenLayers.Projection("EPSG:2400"), 
    displayInLayerSwitcher: false 
} 
); 

コントロール定義:

var selectctrl = new OpenLayers.Control.SelectFeature(
    vectorLayer, 
    { 
     clickout: true, 
     toggle: false, 
     multiple: false, 
     hover: false, 
     toggleKey: "ctrlKey", // ctrl key removes from selection 
     multipleKey: "shiftKey", // shift key adds to selection 
     box: false 
    } 
); 

活性化(これがなければ、層は正しい順序で描画)

map.addControl(selectctrl); 

selectctrl.activate(); 

編集: が見つかりこれはOpenLayers.Handler.Featureの "moveLayerToTop"が犯人...それを克服しようとするが、誰かがそれが不可能であることを知っているなら、私に知らせてください!

/** 
* Method: activate 
* Turn on the handler. Returns false if the handler was already active. 
* 
* Returns: 
* {Boolean} 
*/ 
activate: function() { 
    var activated = false; 
    if(OpenLayers.Handler.prototype.activate.apply(this, arguments)) { 
     this.moveLayerToTop(); 
     this.map.events.on({ 
      "removelayer": this.handleMapEvents, 
      "changelayer": this.handleMapEvents, 
      scope: this 
     }); 
     activated = true; 
    } 
    return activated; 
}, 

答えて

7

答え - 私が上で言及した活性化関数にあると答えてもいいですか?私はそれをオーバーライドしようとし、moveLayerToTopの呼び出しを削除し、それは魅力のように動作します。

EDIT : このコードを、OLコードライブラリの外側のjsファイルに追加して、ハンドラのactivate関数をオーバーライドしました。これは、OpenLayersコードベースの更新で変更を失うためです。

OpenLayers.Handler.Feature.prototype.activate = function() { 
    var activated = false; 
    if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) { 
     //this.moveLayerToTop(); 
     this.map.events.on({ 
      "removelayer": this.handleMapEvents, 
      "changelayer": this.handleMapEvents, 
      scope: this 
     }); 
     activated = true; 
    } 
    return activated; 
}; 
+0

あなたは何か天才ですか? – Johnny

+0

@Johnny:ハハ、ありがとう!あなたは私の一日を作った! :-) –

+1

@ニカラ:ソリューションを投稿するためのNiklasに感謝します。実際にはうまく動作しています:) – Nachiket

2

マウスイベントに反応する複数のレイヤーを取得しようとすると、同じ問題が発生したときにこれが見つかりました。

解決策は、他の誰かがこのスレッドを見つけた場合に備えて、はるかに簡単です。

SelectFeatureコントロールはVectorレイヤーの配列を取ります。マウスイベントに反応する必要があるすべてのラッパー(ホバーとクリック)がその配列にある場合は、上に移動したものだけでなく、すべてが機能します。

ドキュメントでは、マーカーレイヤーをまったく使用しないことを推奨しています。私のソリューションはPostGISのジオメトリフィールドを中心にしており、POINTデータをベクターレイヤーにレンダリングすることができますが、マーカーを使用するものはこの方法で行うことができ、OpenLayersによるとします。

ので、このスレッドに承認されたソリューションは、多くのこのような何かをマーカーのベクタレイヤーを使用してやって簡素化することができます。これは、両方の層に適切なイベントを登録し、それらの両方が住むようになります

this.carSelect = new OpenLayers.Control.SelectFeature(
    [vectorsLayer, markersLayer], 
    { 
     'hover':true, 
     'callbacks': { 
      blah blah blah 
    } 
}); 

私はこれが他の誰かがこの問題に遭遇するのを助けることを望みます。

他のところで述べたように、OpenLayersを使用するのは難しくありません。正しい方法を見つけることは難しいです。

+0

興味深い!間違いなくこれをチェックします。 :-) –

+0

私はこのまったく同じ問題に遭遇しました。ヒントをありがとう。今度は、ベクターレイヤー内にマーカーを配置する方法を見つける必要があります。あなたがあなたの答えをより完全にすることを心がけているなら、あなたはそれを行う方法を記述することができます。 – Hoffmann