Similar a la respuesta de @nothingisnenecesita los siguientes usos layer.bringToFront()
para mantener el orden z cuando tiene una layer control
carga de datos combinada y asincrónica.
no queremos borrar las capas y agregarlas nuevamente al mapa, ya que esto agregará todas las capas, en su lugar, queremos respetar las capas seleccionadas en el Control de capas con un mínimo de gastos generales. bringToFront()
podemos hacer esto, pero solo debemos llamarlo en un grupo de capas que tenga capas (contenido) dentro.
Definir las capas:
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 la siguiente función para imponer el orden 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();
});
}
Cuando se usa el control de capa, cuando una capa se activa, estará encima de las otras capas, necesitamos volver a aplicar la lógica de orden cuando se agrega una capa. Esto se puede hacer vinculando el overlayadd
evento en el mapa y llamando a la fixZOrder
función:
map.on('overlayadd', function (e) {
fixZOrder(dataLayers);
}
Si carga sus datos de forma asincrónica, es posible que también deba llamar fixZOrder
cuando su carga de datos se haya completado, las nuevas capas agregadas en tiempo de ejecución se mostrarán sobre todas las demás capas.