Размещение элементов управления вне контейнера карты с помощью Leaflet?

13

Может кто-нибудь сказать мне, как я могу разместить элементы управления вне содержимого карты с помощью Leaflet?

В этом случае я просто хочу разместить элемент управления переключателем слоев вне объекта карты.

введите описание изображения здесь

Маурисио Сантос
источник

Ответы:

19

Leaflet много размахивает руками, чтобы скрыть реализацию картографического портала, но, к счастью для вас, они нашли решение!

getContainerФункция только то , что вам нужно. Это возвращает фактический узел HTML, а не только разметку.

Тогда это так же просто, как отменить (?) Узел и назначить его новому родителю с помощью пары строк Javascript.

Рабочий пример и комментарии (и потрясающий тайлсет)!

http://codepen.io/romahicks/pen/ONmPmp

Код

//Create Layer
var baseMap = new    L.TileLayer('http://{s}.tiles.mapbox.com/v3/gvenech.m13knc8e/{z}/{x}/{y}.png'   );

var baseMapIndex = {
  "Map": baseMap
};

// Create the map
var map = new L.map('map', {
  center: new L.LatLng(41.019829, 28.989864),
  zoom: 14,
  maxZoom: 18,
  zoomControl: false, // Disable the default zoom controls.
  layers: baseMap
});

// Create the control and add it to the map;
var control = L.control.layers(baseMapIndex);
control.addTo(map);

 // Call the getContainer routine.
 var htmlObject = control.getContainer();
 // Get the desired parent node.
 var a = document.getElementById('new-parent');

 // Finally append that node to the new parent, recursively searching out and re-parenting nodes.
 function setParent(el, newParent)
 {
    newParent.appendChild(el);
 }
 setParent(htmlObject, a);

Вы должны рекурсивно пройти через всех детей и переназначить их своим родителям. Смотрите второй ответ для простого рекурсивного цикла.

/programming/20910147/how-to-move-all-html-element-children-to-another-parent-using-javascript

RoMaH
источник
Хорошо сделано. Вы уже проголосовали против вас, но не могли бы вы добавить в свой ответ соответствующий JavaScript?
elrobis
a.appendChild(control.onAdd(map))должно быть достаточно. См. Также stackoverflow.com/questions/36041651/…
ghybs
Это хорошо работало с решением getContainer. Но когда я попытался с a.appendChild (control.onAdd (map)), все слои wms и контроль слоя исчезают.
Маурисио Сантос
Я обновляю свой ответ рекурсивным циклом, чтобы получить детей, извините. Пожалуйста, дайте мне знать, если это не сработает.
RomaH
@mauriciosantos Мой плохой, он не работает так просто L.control.layers.
ghybs
1

Простой возможный способ, который я использовал:

Добавьте ниже HTML-тег, куда вы хотите переместить элементы управления листовки:

<div id="custom-map-controls"></div>

Код JavaScript:

$(document).ready(function () {

var newParent = document.getElementById('custom-map-controls');
        var oldParent = document.getElementsByClassName("leaflet-top leaflet-right")

        while (oldParent[0].childNodes.length > 0) {
            newParent.appendChild(oldParent[0].childNodes[0]);
        }
 });
Рахул Махадик
источник