Элемент управления слоями листов для слоев группы базовой карты

Вкратце, мне нужно, чтобы группы слоев контролировались с помощью управления слоями листовок, по два-три за раз. В этом JSFiddle, при смене базовых карт, оверлей гидро должен постоянно оставаться поверх различных базовых карт.

Если вы запустите и используете элемент управления слоями в правом верхнем углу, вы заметите, как гидро наложение отключится при переключении на изображения и останется выключенным, если вы не переключитесь на топографический и обратно на национальный географический. Это поведение, которое я смог надежно воспроизвести. Если вы поиграете с ним, вы увидите, что происходит довольно странная штука.

Любые предложения или предложения по улучшению способов сделать это приветствуются. В решении необходимо использовать элемент управления слоями, чтобы переключать базовую карту, сохраняя при этом верхний слой гидро наложения. В противном случае я полностью открыт для альтернативных решений.

Если вам интересно, прежде чем перейти к JSFiddle, вот JavaScript...

// initialize map
var map = L.map('map', {
    center: [45.7067, -121.5217], // Hood River, OR
    zoom: 7
});

// hydrology overlay layer
var hydro = L.esri.tiledMapLayer('http://hydrology.esri.com/arcgis/rest/services/WorldHydroReferenceOverlay/MapServer');

// basemap layer groups so the hydro overlay always overlays the various basemaps
var nationalGeographic = L.layerGroup([
        hydro,
        L.esri.basemapLayer('NationalGeographic')
    ]),
    esriTopo = L.layerGroup([
        hydro,
        L.esri.basemapLayer('Topographic')
    ]),
    esriShadedRelief = L.layerGroup([
        L.esri.tiledMapLayer('ShadedReliefLabels'),
        hydro,
        L.esri.basemapLayer('ShadedRelief')
    ]),
    esriImagery = L.layerGroup([
        hydro,
        L.esri.basemapLayer('Imagery')
    ]);

// add default layers to map
map.addLayer(esriTopo);

// json object for layer switcher control basemaps
var baseLayers = {
    "National Geographic": nationalGeographic,
    "Esri Topographic": esriTopo,
    "Shaded Relief": esriShadedRelief,
    "Imagery": esriImagery
};

// add layer groups to layer switcher control
var controlLayers = L.control.layers(baseLayers).addTo(map);

2 ответа

Решение

Решением оказывается явная установка индекса z гидрослоя. Поиск индекса z обнаружил это обсуждение Stackru со ссылкой на отличный пример Бобби Судекума. Хотя я не реализовал решение Бобби напрямую, оно привело меня к более глубокому исследованию свойств и методов Leaflet TileLayer в API.

В частности, вариант zIndex оказался решением. Стоит отметить, что zIndex установлен на пять, чтобы это работало. Управление слоями автоматически устанавливает z-индекс слоев, которыми он управляет. Следовательно, первоначальная проблема заключалась в том, что гидрослой не имел индекса, но слои, с которыми взаимодействовали при управлении слоями, делали это. В результате, гидрослой упал на спину, как только управление слоями взаимодействовало и исчезло. Следовательно, для четырех слоев базовой карты гидрослой должен иметь индекс a z, равный пяти, на один больше, чем количество слоев базовой карты, чтобы отображаться поверх любого выбранного слоя базовой карты. Наконец, я также реализовал опцию deteRetina, значительно улучшив отображение на моем MacBook Pro.

Вот обновленный код, сопровождающий http://jsfiddle.net/FH9VF/11/.

// initialize map
var map = L.map('map', {
    center: [45.7067, -121.5217], // Hood River, OR
    zoom: 7
});

// hydrology overlay layer
var hydro = L.esri.tiledMapLayer('http://hydrology.esri.com/arcgis/rest/services/WorldHydroReferenceOverlay/MapServer', {
    zIndex: 5,
    detectRetina: true
});

// basemap layer groups so the hydro overlay always overlays the various basemaps
var nationalGeographic = L.esri.basemapLayer('NationalGeographic'),
    esriTopo = L.esri.basemapLayer('Topographic'),
    esriShadedRelief = L.esri.basemapLayer('ShadedRelief'),
    esriImagery = L.esri.basemapLayer('Imagery');

// add default layers to map
map.addLayer(esriTopo);
map.addLayer(hydro);

// json object for layer switcher control basemaps
var baseLayers = {
    "National Geographic": nationalGeographic,
    "Esri Topographic": esriTopo,
    "Shaded Relief": esriShadedRelief,
    "Imagery": esriImagery
};

// add layer groups to layer switcher control
var controlLayers = L.control.layers(baseLayers).addTo(map);

Вам нужно сделать что-то вроде этого:

//define base layers
var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var normalView = L.tileLayer(osmUrl, {styleId: 997, attribution: osmAttributes, maxZoom: 18 });
...

//define overlay layers
var markersLayer = new L.layerGroup();
var linesLayer = new L.layerGroup();
...

//create MAP with default base and overlay layers
var map = L.map('map', {
layers: [normalView, markersLayer]
}).setView([45.2516700, 19.8369400], 12);

//add layers to the base and overlay
var baseMaps = {
    "Normal view": normalView,
    "Night view": nightView,
    "MapQuest layer": mapQuest
};

var overlayMaps = {
    "Markers": markersLayer,
    "Lines": linesLayer,
    "3D layer": osmbView
};

//add layer control to the map
L.control.layers(baseMaps, overlayMaps).addTo(map);
Другие вопросы по тегам