Semelhante à resposta de @nothingisnecessary, os seguintes usos layer.bringToFront()
para manter a ordem z quando você combina o layer control
carregamento de dados assíncrono.
não queremos limpar as camadas e adicioná-las novamente ao mapa, pois isso adicionará todas as camadas; em vez disso, queremos respeitar as camadas selecionadas no controle de camada com o mínimo de despesas gerais. bringToFront()
pode fazer isso, mas devemos chamá-lo apenas em um grupo de camadas que possui camadas (conteúdo) dentro dele.
Defina as camadas:
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);
Use a seguinte função para impor a ordem 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();
});
}
Ao usar o controle Camada, quando uma Camada é alternada para exibição, ela fica por cima das outras camadas, precisamos reaplicar a lógica da ordem quando uma camada é adicionada. Isso pode ser feito vinculando o overlayadd
evento no mapa e chamando a fixZOrder
função:
map.on('overlayadd', function (e) {
fixZOrder(dataLayers);
}
Se você carregar seus dados de forma assíncrona, também poderá ser necessário chamar fixZOrder
quando o carregamento de dados for concluído; novas camadas adicionadas em tempo de execução serão renderizadas sobre todas as outras camadas.