マップに追加される順序に関係なく、特定のレイヤーを常に他のレイヤーの上に配置したいと思います。 bringToFront()
を認識していますが、要件を満たしていません。プロパティに基づいて動的にzIndexを設定したいと思います。
LeafletにはメソッドsetZIndex()
がありますが、これはgeoJsonレイヤーでは機能しないようです: https://jsfiddle.net/jw2srhwn/
何か案は?
ベクトルジオメトリに対しては実行できません。
zIndex
はHTMLElement
sのプロパティであり、ベクトルジオメトリ(線とポリゴン)はSVG要素として、またはプログラムで_<canvas>
_描画呼び出しとしてレンダリングされます。これらの2つの方法には、zIndex
の概念がないため、機能するのは、要素をSVGグループの上部(または下部)または_<canvas>
_描画シーケンスにプッシュすることだけです。
また、_L.GeoJSON
_は_L.LayerGroup
_の特定のタイプであり、_L.Polygon
_のインスタンスが含まれている場合は注意してください。さらに、 _L.LayerGroup
_のsetZIndex()
メソッドに関するLeafletのドキュメント を読んだ場合:
このグループに含まれるすべてのレイヤーで
setZIndex
を呼び出し、z-indexを渡します。
では、_L.Polygon
_ sにはsetZIndex()
メソッドがありますか?いいえ。それを含むグループでそれを呼び出しても何も起こりません。ただし、そのグループに含まれるすべての_L.GridLayer
_に影響します。
あなたの問題に戻って:
マップに追加される順序に関係なく、特定のレイヤーを常に他のレイヤーの上に配置したいと思います。
あなたが探しているのはマップペインのようです。 マップペインのチュートリアル を読んでください。
これが、Leaflet 1.0でユーザー定義の「ペイン」を実装する理由の1つです(バージョン0.xと比較して)。
var myPane = map.createPane("myPaneName")
myPane.style.zIndex = 450
_( 組み込みペインのz-index値 を参照)pane
オプション:L.rectangle(corners, { pane: "myPaneName" })
L.geoJSON
_ファクトリを介してビルドする場合、onEachFeature
オプションを使用して機能をループし、指定したターゲットpane
でレイヤーのクローンを作成できます。Z-Indexについて検索している人向け
Svgレイヤーには修正順序があるため、すべてのパスレイヤー(マーカーを除くすべて)にはz-indexがありません。最初の要素が最初にペイントされます。したがって、最後の要素が上にペイントされます。 @IvanSanchezは、zIndexが機能しない理由を説明しました。
順序は、layer.bringToBack()
またはlayer.bringToFront()
で制御できます。
そのコードを使用すると、レイヤーの順序を制御するためのより多くのオプションがあります。
_L.Path.include({
getZIndex: function() {
var node = this._path;
var index = 0;
while ( (node = node.previousElementSibling) ) {
index++;
}
return index;
},
setZIndex: function(idx) {
var obj1 = this._path;
var parent = obj1.parentNode;
if(parent.childNodes.length < idx){
idx = parent.childNodes.length-1;
}
var obj2 = parent.childNodes[idx];
if(obj2 === undefined || obj2 === null){
return;
}
var next2 = obj2.nextSibling;
if (next2 === obj1) {
parent.insertBefore(obj1, obj2);
} else {
parent.insertBefore(obj2, obj1);
if (next2) {
parent.insertBefore(obj1, next2);
} else {
parent.appendChild(obj1);
}
}
},
oneUp: function(){
this.setZIndex(this.getZIndex()+1)
},
oneDown: function(){
this.setZIndex(this.getZIndex()-1)
}
});
_
その後、あなたは呼び出すことができます
polygon.oneUp()
polygon.oneDown()
polygon.setZIndex(2)
polygon.getZIndex()
layergroup.setZIndex(2)
が機能しています