2017-01-28 20 views
1

Я хочу создать карту листов, которая может переключаться между различными слоями карты. Это, конечно, не проблема.Листовка: смесь между двумя базовыми слоями

Но я хочу добавить ползунок, где я могу смесь между фактической maplayer и бывшего maplayer удобно сравнивать содержание этих 2-х карт:
бегунок = правый => 100% непрозрачность фактической карты
слайдера = влево => 0% непрозрачность фактической карты, что означает 100% непрозрачность бывшей карты
слайдер = средний => 50% непрозрачность фактической карты, что означает для mer в фоновом режиме также светится на 50%

Мне удалось получить смесь, которая работает в начальной ситуации после загрузки карты. Но я не могу заставить его работать после того, как я выберу другую карту из меню выбора карты. Бывший maplayer, который должен отображаться в фоновом режиме, кажется, теряется.

я вещь, что проблема заключается в том, что функция «fct_layerchange» не только называют ивент-listenier map.on когда я выбираю другую карту в пределах меню Maplayers, но и когда я добавьте прежний maplayer в фоновый режим с помощью map.addLayer (bgMap);

Я больше понятия не имею, как решить эти нежелательные «многократные» функции, поскольку я полагаюсь на событие baselayerchange при выборе новой базовой карты. И это событие снова срабатывает, когда оно находится внутри функции события. Есть ли у какого-нибудь лифлет-гуру идея, как я могу это решить? :-)

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<meta charset="UTF-8"> 
 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 
 
<title>Blend 2 maps</title> 
 
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" /> 
 
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script> 
 
<style> 
 
    html, body, #map {height: 100%;} 
 
</style> 
 
</head> 
 

 
<body> 
 
<div id="map"></div> 
 
<script> 
 

 
// 1.) BASEMAPS 
 
var osm_mapnik = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.openstreetmap.org">Openstreetmap</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 
var thunder_cycle = L.tileLayer('https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png', {subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 
var thunder_outdoors = L.tileLayer('https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png', {subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 
var thunder_pioneer = L.tileLayer('https://{s}.tile.thunderforest.com/pioneer/{z}/{x}/{y}.png', {subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 

 
// 2.) OVERLAYMAPS 
 
var heidel_bound = L.tileLayer('http://korona.geog.uni-heidelberg.de/tiles/adminb/x={x}&y={y}&z={z}', {maxNativeZoom: 18, maxZoom:19, noWrap:true, attribution:'<a href="http://korona.geog.uni-heidelberg.de/contact.html">Uni-Heidelberg</a>' }); 
 
var wmt_hiking = L.tileLayer('https://tile.waymarkedtrails.org/hiking/{z}/{x}/{y}.png', {maxNativeZoom: 18, maxZoom:19, noWrap:true, attribution:'<a href="http://waymarkedtrails.org">Waymarkedtrails</a>' }); 
 
    
 
// LAYERMENU 
 
var baseMaps = { 
 
    "OpenStreetMap Mapnik": osm_mapnik, 
 
    "Thunderforest Opencycle": thunder_cycle, 
 
    "Thunderforest Outdoors": thunder_outdoors, 
 
    "Thunderforest Pioneer": thunder_pioneer 
 
}; 
 

 
var map = L.map ('map', { center: [47, 15], zoom: 11, layers: [thunder_cycle, wmt_hiking] }); 
 
var overlayMaps = { 
 
    "Hiking Routes": wmt_hiking, 
 
    "Boundaries": heidel_bound, 
 
}; 
 
var ctr_mapLayers = L.control.layers(baseMaps, overlayMaps).addTo(map); 
 
var fgMap = thunder_cycle; 
 
var bgMap = thunder_pioneer; 
 
map.addLayer(bgMap);   // add initial backgroundmap-layer to map 
 
bgMap.bringToBack();   // move backgroundmap-Layer to to the background of the map 
 

 
function fct_blend() { 
 
    valBlend = document.getElementById("id_sliderBlend").value; 
 
    document.getElementById("id_valBlend").innerHTML = Number(valBlend).toFixed(1) 
 
    fgMap.setOpacity(valBlend); 
 
} 
 
    
 
var ctr_blend = L.control(); 
 
ctr_blend.onAdd = function (map) { 
 
    valOpacity = 1.0; 
 
    this.div = L.DomUtil.create('div'); 
 
    this.div.innerHTML = '<span id="id_valBlend">1.0</span><input type="range" id="id_sliderBlend" min="0" max="1" step="0.1" value="1" style="width:100px;" oninput="fct_blend()">'; 
 
    L.DomEvent.disableClickPropagation(this.div); 
 
    return this.div; 
 
}; 
 
ctr_blend.addTo(map); 
 

 
var fct_layerchange = function (e) { 
 
    bgMap = fgMap; 
 
    bgMap.setOpacity(1);   // set opacity of former foregroundmap-layer which is now background-layer to 1.0; 
 
    map.addLayer(bgMap);   // add former foregroundmap-layer as backgroundmap-layer to map again. 
 
    fgMap = e.layer;    // update fgMap-variable with the actual foregroundmap-layer 
 
    fgMap.setOpacity(valBlend); // set opacity of the new foregroundmap-layer to the actual blend-Value. 
 
}; 
 

 
map.on('baselayerchange', fct_layerchange); 
 

 
</script> 
 
</body> 
 
</html>

+0

Вы можете быть заинтересованы в [Leaflet.OpacityControls] плагин (https://github.com/lizardtechblog/Leaflet.OpacityControls). Это может помочь в настройке непрозрачности, но вам все равно придется выяснить, как изменить слой и контролировать непрозрачность текущего слоя. – ghybs

ответ

0

Я хочу сообщить вам, что в конце концов, я мог бы нашел рабочий раствор. После нескольких часов и часов проб и ошибок и изучения исходного кода Leaflet я выяснил, в чем была проблема и как ее решить.

Проблема в моем случае было то, что объект управления слой листовка является строго управления каждым из своих базовых карт и overlaymaps (= только один basemaplayer может отображаться в то же время) Если бы я добавить еще термобелье для использования в фоновом режиме , объект управления уровнем будет удаленно удалить его снова, даже если я поместил его на другое окно.

Обхода является: создать indivdual копии каждой базовой карты (например «osm_mapnik» получит близнец под названием «osm_mapnik_bg») для использования на фоне панели. Причина: Объект управления слой имеет только контроль «osm_mapnik», но у меня есть полный контроль над «osm_mapnik_bg» :-)

Таким образом, уровень управления управляет изменениями на карте forderground и я управлять изменение фоновой карты - идеальное разделение труда.

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<meta charset="UTF-8"> 
 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 
 
<title>Blend 2 maps</title> 
 
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" /> 
 
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script> 
 
<style> 
 
    html, body, #map { height: 100%; } 
 
    html, body, #map { margin: 0; padding: 0; } 
 
</style> 
 
</head> 
 

 
<body> 
 
<div id="map"></div> 
 
<script> 
 

 
// 1.) BASEMAPS 
 
var osm_mapnik = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.openstreetmap.org">Openstreetmap</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 
var thunder_cycle = L.tileLayer('https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png', {subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 
var thunder_outdoors = L.tileLayer('https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png', {subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 
var thunder_pioneer = L.tileLayer('https://{s}.tile.thunderforest.com/pioneer/{z}/{x}/{y}.png', {subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 

 
// 1b.) BASEMAPS copies for use on background pane: use 'mapPane' which's z-index is lower (=behind) the 'tilePane' used by the layers in 1.) 
 
var osm_mapnik_bg = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {pane:'mapPane', subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.openstreetmap.org">Openstreetmap</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 
var thunder_cycle_bg = L.tileLayer('https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png', {pane:'mapPane', subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 
var thunder_outdoors_bg = L.tileLayer('https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png', {pane:'mapPane', subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 
var thunder_pioneer_bg = L.tileLayer('https://{s}.tile.thunderforest.com/pioneer/{z}/{x}/{y}.png', {pane:'mapPane', subdomains:'abc', maxZoom:19, noWrap:true, attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' }); 
 

 
// 2.) OVERLAYMAPS 
 
var heidel_bound = L.tileLayer('http://korona.geog.uni-heidelberg.de/tiles/adminb/x={x}&y={y}&z={z}', {maxNativeZoom: 18, maxZoom:19, noWrap:true, attribution:'<a href="http://korona.geog.uni-heidelberg.de/contact.html">Uni-Heidelberg</a>' }); 
 
var wmt_hiking = L.tileLayer('https://tile.waymarkedtrails.org/hiking/{z}/{x}/{y}.png', {maxNativeZoom: 18, maxZoom:19, noWrap:true, attribution:'<a href="http://waymarkedtrails.org">Waymarkedtrails</a>' }); 
 
    
 
// LAYERMENU 
 
var baseMaps = { 
 
    "OpenStreetMap Mapnik": osm_mapnik, 
 
    "Thunderforest Opencycle": thunder_cycle, 
 
    "Thunderforest Outdoors": thunder_outdoors, 
 
    "Thunderforest Pioneer": thunder_pioneer 
 
}; 
 

 
// needed to get the layer's Objectname by its Layer-Controlname which is the only name passed by the 'baselayerchange'-event 
 
var layerLookup = {"OpenStreetMap Mapnik":"osm_mapnik", "Thunderforest Opencycle":"thunder_cycle", "Thunderforest Outdoors":"thunder_outdoors", "Thunderforest Pioneer":"thunder_pioneer",}; 
 

 
var map = L.map ('map', { center: [47, 15], zoom: 11, layers: [thunder_cycle] }); 
 
var overlayMaps = { 
 
    "Hiking Routes": wmt_hiking, 
 
    "Boundaries": heidel_bound, 
 
}; 
 
var ctr_mapLayers = L.control.layers(baseMaps, overlayMaps).addTo(map); 
 

 
var fgLayerControlname = "Thunderforest Opencycle";  // default foreground-Layer*Controlname* 
 
var fgLayer = window [layerLookup [fgLayerControlname]]; // default foreground-Layer Object 
 
var bgLayerName = 'thunder_pioneer_bg';     // default background-Layer*Objectname* 
 
var bgLayer = thunder_pioneer_bg;       // default background-Layer Object 
 
map.addLayer(bgLayer);   
 

 
function fct_blend() { 
 
    valBlend = document.getElementById("id_sliderBlend").value; 
 
    document.getElementById("id_valBlend").innerHTML = Number(valBlend).toFixed(1) 
 
    fgLayer.setOpacity(valBlend); 
 
} 
 
    
 
var ctr_blend = L.control({position:'bottomright'}); 
 
ctr_blend.onAdd = function (map) { 
 
    valBlend = 1.0; 
 
    this.div = L.DomUtil.create('div'); 
 
    this.div.innerHTML = '<span id="id_valBlend">1.0</span><input type="range" id="id_sliderBlend" min="0" max="1" step="0.1" value="1" style="width:100px;" oninput="fct_blend()">'; 
 
    L.DomEvent.disableClickPropagation(this.div); 
 
    return this.div; 
 
}; 
 
ctr_blend.addTo(map); 
 

 
var fct_layerchange = function (e) { 
 
    map.removeLayer(bgLayer);         // remove former bg-Layer 
 
    bgLayerName = [layerLookup [fgLayerControlname]] + '_bg'; // set Object*name* of new bg-Layer which is former fg-Layer 
 
    bgLayer = window[bgLayerName];        // set bgLayer-Object out of its Object*name* 
 
    map.addLayer(bgLayer);          // add former foregroundmap-layer as backgroundmap-layer to map again. 
 
    fgLayerControlname = e.name;        // get fg-Layer *Controlname* which is used in the Layercontrol-menu (its Objectname is not passed by the event) 
 
    fgLayer = window [layerLookup [fgLayerControlname]];  //set fgLayer-Object by the use of its Objectname which is derived from its *Controlname* 
 
    fgLayer.setOpacity(valBlend); // set opacity of the new foreground-layer to the actual blend-Value. 
 
}; 
 

 
map.on('baselayerchange', fct_layerchange);      // fired if a new maplayer is choosen by the Layercontrol 
 

 
</script> 
 
</body> 
 
</html>

 Смежные вопросы

  • Нет связанных вопросов^_^