Podobne do odpowiedzi z @ nic nie jest konieczne, layer.bringToFront()
aby zachować porządek Z po połączeniu layer control
i asynchronicznym ładowaniu danych.
nie chcemy usuwać warstw i dodawać ich z powrotem do mapy, ponieważ spowoduje to dodanie wszystkich warstw, zamiast tego chcemy respektować wybrane warstwy w Kontroli warstw przy minimalnych nakładach. bringToFront()
możemy to zrobić, ale musimy wywoływać to tylko w grupie warstw, która zawiera warstwy (zawartość).
Zdefiniuj warstwy:
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);
Użyj poniższej funkcji, aby wymusić kolejność w kolejności 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();
});
}
Podczas korzystania z kontrolki Warstwa, gdy Warstwa jest przełączana na widok, będzie ona na wierzchu innych warstw, musimy ponownie zastosować logikę porządku po dodaniu warstwy. Można to zrobić przez powiązanie ze overlayadd
zdarzeniem na mapie i wywołanie fixZOrder
funkcji:
map.on('overlayadd', function (e) {
fixZOrder(dataLayers);
}
Jeśli ładujesz dane asynchronicznie, może być również konieczne wywołanie fixZOrder
po zakończeniu ładowania danych, nowe warstwy dodane w czasie wykonywania będą renderowane na wszystkich innych warstwach.