1717from .element import Element , Figure , JavascriptLink , CssLink , MacroElement
1818from .map import Layer , Icon , Marker , Popup
1919
20+
2021class WmsTileLayer (Layer ):
2122 def __init__ (self , url , name = None ,
2223 format = None , layers = None , transparent = True ,
@@ -49,6 +50,7 @@ def __init__(self, url, name=None,
4950 {% endmacro %}
5051 """ ) # noqa
5152
53+
5254class RegularPolygonMarker (Marker ):
5355 def __init__ (self , location , color = 'black' , opacity = 1 , weight = 2 ,
5456 fill_color = 'blue' , fill_opacity = 1 ,
@@ -128,6 +130,7 @@ def render(self, **kwargs):
128130 JavascriptLink ("https://cdnjs.cloudflare.com/ajax/libs/leaflet-dvf/0.2/leaflet-dvf.markers.min.js" ), # noqa
129131 name = 'dvf_js' )
130132
133+
131134class Vega (Element ):
132135 def __init__ (self , data , width = None , height = None ,
133136 left = "0%" , top = "0%" , position = 'relative' ):
@@ -137,13 +140,16 @@ def __init__(self, data, width=None, height=None,
137140 """
138141 super (Vega , self ).__init__ ()
139142 self ._name = 'Vega'
140- self .data = data .to_json () if hasattr (data ,'to_json' ) else data
141- if isinstance (self .data ,text_type ) or isinstance (data ,binary_type ):
143+ self .data = data .to_json () if hasattr (data , 'to_json' ) else data
144+ # FIXME:
145+ if isinstance (self .data , text_type ) or isinstance (data , binary_type ):
142146 self .data = json .loads (self .data )
143147
144148 # Size Parameters.
145- self .width = _parse_size (self .data .get ('width' ,'100%' ) if width is None else width )
146- self .height = _parse_size (self .data .get ('height' ,'100%' ) if height is None else height )
149+ self .width = _parse_size (self .data .get ('width' , '100%' ) if
150+ width is None else width )
151+ self .height = _parse_size (self .data .get ('height' , '100%' ) if
152+ height is None else height )
147153 self .left = _parse_size (left )
148154 self .top = _parse_size (top )
149155 self .position = position
@@ -191,6 +197,7 @@ def render(self, **kwargs):
191197 vg.parse.spec(spec, function(chart) { chart({el:div}).update(); });}""" ), # noqa
192198 name = 'vega_parse' )
193199
200+
194201class GeoJson (MacroElement ):
195202 def __init__ (self , data , style_function = None ):
196203 """
@@ -220,20 +227,22 @@ def __init__(self, data, style_function=None):
220227 >>> # Providing string.
221228 >>> GeoJson(open('foo.json').read())
222229
223- >>> # Providing a style_function that put all states in green, but Alabama in blue.
224- >>> style_function=lambda x: {'fillColor': '#0000ff' if x['properties']['name']=='Alabama' else '#00ff00'}
230+ >>> # Provide a style_function that color all states green but Alabama.
231+ >>> style_function = lambda x: {'fillColor': '#0000ff' if
232+ ... x['properties']['name']=='Alabama' else
233+ ... '#00ff00'}
225234 >>> GeoJson(geojson, style_function=style_function)
226235 """
227236 super (GeoJson , self ).__init__ ()
228237 self ._name = 'GeoJson'
229- if hasattr (data ,'read' ):
238+ if hasattr (data , 'read' ):
230239 self .embed = True
231240 self .data = json .load (data )
232- elif isinstance (data ,dict ):
241+ elif isinstance (data , dict ):
233242 self .embed = True
234243 self .data = data
235244 elif isinstance (data , text_type ) or isinstance (data , binary_type ):
236- if data .lstrip ()[0 ] in '[{' : # This is a GeoJSON inline string
245+ if data .lstrip ()[0 ] in '[{' : # This is a GeoJSON inline string
237246 self .embed = True
238247 self .data = json .loads (data )
239248 else : # This is a filename
@@ -242,18 +251,19 @@ def __init__(self, data, style_function=None):
242251 elif data .__class__ .__name__ in ['GeoDataFrame' , 'GeoSeries' ]:
243252 self .embed = True
244253 if hasattr (data , '__geo_interface__' ):
245- # We have a GeoPandas 0.2 object
246- self .data = json .loads (json .dumps (data .to_crs (epsg = '4326' ).__geo_interface__ ))
254+ # We have a GeoPandas 0.2 object.
255+ self .data = json .loads (json .dumps (data .to_crs (epsg = '4326' ).__geo_interface__ )) # noqa
247256 elif hasattr (data , 'columns' ):
248257 # We have a GeoDataFrame 0.1
249258 self .data = json .loads (data .to_crs (epsg = '4326' ).to_json ())
250259 else :
251- raise ValueError ('Unable to transform this object to a GeoJSON.' )
260+ msg = 'Unable to transform this object to a GeoJSON.'
261+ raise ValueError (msg )
252262 else :
253263 raise ValueError ('Unhandled object {!r}.' .format (data ))
254264
255265 if style_function is None :
256- style_function = lambda x : {}
266+ def style_function ( x ): return {}
257267 self .style_function = style_function
258268
259269 self ._template = Template (u"""
@@ -268,14 +278,13 @@ def __init__(self, data, style_function=None):
268278 def style_data (self ):
269279 if 'features' not in self .data .keys ():
270280 # Catch case when GeoJSON is just a single Feature or a geometry.
271- if not (isinstance (self .data , dict ) and 'geometry' in self .data .keys ()):
281+ if not (isinstance (self .data , dict ) and 'geometry' in self .data .keys ()): # noqa
272282 # Catch case when GeoJSON is just a geometry.
273- self .data = {'type' : 'Feature' , 'geometry' : self .data }
274- self .data = {'type' : 'FeatureCollection' , 'features' : [self .data ]}
283+ self .data = {'type' : 'Feature' , 'geometry' : self .data }
284+ self .data = {'type' : 'FeatureCollection' , 'features' : [self .data ]}
275285
276286 for feature in self .data ['features' ]:
277- feature .setdefault ('properties' ,{}).setdefault ('style' ,{}).update (
278- self .style_function (feature ))
287+ feature .setdefault ('properties' , {}).setdefault ('style' , {}).update (self .style_function (feature )) # noqa
279288 return json .dumps (self .data , sort_keys = True )
280289
281290 def _get_self_bounds (self ):
@@ -287,14 +296,14 @@ def _get_self_bounds(self):
287296
288297 if 'features' not in self .data .keys ():
289298 # Catch case when GeoJSON is just a single Feature or a geometry.
290- if not (isinstance (self .data , dict ) and 'geometry' in self .data .keys ()):
299+ if not (isinstance (self .data , dict ) and 'geometry' in self .data .keys ()): # noqa
291300 # Catch case when GeoJSON is just a geometry.
292- self .data = {'type' : 'Feature' , 'geometry' : self .data }
293- self .data = {'type' : 'FeatureCollection' , 'features' : [self .data ]}
301+ self .data = {'type' : 'Feature' , 'geometry' : self .data }
302+ self .data = {'type' : 'FeatureCollection' , 'features' : [self .data ]}
294303
295- bounds = [[None ,None ],[None ,None ]]
304+ bounds = [[None , None ], [None , None ]]
296305 for feature in self .data ['features' ]:
297- for point in iter_points (feature .get ('geometry' ,{}).get ('coordinates' ,{})):
306+ for point in iter_points (feature .get ('geometry' , {}).get ('coordinates' , {})): # noqa
298307 bounds = [
299308 [
300309 none_min (bounds [0 ][0 ], point [1 ]),
@@ -307,6 +316,7 @@ def _get_self_bounds(self):
307316 ]
308317 return bounds
309318
319+
310320class TopoJson (MacroElement ):
311321 def __init__ (self , data , object_path , style_function = None ):
312322 """
@@ -328,7 +338,7 @@ def __init__(self, data, object_path, style_function=None):
328338 self .object_path = object_path
329339
330340 if style_function is None :
331- style_function = lambda x : {}
341+ def style_function ( x ): return {}
332342 self .style_function = style_function
333343
334344 self ._template = Template (u"""
@@ -341,18 +351,17 @@ def __init__(self, data, object_path, style_function=None):
341351 {{this.get_name()}}.setStyle(function(feature) {return feature.properties.style;});
342352
343353 {% endmacro %}
344- """ )
354+ """ ) # noqa
345355
346356 def style_data (self ):
347357 def recursive_get (data , keys ):
348358 if len (keys ):
349359 return recursive_get (data .get (keys [0 ]), keys [1 :])
350360 else :
351361 return data
352- geometries = recursive_get (self .data , self .object_path .split ('.' ))['geometries' ]
362+ geometries = recursive_get (self .data , self .object_path .split ('.' ))['geometries' ] # noqa
353363 for feature in geometries :
354- feature .setdefault ('properties' ,{}).setdefault ('style' ,{}).update (
355- self .style_function (feature ))
364+ feature .setdefault ('properties' , {}).setdefault ('style' , {}).update (self .style_function (feature )) # noqa
356365 return json .dumps (self .data , sort_keys = True )
357366
358367 def render (self , ** kwargs ):
@@ -373,10 +382,10 @@ def _get_self_bounds(self):
373382 if not self .embed :
374383 raise ValueError ('Cannot compute bounds of non-embedded TopoJSON.' )
375384
376- xmin ,xmax ,ymin ,ymax = None , None , None , None
385+ xmin , xmax , ymin , ymax = None , None , None , None
377386
378387 for arc in self .data ['arcs' ]:
379- x ,y = 0 ,0
388+ x , y = 0 , 0
380389 for dx , dy in arc :
381390 x += dx
382391 y += dy
@@ -386,16 +395,17 @@ def _get_self_bounds(self):
386395 ymax = none_max (y , ymax )
387396 return [
388397 [
389- self .data ['transform' ]['translate' ][0 ] + self .data ['transform' ]['scale' ][0 ] * xmin ,
390- self .data ['transform' ]['translate' ][1 ] + self .data ['transform' ]['scale' ][1 ] * ymin ,
398+ self .data ['transform' ]['translate' ][0 ] + self .data ['transform' ]['scale' ][0 ] * xmin , # noqa
399+ self .data ['transform' ]['translate' ][1 ] + self .data ['transform' ]['scale' ][1 ] * ymin , # noqa
391400 ],
392401 [
393- self .data ['transform' ]['translate' ][0 ] + self .data ['transform' ]['scale' ][0 ] * xmax ,
394- self .data ['transform' ]['translate' ][1 ] + self .data ['transform' ]['scale' ][1 ] * ymax ,
402+ self .data ['transform' ]['translate' ][0 ] + self .data ['transform' ]['scale' ][0 ] * xmax , # noqa
403+ self .data ['transform' ]['translate' ][1 ] + self .data ['transform' ]['scale' ][1 ] * ymax , # noqa
395404 ]
396405
397406 ]
398407
408+
399409class ColorScale (MacroElement ):
400410 def __init__ (self , color_domain , color_code , caption = "" ):
401411 """
@@ -425,6 +435,7 @@ def render(self, **kwargs):
425435 JavascriptLink ("https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" ), # noqa
426436 name = 'd3' )
427437
438+
428439class MarkerCluster (Layer ):
429440 """Adds a MarkerCluster layer on the map."""
430441 def __init__ (self , overlay = True , control = True ):
@@ -549,6 +560,7 @@ def __init__(self, location, radius=500, color='black',
549560 {% endmacro %}
550561 """ )
551562
563+
552564class LatLngPopup (MacroElement ):
553565 def __init__ (self ):
554566 """
@@ -667,6 +679,7 @@ def _get_self_bounds(self):
667679 ]
668680 return bounds
669681
682+
670683class MultiPolyLine (MacroElement ):
671684 def __init__ (self , locations , color = None , weight = None ,
672685 opacity = None , latlon = True , popup = None ):
@@ -713,6 +726,7 @@ def __init__(self, locations, color=None, weight=None,
713726 {{this._parent.get_name()}}.addLayer({{this.get_name()}});
714727 {% endmacro %}
715728 """ ) # noqa
729+
716730 def _get_self_bounds (self ):
717731 """Computes the bounds of the object itself (not including it's children)
718732 in the form [[lat_min, lon_min], [lat_max, lon_max]]
@@ -731,6 +745,7 @@ def _get_self_bounds(self):
731745 ]
732746 return bounds
733747
748+
734749class CustomIcon (Icon ):
735750 def __init__ (self , icon_image , icon_size = None , icon_anchor = None ,
736751 shadow_image = None , shadow_size = None , shadow_anchor = None ,
0 commit comments