Подібно до відповіді від @nothingisne potrebno, layer.bringToFront()
щоб підтримувати z-порядок при комбінованому layer control
та асинхронному завантаженні даних.
ми не хочемо очищати шари і додавати їх на карту, оскільки це додасть усі шари, натомість ми хочемо дотримуватись вибраних шарів у контролі шару з мінімальними накладними витратами. bringToFront()
можемо це зробити, але ми повинні викликати його лише у групі шарів, у якій є шари (вміст).
Визначте шари:
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);
Використовуйте наступну функцію для виконання 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();
});
}
Під час використання елемента управління шаром, коли шар увімкнено, він буде знаходитись над іншими шарами, нам потрібно знову застосувати логіку порядку, коли додається шар. Це можна зробити, прив’язавшись до overlayadd
події на карті та викликавши fixZOrder
функцію:
map.on('overlayadd', function (e) {
fixZOrder(dataLayers);
}
Якщо ви завантажуєте свої дані асинхронно, вам може знадобитися зателефонувати, fixZOrder
коли завантаження даних завершиться, нові шари, додані під час виконання, будуть відображатися поверх усіх інших шарів.