Ähnlich wie bei der Antwort von @nothingisnecessary wird im Folgenden layer.bringToFront()
die Z-Reihenfolge beibehalten, wenn Sie layer control
Daten kombiniert und asynchron geladen haben .
Wir möchten die Ebenen nicht löschen und wieder zur Karte hinzufügen, da dadurch alle Ebenen hinzugefügt werden. Stattdessen möchten wir die ausgewählten Ebenen im Ebenensteuerelement mit minimalem Aufwand berücksichtigen. bringToFront()
kann dies tun, aber wir müssen es nur auf einer Ebenengruppe aufrufen, die Ebenen (Inhalt) enthält.
Definieren Sie die Ebenen:
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);
Verwenden Sie die folgende Funktion, um die Z-Reihenfolge zu erzwingen:
/**
* 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();
});
}
Wenn Sie das Ebenensteuerelement verwenden und eine Ebene in die Ansicht umgeschaltet wird, befindet sie sich über den anderen Ebenen. Wenn eine Ebene hinzugefügt wird, müssen Sie die Ordnungslogik erneut anwenden. Dies kann durch Binden an das overlayadd
Ereignis auf der Karte und Aufrufen der fixZOrder
Funktion erfolgen:
map.on('overlayadd', function (e) {
fixZOrder(dataLayers);
}
Wenn Sie Ihre Daten asynchron laden, müssen Sie möglicherweise auch aufrufen, fixZOrder
wenn das Laden der Daten abgeschlossen ist. Zur Laufzeit hinzugefügte neue Ebenen werden über allen anderen Ebenen gerendert.