Mirip dengan jawaban dari @nothing tidak perlu, kegunaan berikut layer.bringToFront()
untuk mempertahankan z-order ketika Anda telah menggabungkan layer control
dan memuat data yang tidak sinkron.
kami tidak ingin menghapus lapisan dan menambahkannya kembali ke peta karena ini akan menambah semua lapisan, sebaliknya kami ingin menghormati lapisan yang dipilih dalam Kontrol Lapisan dengan biaya overhead minimal. bringToFront()
dapat melakukan ini tetapi kita hanya harus menyebutnya pada grup lapisan yang memiliki lapisan (konten) di dalamnya.
Tentukan lapisan:
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);
Gunakan fungsi berikut untuk menegakkan z-order:
/**
* 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();
});
}
Saat menggunakan kontrol Layer, ketika sebuah Layer diubah menjadi tampilan, itu akan berada di atas layer lain, kita perlu menerapkan kembali logika pesanan ketika sebuah layer ditambahkan. Ini dapat dilakukan dengan mengikat ke overlayadd
acara di peta dan memanggil fixZOrder
fungsi:
map.on('overlayadd', function (e) {
fixZOrder(dataLayers);
}
Jika Anda memuat data Anda secara tidak sinkron, Anda mungkin juga perlu memanggil fixZOrder
ketika beban data Anda telah selesai, lapisan baru yang ditambahkan saat runtime akan diberikan di atas semua lapisan lainnya.