คล้ายกับคำตอบจาก @nothing จำเป็นต่อการใช้layer.bringToFront()
z เพื่อรักษาลำดับเมื่อคุณรวมlayer control
และโหลดข้อมูลแบบอะซิงโครนัส
เราไม่ต้องการล้างเลเยอร์และเพิ่มกลับเข้าไปในแผนที่เนื่องจากจะเป็นการเพิ่มเลเยอร์ทั้งหมด แต่เราต้องการเคารพเลเยอร์ที่เลือกในการควบคุมเลเยอร์ด้วยค่าใช้จ่ายที่น้อยที่สุด bringToFront()
สามารถทำได้ แต่เราต้องเรียกมันในกลุ่มเลเยอร์ที่มีเลเยอร์ (เนื้อหา) อยู่ภายใน
กำหนดเลเยอร์:
var dataLayers = {
Districts: new L.geoJSON(),
Farms: new L.featureGroup(),
Paddocks: new L.geoJSON(),
Surveys: new L.geoJSON()
};
L.control.layers(
// base maps
{
OSM: L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>', subdomains: ['a', 'b', 'c'] });,
},
dataLayers,
{
collapsed: false,
hideSingleBase: true
}).addTo(map);
ใช้ฟังก์ชั่นต่อไปนี้เพื่อบังคับใช้คำสั่ง z:
/**
* Ensure that layers are displayed in the correct Z-Order
* Instead of explicitly defining z-order on the groups the order of the calls to beingToFront controls the resulting zOrder
* @param {any} dataLayers Object that holds the references to the layer groups toggled by the layer control
**/
function fixZOrder(dataLayers) {
// only similar approach is to remove and re-add back to the map
// use the order in the dataLayers object to define the z-order
Object.keys(dataLayers).forEach(function (key) {
// check if the layer has been added to the map, if it hasn't then do nothing
// we only need to sort the layers that have visible data
// Note: this is similar but faster than trying to use map.hasLayer()
var layerGroup = dataLayers[key];
if (layerGroup._layers
&& Object.keys(layerGroup._layers).length > 0
&& layerGroup._layers[Object.keys(layerGroup._layers)[0]]._path
&& layerGroup._layers[Object.keys(layerGroup._layers)[0]]._path.parentNode)
layerGroup.bringToFront();
});
}
เมื่อใช้การควบคุมเลเยอร์เมื่อเลเยอร์ถูกสลับเป็นมุมมองมันจะอยู่ด้านบนของเลเยอร์อื่น ๆ เราจำเป็นต้องใช้ตรรกะการสั่งซื้ออีกครั้งเมื่อเพิ่มเลเยอร์ สิ่งนี้สามารถทำได้โดยผูกกับoverlayadd
เหตุการณ์บนแผนที่และเรียกใช้fixZOrder
ฟังก์ชัน:
map.on('overlayadd', function (e) {
fixZOrder(dataLayers);
}
หากคุณโหลดข้อมูลแบบอะซิงโครนัสคุณอาจต้องโทรหาfixZOrder
เมื่อการโหลดข้อมูลของคุณเสร็จสิ้นเลเยอร์ใหม่ที่เพิ่มเข้ามาในขณะรันไทม์จะถูกแสดงผลที่ด้านบนของเลเยอร์อื่น ๆ ทั้งหมด