Simile alla risposta di @nothing non è necessario i seguenti usi layer.bringToFront()
per mantenere l'ordine z quando si sono combinati layer control
e il caricamento asincrono dei dati.
non vogliamo cancellare i livelli e aggiungerli di nuovo alla mappa in quanto ciò aggiungerà tutti i livelli, invece vogliamo rispettare i livelli selezionati nel Controllo livello con costi generali minimi. bringToFront()
possiamo farlo ma dobbiamo chiamarlo solo su un gruppo di livelli che contiene livelli (contenuto) al suo interno.
Definisci i livelli:
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);
Utilizzare la seguente funzione per applicare l'ordine 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();
});
}
Quando si utilizza il controllo Livello, quando un Livello viene attivato e visualizzato, sarà in cima agli altri livelli, quando si aggiunge un livello è necessario riapplicare la logica dell'ordine. Questo può essere fatto legandosi overlayadd
all'evento sulla mappa e chiamando la fixZOrder
funzione:
map.on('overlayadd', function (e) {
fixZOrder(dataLayers);
}
Se si caricano i dati in modo asincrono, potrebbe essere necessario chiamare anche fixZOrder
quando il caricamento dei dati è stato completato, i nuovi livelli aggiunti in fase di esecuzione verranno visualizzati sopra tutti gli altri livelli.