2016-03-23 21 views
8

Ich erstelle eine Mapping-Webanwendung mit Mapbox-GL. Es hat viele coole Features. Ich habe die Tasten eingerichtet, um Basiskarten (z. B. Satellit, Terrain usw.) zu wechseln, die dem Beispiel auf der Mapbox website folgen.Mapbox-GL setStyle entfernt Ebenen

Das Problem, das ich habe, ist, dass wenn ich den Stil ändern, entfernt es meine Polygone, die als Ebenen geladen werden und lädt die Karte neu. Ich lade Polygone aus einer Mongo-Datenbank als Layer basierend auf Benutzerabfragen ein. Ich möchte in der Lage sein, die Basiskarte zu ändern und diese Ebenen beizubehalten.

Gibt es eine Möglichkeit, den Stil zu ändern, ohne die Karte neu zu laden oder zumindest die Ebenen nicht zu löschen?

Hier ist mein Code für den Schalter, die gleichen wie das Beispiel aber ich hinzugefügt, um eine Bedingung für einen benutzerdefinierten Stil:

var layerList = document.getElementById('menu'); 
    var inputs = layerList.getElementsByTagName('input'); 

    function switchLayer(layer) { 
     var layerId = layer.target.id; 
     if (layerId === 'outdoors') { 
      map.setStyle('/outdoors-v8.json'); 
     } else { 
     map.setStyle('mapbox://styles/mapbox/' + layerId + '-v8'); 
     } 
    } 

    for (var i = 0; i < inputs.length; i++) { 
     inputs[i].onclick = switchLayer; 
    } 

Antwort

10

Ist hier zeigt ein Beispiel, dass: Bibliothek http://bl.ocks.org/tristen/0c0ed34e210a04e89984

Im Gegensatz zu einem Mapping wie Leaflet, Mapbox GL JS hat kein Konzept von "Grundkarte" vs "andere Schichten." Alle Ebenen sind Teil derselben Entität: der Stil. Sie müssen also den Status der Datenschicht beibehalten und bei jeder Änderung ihre Quelle/addLayer aufrufen.

+0

Super! Danke für die Hilfe @tristen. Ich hatte gehofft, dass Sie einfach die Grundkarte tauschen können, aber Mapbox-GL ist ein bisschen anders. Ich habe dein Beispiel zur Inspiration benutzt. Im Grunde musste ich meine geladenen Daten in eine Variable speichern und sie mit der 'map.on ('style.load' ...' Funktion neu laden. Das funktioniert ganz gut. – ngust

+0

Danke @tristen für das Beispiel und die Erklärung. – bkowshik

+0

Danke @tristen.Tipps, wie man das für Vektorkacheln von einem Tiling-Server (zB localhost/{z}/{x}/{y} .pbf) macht? Geojson kann in einer Variablen gespeichert werden, aber wenn Sie viel haben der Daten und nur die Vektorkacheln der aktuellen Bounding Box anzeigen möchten, bin ich mir nicht sicher, wie Sie die gleichen Daten beibehalten ... – jondelmil