12
12
import numpy as np
13
13
import requests
14
14
from branca .colormap import ColorMap , LinearColormap , StepColormap
15
- from branca .element import Element , Figure , Html , IFrame , JavascriptLink , MacroElement
15
+ from branca .element import (
16
+ Div ,
17
+ Element ,
18
+ Figure ,
19
+ Html ,
20
+ IFrame ,
21
+ JavascriptLink ,
22
+ MacroElement ,
23
+ )
16
24
from branca .utilities import color_brewer
17
25
18
26
from folium .elements import JSCSSMixin
19
27
from folium .folium import Map
20
28
from folium .map import FeatureGroup , Icon , Layer , Marker , Popup , Tooltip
21
29
from folium .template import Template
22
30
from folium .utilities import (
31
+ TypeBoundsReturn ,
32
+ TypeContainer ,
23
33
TypeJsonValue ,
24
34
TypeLine ,
25
35
TypePathOptions ,
@@ -165,7 +175,7 @@ def __init__(
165
175
self .top = _parse_size (top )
166
176
self .position = position
167
177
168
- def render (self , ** kwargs ) -> None :
178
+ def render (self , ** kwargs ):
169
179
"""Renders the HTML representation of the element."""
170
180
super ().render (** kwargs )
171
181
@@ -284,9 +294,15 @@ def __init__(
284
294
self .top = _parse_size (top )
285
295
self .position = position
286
296
287
- def render (self , ** kwargs ) -> None :
297
+ def render (self , ** kwargs ):
288
298
"""Renders the HTML representation of the element."""
289
- self ._parent .html .add_child (
299
+ parent = self ._parent
300
+ if not isinstance (parent , (Figure , Div , Popup )):
301
+ raise TypeError (
302
+ "VegaLite elements can only be added to a Figure, Div, or Popup"
303
+ )
304
+
305
+ parent .html .add_child (
290
306
Element (
291
307
Template (
292
308
"""
@@ -331,7 +347,7 @@ def render(self, **kwargs) -> None:
331
347
embed_vegalite = embed_mapping .get (
332
348
self .vegalite_major_version , self ._embed_vegalite_v2
333
349
)
334
- embed_vegalite (figure )
350
+ embed_vegalite (figure = figure , parent = parent )
335
351
336
352
@property
337
353
def vegalite_major_version (self ) -> Optional [int ]:
@@ -342,8 +358,8 @@ def vegalite_major_version(self) -> Optional[int]:
342
358
343
359
return int (schema .split ("/" )[- 1 ].split ("." )[0 ].lstrip ("v" ))
344
360
345
- def _embed_vegalite_v5 (self , figure : Figure ) -> None :
346
- self ._vega_embed ()
361
+ def _embed_vegalite_v5 (self , figure : Figure , parent : TypeContainer ) -> None :
362
+ self ._vega_embed (parent = parent )
347
363
348
364
figure .header .add_child (
349
365
JavascriptLink ("https://cdn.jsdelivr.net/npm//vega@5" ), name = "vega"
@@ -356,8 +372,8 @@ def _embed_vegalite_v5(self, figure: Figure) -> None:
356
372
name = "vega-embed" ,
357
373
)
358
374
359
- def _embed_vegalite_v4 (self , figure : Figure ) -> None :
360
- self ._vega_embed ()
375
+ def _embed_vegalite_v4 (self , figure : Figure , parent : TypeContainer ) -> None :
376
+ self ._vega_embed (parent = parent )
361
377
362
378
figure .header .add_child (
363
379
JavascriptLink ("https://cdn.jsdelivr.net/npm//vega@5" ), name = "vega"
@@ -370,8 +386,8 @@ def _embed_vegalite_v4(self, figure: Figure) -> None:
370
386
name = "vega-embed" ,
371
387
)
372
388
373
- def _embed_vegalite_v3 (self , figure : Figure ) -> None :
374
- self ._vega_embed ()
389
+ def _embed_vegalite_v3 (self , figure : Figure , parent : TypeContainer ) -> None :
390
+ self ._vega_embed (parent = parent )
375
391
376
392
figure .header .add_child (
377
393
JavascriptLink ("https://cdn.jsdelivr.net/npm/vega@4" ), name = "vega"
@@ -384,8 +400,8 @@ def _embed_vegalite_v3(self, figure: Figure) -> None:
384
400
name = "vega-embed" ,
385
401
)
386
402
387
- def _embed_vegalite_v2 (self , figure : Figure ) -> None :
388
- self ._vega_embed ()
403
+ def _embed_vegalite_v2 (self , figure : Figure , parent : TypeContainer ) -> None :
404
+ self ._vega_embed (parent = parent )
389
405
390
406
figure .header .add_child (
391
407
JavascriptLink ("https://cdn.jsdelivr.net/npm/vega@3" ), name = "vega"
@@ -398,8 +414,8 @@ def _embed_vegalite_v2(self, figure: Figure) -> None:
398
414
name = "vega-embed" ,
399
415
)
400
416
401
- def _vega_embed (self ) -> None :
402
- self . _parent .script .add_child (
417
+ def _vega_embed (self , parent : TypeContainer ) -> None :
418
+ parent .script .add_child (
403
419
Element (
404
420
Template (
405
421
"""
@@ -412,8 +428,8 @@ def _vega_embed(self) -> None:
412
428
name = self .get_name (),
413
429
)
414
430
415
- def _embed_vegalite_v1 (self , figure : Figure ) -> None :
416
- self . _parent .script .add_child (
431
+ def _embed_vegalite_v1 (self , figure : Figure , parent : TypeContainer ) -> None :
432
+ parent .script .add_child (
417
433
Element (
418
434
Template (
419
435
"""
@@ -436,19 +452,19 @@ def _embed_vegalite_v1(self, figure: Figure) -> None:
436
452
figure .header .add_child (
437
453
JavascriptLink ("https://cdnjs.cloudflare.com/ajax/libs/vega/2.6.5/vega.js" ),
438
454
name = "vega" ,
439
- ) # noqa
455
+ )
440
456
figure .header .add_child (
441
457
JavascriptLink (
442
458
"https://cdnjs.cloudflare.com/ajax/libs/vega-lite/1.3.1/vega-lite.js"
443
459
),
444
460
name = "vega-lite" ,
445
- ) # noqa
461
+ )
446
462
figure .header .add_child (
447
463
JavascriptLink (
448
464
"https://cdnjs.cloudflare.com/ajax/libs/vega-embed/2.2.0/vega-embed.js"
449
465
),
450
466
name = "vega-embed" ,
451
- ) # noqa
467
+ )
452
468
453
469
454
470
class GeoJson (Layer ):
@@ -820,7 +836,7 @@ def _get_self_bounds(self) -> List[List[Optional[float]]]:
820
836
"""
821
837
return get_bounds (self .data , lonlat = True )
822
838
823
- def render (self , ** kwargs ) -> None :
839
+ def render (self , ** kwargs ):
824
840
self .parent_map = get_obj_in_upper_tree (self , Map )
825
841
# Need at least one feature, otherwise style mapping fails
826
842
if (self .style or self .highlight ) and self .data ["features" ]:
@@ -1041,12 +1057,12 @@ def recursive_get(data, keys):
1041
1057
self .style_function (feature )
1042
1058
) # noqa
1043
1059
1044
- def render (self , ** kwargs ) -> None :
1060
+ def render (self , ** kwargs ):
1045
1061
"""Renders the HTML representation of the element."""
1046
1062
self .style_data ()
1047
1063
super ().render (** kwargs )
1048
1064
1049
- def get_bounds (self ) -> List [ List [ float ]] :
1065
+ def get_bounds (self ) -> TypeBoundsReturn :
1050
1066
"""
1051
1067
Computes the bounds of the object itself (not including it's children)
1052
1068
in the form [[lat_min, lon_min], [lat_max, lon_max]]
@@ -1146,6 +1162,7 @@ def __init__(
1146
1162
1147
1163
def warn_for_geometry_collections (self ) -> None :
1148
1164
"""Checks for GeoJson GeometryCollection features to warn user about incompatibility."""
1165
+ assert isinstance (self ._parent , GeoJson )
1149
1166
geom_collections = [
1150
1167
feature .get ("properties" ) if feature .get ("properties" ) is not None else key
1151
1168
for key , feature in enumerate (self ._parent .data ["features" ])
@@ -1160,7 +1177,7 @@ def warn_for_geometry_collections(self) -> None:
1160
1177
UserWarning ,
1161
1178
)
1162
1179
1163
- def render (self , ** kwargs ) -> None :
1180
+ def render (self , ** kwargs ):
1164
1181
"""Renders the HTML representation of the element."""
1165
1182
figure = self .get_root ()
1166
1183
if isinstance (self ._parent , GeoJson ):
@@ -1565,7 +1582,7 @@ def __init__(
1565
1582
color_range = color_brewer (fill_color , n = nb_bins )
1566
1583
self .color_scale = StepColormap (
1567
1584
color_range ,
1568
- index = bin_edges ,
1585
+ index = list ( bin_edges ) ,
1569
1586
vmin = bins_min ,
1570
1587
vmax = bins_max ,
1571
1588
caption = legend_name ,
@@ -1625,7 +1642,7 @@ def highlight_function(x):
1625
1642
return {"weight" : line_weight + 2 , "fillOpacity" : fill_opacity + 0.2 }
1626
1643
1627
1644
if topojson :
1628
- self .geojson = TopoJson (
1645
+ self .geojson : Union [ TopoJson , GeoJson ] = TopoJson (
1629
1646
geo_data ,
1630
1647
topojson ,
1631
1648
style_function = style_function ,
@@ -1657,7 +1674,7 @@ def _get_by_key(cls, obj: Union[dict, list], key: str) -> Union[float, str, None
1657
1674
else :
1658
1675
return value
1659
1676
1660
- def render (self , ** kwargs ) -> None :
1677
+ def render (self , ** kwargs ):
1661
1678
"""Render the GeoJson/TopoJson and color scale objects."""
1662
1679
if self .color_scale :
1663
1680
# ColorMap needs Map as its parent
@@ -1963,8 +1980,13 @@ def __init__(
1963
1980
vmin = min (colors ),
1964
1981
vmax = max (colors ),
1965
1982
).to_step (nb_steps )
1966
- else :
1983
+ elif isinstance ( colormap , StepColormap ) :
1967
1984
cm = colormap
1985
+ else :
1986
+ raise TypeError (
1987
+ f"Unexpected type for argument `colormap`: { type (colormap )} "
1988
+ )
1989
+
1968
1990
out : Dict [str , List [List [List [float ]]]] = {}
1969
1991
for (lat1 , lng1 ), (lat2 , lng2 ), color in zip (coords [:- 1 ], coords [1 :], colors ):
1970
1992
out .setdefault (cm (color ), []).append ([[lat1 , lng1 ], [lat2 , lng2 ]])
0 commit comments