77"""
88import warnings
99import json
10+ from collections import OrderedDict
1011
1112from jinja2 import Template
1213
@@ -173,7 +174,7 @@ def add_tile_layer(self, tiles='OpenStreetMap', name=None,
173174
174175class TileLayer (MacroElement ):
175176 def __init__ (self , tiles = 'OpenStreetMap' , name = None ,
176- min_zoom = 1 , max_zoom = 18 , attr = None , API_key = None ):
177+ min_zoom = 1 , max_zoom = 18 , attr = None , API_key = None , overlay = False ):
177178 """TODO docstring here
178179 Parameters
179180 ----------
@@ -185,6 +186,8 @@ def __init__(self, tiles='OpenStreetMap', name=None,
185186 self .min_zoom = min_zoom
186187 self .max_zoom = max_zoom
187188
189+ self .overlay = overlay
190+
188191 self .tiles = '' .join (tiles .lower ().strip ().split ())
189192 if self .tiles in ('cloudmade' , 'mapbox' ) and not API_key :
190193 raise ValueError ('You must pass an API key if using Cloudmade'
@@ -219,6 +222,42 @@ def __init__(self, tiles='OpenStreetMap', name=None,
219222 {% endmacro %}
220223 """ )
221224
225+ class LayerControl (MacroElement ):
226+ """Adds a layer control to the map."""
227+ def __init__ (self ):
228+ """Creates a LayerControl object to be added on a folium map.
229+
230+ Parameters
231+ ----------
232+ """
233+ super (LayerControl , self ).__init__ ()
234+ self ._name = 'LayerControl'
235+
236+ self .base_layers = OrderedDict ()
237+ self .overlays = OrderedDict ()
238+
239+ self ._template = Template ("""
240+ {% macro script(this,kwargs) %}
241+ var {{this.get_name()}} = {
242+ base_layers : { {% for key,val in this.base_layers.items() %}"{{key}}" : {{val}},{% endfor %} },
243+ overlays : { {% for key,val in this.overlays.items() %}"{{key}}" : {{val}},{% endfor %} }
244+ };
245+ L.control.layers(
246+ {{this.get_name()}}.base_layers,
247+ {{this.get_name()}}.overlays
248+ ).addTo({{this._parent.get_name()}});
249+ {% endmacro %}
250+ """ )
251+
252+ def render (self , ** kwargs ):
253+ """TODO : docstring here."""
254+ self .base_layers = OrderedDict ([(val .tile_name ,val .get_name ()) \
255+ for key ,val in self ._parent ._children .items () if isinstance (val ,TileLayer ) and not val .overlay ])
256+ self .overlays = OrderedDict ([(val .tile_name ,val .get_name ()) \
257+ for key ,val in self ._parent ._children .items () if isinstance (val ,TileLayer ) and val .overlay ])
258+
259+ super (LayerControl , self ).render ()
260+
222261class Icon (MacroElement ):
223262 def __init__ (self , color = 'blue' , icon = 'info-sign' , angle = 0 ):
224263 """TODO : docstring here"""
0 commit comments