Search code examples
pythonhtmlfolium

How to add legend on html with folium?


I used this code to generate coordinates on html, but I want to add a legend to this html, what should I do?

import folium

m = folium.Map(location=[45.5236, -122.6750])
html = 'Hello'
popup=folium.Popup(html,show=True,max_width=400)
folium.Circle(
    location = [45.372, -122.6972],
    radius = 100,
    popup=popup,
    color='red',
    fill=True,
    fill_opacity=0.1
).add_to(m)
m.save(r'E:/test.html')

I want the effect like this: enter image description here


Solution

  • As r-beginners said.

    I use this example to add legend.

    from branca.element import Template, MacroElement
    import folium
    
    template = """
    {% macro html(this, kwargs) %}
    
    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>jQuery UI Draggable - Default functionality</title>
      <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    
      <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
      <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
      
      <script>
      $( function() {
        $( "#maplegend" ).draggable({
                        start: function (event, ui) {
                            $(this).css({
                                right: "auto",
                                top: "auto",
                                bottom: "auto"
                            });
                        }
                    });
    });
    
      </script>
    </head>
    <body>
    
     
    <div id='maplegend' class='maplegend' 
        style='position: absolute; z-index:9999; border:2px solid grey; background-color:rgba(255, 255, 255, 0.8);
         border-radius:6px; padding: 10px; font-size:14px; right: 20px; bottom: 20px;'>
         
    <div class='legend-title'>Legend (draggable!)</div>
    <div class='legend-scale'>
      <ul class='legend-labels'>
        <li><span style='background:red;opacity:0.7;'></span>Big</li>
        <li><span style='background:orange;opacity:0.7;'></span>Medium</li>
        <li><span style='background:green;opacity:0.7;'></span>Small</li>
    
      </ul>
    </div>
    </div>
     
    </body>
    </html>
    
    <style type='text/css'>
      .maplegend .legend-title {
        text-align: left;
        margin-bottom: 5px;
        font-weight: bold;
        font-size: 90%;
        }
      .maplegend .legend-scale ul {
        margin: 0;
        margin-bottom: 5px;
        padding: 0;
        float: left;
        list-style: none;
        }
      .maplegend .legend-scale ul li {
        font-size: 80%;
        list-style: none;
        margin-left: 0;
        line-height: 18px;
        margin-bottom: 2px;
        }
      .maplegend ul.legend-labels li span {
        display: block;
        float: left;
        height: 16px;
        width: 30px;
        margin-right: 5px;
        margin-left: 0;
        border: 1px solid #999;
        }
      .maplegend .legend-source {
        font-size: 80%;
        color: #777;
        clear: both;
        }
      .maplegend a {
        color: #777;
        }
    </style>
    {% endmacro %}"""
    
    
    m = folium.Map(location=[45.5236, -122.6750])
    html = 'Hello'
    popup=folium.Popup(html,show=True,max_width=400)
    folium.Circle(
        location = [45.372, -122.6972],
        radius = 100,
        popup=popup,
        color='red',
        fill=True,
        fill_opacity=0.1
    ).add_to(m)
    macro = MacroElement()
    macro._template = Template(template)
    
    m.get_root().add_child(macro)
    url = 'myTest.html'
    m.save(url)