Semblable à la réponse de @nothingisnecessary, les utilisations suivantes permettent layer.bringToFront()
de maintenir l'ordre z lorsque vous avez layer control
un chargement de données combiné et asynchrone.
nous ne voulons pas effacer les couches et les ajouter à la carte car cela ajoutera toutes les couches, mais nous voulons plutôt respecter les couches sélectionnées dans le contrôle des couches avec des frais généraux minimaux. bringToFront()
peut le faire, mais nous devons l'appeler uniquement sur un groupe de calques contenant des calques (contenu).
Définissez les calques:
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);
Utilisez la fonction suivante pour appliquer l'ordre 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();
});
}
Lorsque vous utilisez le contrôle des calques, lorsqu'un calque est basculé en vue, il sera au-dessus des autres calques, nous devons réappliquer la logique de commande lorsqu'un calque est ajouté. Cela peut être fait en se liant à l' overlayadd
événement sur la carte et en appelant la fixZOrder
fonction:
map.on('overlayadd', function (e) {
fixZOrder(dataLayers);
}
Si vous chargez vos données de manière asynchrone, vous devrez peut-être également appeler fixZOrder
lorsque votre chargement de données sera terminé, les nouvelles couches ajoutées lors de l'exécution seront rendues par-dessus toutes les autres couches.