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