Example #1
0
class JavaScript(MacroElement):
    """
  Creates a small snippet of raw JavaScript.

  Parameters
  ----------
  script: string, representing the JavaScript code to insert in the html file
  html: string, representing html code to insert in the <body> section of the html file
  args: dict, mapping between python vars and folium vars

  """
    _template = Template(u"""{% macro html(this, args) %}
        {{this.html.render(**this.args)}}
        {% endmacro %}
        {% macro script(this, args) %}
        {{this.script.render(**this.args)}}
        {% endmacro %}""")

    def __init__(self, script=None, html=None, args=None):
        super(JavaScript, self).__init__()
        self.script = Element(script)
        self.html = Element(html)
        self._name = "JavaScript"
        if args is None:
            args = {}
        self.args = args
def draw_with_folium_by_device_and_year_dbscan_center_circle_style():
    '''使用每人每个月的聚类中心坐标按照1-12月不同颜色去画圆
    每年、每人生成一个html,html中12种颜色代表12个月
    '''
    try:
        #12种颜色分别是红、绿、蓝、黄、紫、粉、青、棕、橙、赤红、森林绿、板岩灰
        twelve_months_color_list = ['#FF0000','#00FF00','#0000FF','#FFFF00','#800080','#FFC0CB','#00FFFF','#A52A2A','#FFA500','#DC143C','#228B22','#708090']
        device_center_save_by_year_csv_dir = r'E:/test_opencv/员工打卡分析/device_center_save_by_year/'
        folium_device_center_save_by_year_circle_html_dir = r'E:/test_opencv/员工打卡分析/folium_device_center_save_by_year_circle_html/'
        if not os.path.exists(folium_device_center_save_by_year_circle_html_dir):
            os.makedirs(folium_device_center_save_by_year_circle_html_dir)
        for root, dirs, files in os.walk(device_center_save_by_year_csv_dir):
            longitude_center_list = []
            latitude_center_list = []
            for file in files:
                if os.path.isfile(os.path.join(root, file)):
                    dbscan_center_coordinates_csv_name = os.path.join(root, file)
                    '''处理dbscan聚类后中心点坐标'''
                    df = pd.read_csv(dbscan_center_coordinates_csv_name, encoding='utf-8', low_memory=False)
                    # 计算dataframe经纬度中心坐标
                    longitude_center = df['longitude'].mean()
                    latitude_center = df['latitude'].mean()
                    longitude_center_list.append(longitude_center)
                    latitude_center_list.append(latitude_center)

            if longitude_center_list and latitude_center_list:
                longitude_cent = np.mean(longitude_center_list)#年度中心
                latitude_cent = np.mean(latitude_center_list)#年度中心
            else:
                continue

            m = folium.Map(location=[latitude_cent, longitude_cent], zoom_start=10, control_scale=True)
            macro = MacroElement()
            macro._template = Template(template)
            m.get_root().add_child(macro)
            for file in files:
                if os.path.isfile(os.path.join(root, file)):
                    dbscan_center_coordinates_csv_name = os.path.join(root, file)
                    '''处理dbscan聚类后中心点坐标'''
                    df = pd.read_csv(dbscan_center_coordinates_csv_name, encoding='utf-8', low_memory=False)
                    X = df
                    device_id = X['device_id'].iloc[0]  # 取组内第一个device_id用于存csv用
                    marketer_name = X['marketer_name'].iloc[0]  # 取组内第一个marketer_name用于存csv用
                    clock_time_year_month = str(X['clock_time_year_month'].iloc[0])  # 取组内第一个clock_time_year_month用于存csv用
                    year_month = clock_time_year_month[0:4]+'年'+clock_time_year_month[4:6]+'月'
                    month = int(clock_time_year_month[4:6])
                    month_index  = month -1
                    month_color = twelve_months_color_list[month_index]
                    for index, row in X.iterrows():
                        element_count_in_this_cluster = int(row['length'])
                        popup = folium.Popup(year_month, show=True,max_width=400)  # show=True代表地图加载时显示
                        folium.Circle(location=[row['latitude'], row['longitude']], radius=500, popup=popup, color=month_color,fill=True, fill_opacity=0.1).add_to(m)  # radius单位是米 #与dbscan半径对应
                        # folium.Marker(location=[row['latitude'], row['longitude']], popup=popup, icon=folium.Icon(color='red')).add_to(m) #红色标记
            url = folium_device_center_save_by_year_circle_html_dir + str(marketer_name) + '_' + str(clock_time_year_month[0:4]) + '.html'
            m.save(url)

    except Exception as ex:
        logger.error("Call method draw_with_folium_by_device_and_year_dbscan_center_circle_style() error!")
        logger.error("Exception:" + str(ex))
        raise ex
Example #3
0
def add_h3_legend(m, color_key: dict, title='Legend (draggable!)'):
    """
    Adds a legend for a categorical variable, dislayed by a colored hexagon.
        :param color_key: dictionary whose keys are the category names and values are the color codes
        :title: legend title
    """
    macro = MacroElement()
    macro._template = Template(make_h3_legend_html(color_key, title=title))
    m.get_root().add_child(macro)
    return m
Example #4
0
def render_nodes(node, parent):
    mf = Figure()
    mf._name = parent._name
    mf._id = parent._id
    mf._template = Template('{{this.script.render(**kwargs)}}\n')

    node.add_to(mf)
    html = mf.render()
    html = "".join([s for s in html.splitlines(True) if s.strip("\r\n")])
    return html
Example #5
0
    class LatLngListener(MacroElement):
        _template = Template(TEMPLATE % {
            'host': host,
            'port': port,
            'prefix': prefix
        })

        def __init__(self):
            super(MacroElement, self).__init__()
            self._name = 'LatLngListener'
Example #6
0
def map(pIndicador):
    indicador = pIndicador
    geo_json_data = json.load(
        open(r'G:\SISMOI\DADOS\vw_indicadores_ceara_simplified100_2.geojson'),
        encoding='utf8')

    # ,tiles='Stamen Terrain', tiles='OpenStreetMap'
    m = folium.Map([-5, -41],
                   zoom_start=7,
                   tiles='OpenStreetMap',
                   control_scale=True)

    folium.GeoJson(geo_json_data,
                   style_function=lambda feature: {
                       'fillColor':
                       colorMap[0]
                       if (feature['properties'][colunasIndicadores[indicador]]
                           > 0.0 and feature['properties'][colunasIndicadores[
                               indicador]] <= 0.2) else colorMap[1]
                       if (feature['properties'][colunasIndicadores[indicador]]
                           > 0.2 and feature['properties'][colunasIndicadores[
                               indicador]] <= 0.4) else colorMap[2]
                       if (feature['properties'][colunasIndicadores[indicador]]
                           > 0.4 and feature['properties'][colunasIndicadores[
                               indicador]] <= 0.6) else colorMap[3]
                       if (feature['properties'][colunasIndicadores[indicador]]
                           > 0.6 and feature['properties'][colunasIndicadores[
                               indicador]] <= 0.8) else colorMap[4],
                       'color':
                       '#d7d7d7',
                       'weight':
                       1
                   }).add_to(m)

    macro = MacroElement()
    s = getLegend(nomesIndicadores[indicador], colorMap)
    macro._template = Template(s)

    m.get_root().add_child(macro)
    '''
    folium.map.Marker(
        [-5, -41],
        icon=DivIcon(
            icon_size=(150,36),
            icon_anchor=(0,0),
            html='<div style="font-size: 24pt">Test</div>',
            )
        ).add_to(m)
    '''

    m

    m.save(r'C:\inetpub\wwwroot\sismoi.html')
Example #7
0
def visualize_prediction(df, color_dict, save_to):
    """[Creates folium map of activity path colored by predicted activity type]
    Args:
        df ([pandas df]): [dataframe of activity data including position_lat, position_long
                            and predicted_mode, the predicted activity type]
        color_dict ([dictionary]): [keys are activity types, values are colors]
        save_to ([string]): [filepath where folium map is saved]
    Returns:
        [folium.Map object]: [folium map of activity path colored by predicted activity type]
    """
    df['break'] = df['predicted_mode'] == df['predicted_mode'].shift(1)
    df['segment'] = None
    segment = 0
    rows = []
    for row in df.to_dict(orient='records'):
        if not row['break']:
            row['segment'] = segment
            segment += 1
        rows.append(row)
    df = pd.DataFrame(rows).fillna(method='ffill')

    central_lat = df.position_lat.mean()
    central_long = df.position_long.mean()
    m = folium.Map(location=[central_lat, central_long],
                   tiles="Stamen Terrain",
                   zoom_start=14.5)
    for segment in df.segment.unique():
        locations = df.query(f"segment=={segment}")[[
            'position_lat', 'position_long'
        ]]
        act_type = df.query(f"segment=={segment}")[['predicted_mode'
                                                    ]].values[0][0]
        folium.PolyLine(locations.values.tolist(),
                        color=color_dict[act_type],
                        weight=2.5,
                        opacity=0.9).add_to(m)
    macro = MacroElement()
    macro._template = Template(legend_helper.legend_string)
    m.add_child(macro)
    m.save(save_to)
    return m
def create_folium_map(venues, lati, longi, id):
    map = folium.Map([lati, longi], zoom_start=18, control_scale=True)

    i = 0
    color = [
        "red", "blue", "green", "gray", "pink", "darkred", "darkpurple",
        "orange", "purple", "cadetblue"
    ]
    popup_text = ""

    folium.CircleMarker(
        location=(lati, longi),
        radius=20,
        color="green",
        text="1",
        fill=True,
        icon=DivIcon(
            icon_size=(150, 36),
            icon_anchor=(7, 20),
            html='<div style="font-size: 18pt; color : black">1</div>',
        )).add_child(folium.Popup("AirBnb", parse_html=True,
                                  show=True)).add_to(map)
    htmlText = ""
    for lat, lon, name, cat in zip(venues['Latitude'], venues['Longitude'],
                                   venues['Name'], venues['Category']):
        popup_text = popup_text.format(i, 12, 12)

        folium.Marker([lat, lon],
                      popup='',
                      icon=folium.Icon(color=color[i],
                                       icon='map-marker-alt')).add_to(map)
        htmlText = htmlText + '<li style="font-size:12px"><i class="fa fa-map-marker" style="color:' + color[
            i] + ';font-size: 5em;"></i> ' + name + ' (' + cat + ')</li>'
        i += 1
    template = get_legend_template(htmlText)
    macro = MacroElement()
    macro._template = Template(template)
    map.get_root().add_child(macro)

    map.save('./templates/map.html')
Example #9
0
def create_map_clusters(data, city, kclusters, zoom=12, rainbow=None):
    """Create a map with folium, representing the restaurants location and cluster"""
    if rainbow is None:
        x = np.arange(kclusters)
        ys = [i + x + (i * x)**2 for i in range(kclusters)]
        colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))
        rainbow = [colors_map.rgb2hex(i) for i in colors_array]

    template = create_template(kclusters, rainbow)
    address = city
    geolocator = Nominatim(user_agent="ny_explorer")
    location = geolocator.geocode(address)
    latitude = location.latitude
    longitude = location.longitude

    map_clusters = folium.Map(location=[latitude, longitude], zoom_start=zoom)

    # set color scheme for the clusters

    # add markers to the map
    markers_colors = []
    for lat, lon, name, poi, cluster in zip(data['latitude'],
                                            data['longitude'], data["name"],
                                            data['Neighborhood'],
                                            data['Cluster Labels']):
        label = folium.Popup(str(name) + " at " + str(poi), parse_html=True)
        folium.CircleMarker([lat, lon],
                            radius=5,
                            popup=label,
                            color=rainbow[cluster],
                            fill=True,
                            fill_color=rainbow[cluster],
                            fill_opacity=0.7).add_to(map_clusters)

    macro = MacroElement()
    macro._template = Template(template)

    map_clusters.get_root().add_child(macro)

    return map_clusters
Example #10
0
def generate_map_legend() -> MacroElement:
    """
    Generates a legend for the map.

    :return: MacroElement, html added to the map
    """
    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>Dashboard</title>
      <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
      
      <link rel="preconnect" href="https://fonts.gstatic.com">
      <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet">

      <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>


    </head>
    <body>


    <div id='maplegend' class='maplegend' 
      style='
        position: absolute; 
        z-index:9999; 
        background-color:rgba(255, 255, 255, 0.8);
        border: 1px solid #D4D4D4;
        border-radius:6px; 
        padding: 10px; 
        font-size:14px; 
        right: 10px; 
        bottom: 23px;
      '>

    <div class='legend-scale'>
      <ul class='legend-labels'>
        <li><span style='background:#E87272;'></span>Unspecified</li>
        <li><span style='background:#7a0091;'></span>Navigation</li>
        <li><span style='background:#11498A;'></span>Fishing</li>
        <li><span style='background:#1A6D9B;'></span>Tug</li>
        <li><span style='background:#12A5B0;'></span>Passenger</li>
        <li><span style='background:#3A9971;'></span>Cargo</li>
        <li><span style='background:#79BD00;'></span>Tanker</li>
        <li><span style='background:#DBB657;'></span>Pleasure</li>
      </ul>
    </div>
    </div>

    </body>
    </html>

    <style type='text/css'>
      * {
        font-family: "Roboto", sans-serif;
      }

      .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;
        }

      .maplegend .legend-scale ul:last-child { 
        margin-bottom: 0px;
      }
      .maplegend .legend-scale ul li:last-child { 
        margin-bottom: 0px;
      }

    </style>
    {% endmacro %}"""

    macro = MacroElement()
    macro._template = Template(template)
    return macro
Example #11
0
def quick_geo_plot():
    import pandas as pd
    """Import Data"""
    file_i = '/Users/Derrick-Vlad-/Desktop/Output_Trail_1/Clean/v1.1/' + 'Quick_Geoplot_Filtered_LATEST.csv'
    df = pd.read_csv(file_i, sep=',', encoding='unicode_escape')
    """Filter Data"""
    #df = df[df['latitude'] != 'UnableToFind']
    #df = df[(df['Latitude'].astype(float) < 2.0) & (df['Longitude'].astype(float) < 104.0)]
    print(df[['Latitude', 'Longitude']].head())
    df = df[['Latitude', 'Longitude', 'Price ($)']]
    df = df.convert_objects(convert_numeric=True).dropna()
    print(df['Latitude'].dtype)
    print(df['Longitude'].dtype)
    print(df['Price ($)'].dtype)
    """Base Map"""
    import folium
    from folium.plugins import HeatMap

    def generateBaseMap(default_location=[1.3521, 103.8198],
                        default_zoom_start=12):
        base_map = folium.Map(location=default_location,
                              control_scale=True,
                              zoom_start=default_zoom_start)
        return base_map

    base_map = generateBaseMap()
    """Prep Data"""
    d = df[['Longitude', 'Latitude', 'Price ($)']].values.tolist()
    from folium import plugins
    """Customize Heat-Map"""
    # This
    gradient = {.6: 'blue', .98: 'lime', 1: 'red'}  # Original
    # Or This
    # import branca.colormap as cm
    # steps = 10
    # color_map = cm.LinearColormap('RGB').scale(0, 1).to_step(steps)
    # gradient = {}
    # for i in range(steps):
    #     gradient[1 / steps * i] = color_map.rgb_hex_str(1 / steps * i)
    max_amount = df['Price ($)'].max()
    m = plugins.HeatMap(d,
                        radius=11,
                        min_opacity=0.1,
                        max_zoom=1,
                        blur=12,
                        max_val=max_amount,
                        gradient=gradient).add_to(base_map)
    """Customize LEGEND"""
    from branca.element import Template, MacroElement
    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>High Priced</li>
        <li><span style='background:lime;opacity:0.7;'></span>Medium Priced</li>
        <li><span style='background:blue;opacity:0.7;'></span>Relatively Low Priced</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 %}"""

    macro = MacroElement()
    macro._template = Template(template)
    m.get_root().add_child(macro)

    m.save('Geo_Plot.html')
    import webbrowser, os

    webbrowser.open('file://' + os.path.realpath('index.html'))


#quick_geo_plot()
Example #12
0
def add_map_legend(m, title, items):
    """
    Adds a legend for a folium map.

    Parameters
    ----------
    m : folium.map.
        Represents a folium map.
    title : string.
        Represents the title of the legend.
    items : list of tuple.
        Represents the color and name of the legend items.

    References
    ----------
    https://github.com/python-visualization/folium/issues/528#issuecomment-421445303

    """

    item = "<li><span style='background:%srs;'></span>%srs</li>"
    list_items = '\n'.join([item % (c, n) for (n, c) in items])
    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">
      <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'> {} </div>
    <div class='legend-scale'>
      <ul class='legend-labels'>
        {}
      </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 %}}""".format(title, list_items)

    macro = MacroElement()
    macro._template = Template(template)

    m.get_root().add_child(macro)
Example #13
0
def geographic_graph(regional):
    """
    function that plots the geographic_graph of a variable in a specific date of all the regions in your regional dataframe
    open a browser's tab for showing the map requested
    don't :return:
    """
    variables = regional.columns[::]
    variables = variables.delete([0, 1, 2, 3, 4, 5, 20, 22, 23])
    my_date = verify_date(regional)
    obs = variables_pool(variables, "Insert variable to analyze")
    regional["data"] = regional["data"].str[0:10]
    entries = regional["data"] == str(my_date)
    list_value = regional[entries][obs].tolist()
    longitudini = regional["long"].tolist()[:21]
    latitudini = regional["lat"].tolist()[:21]
    nomi = regional["denominazione_regione"].tolist()[:21]

    color = []
    for k in range(0, len(list_value)):
        if math.isnan(list_value[k]) or list_value[k] == 0:
            list_value[k] = 0
            color.append("green")
        else:
            color.append("crimson")
    try:
        alfa = max(list_value)
        omega = 50000
        scaled_value_list = []
        for i in range(0, len(list_value)):
            equation = (list_value[i] * omega) / alfa
            scaled_value_list.append(equation)
    except ZeroDivisionError:
        scaled_value_list = [0] * len(list_value)

        print("[!] Value not defined in this date")
    m = folium.Map(location=[41.87194, 12.56738],
                   tiles="CartoDB positron",
                   min_zoom=5.8,
                   max_zoom=7,
                   zoom_start=5.8,
                   zoom_control=True,
                   min_lat=36,
                   max_lat=47,
                   min_lon=9.5,
                   max_lon=15.5,
                   max_bounds=True)
    for i in range(0, len(list_value)):
        list_value[i] = int(list_value[i])
        folium.Circle(location=(latitudini[i], longitudini[i]),
                      popup=nomi[i] + "\n" +
                      obs.replace("_", " ").capitalize() + ": " +
                      str(list_value[i]),
                      radius=scaled_value_list[i],
                      color=color[i],
                      fill=True,
                      fill_color='crimson').add_to(m)
    template1 = "    {% 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>ITALY COVID-19</title>   </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'>"
    template = "Data: %s</div>" % str(my_date)
    template = template1 + template
    template = template + "    <div class='legend-scale'>      <ul class='legend-labels'>        <li><span style='background:red;opacity:0.7;'></span>Valore presente</li>        <li><span style='background:green;opacity:0.7;'></span>Valore non presente</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 %}"
    macro = MacroElement()
    macro._template = Template(template)
    m.add_child(macro)
    m.save("data" + os.sep + "%s_italy_%s.html" % (str(my_date), obs))
    webbrowser.open_new_tab("data" + os.sep + "%s_italy_%s.html" %
                            (str(my_date), obs))
Example #14
0
def map_graph():
    # GeoJson Data
    cluster_gj = gpd.read_file("data/dengue-clusters-geojson.geojson")
    area_high_ades_gj = gpd.read_file(
        "data/areas-with-high-aedes-population-geojson.geojson")

    # Creation of map
    kw = {"location": [1.3521, 103.8198], "zoom_start": 12}
    m = folium.Map(**kw)

    # Styles
    area_high_ades_style = {"fillColor": "#228B22", "color": "#FF0000"}

    # Modifying tooltip
    cluster_gj.Description = cluster_gj.Description.map(
        lambda x: re.search(r"(<td>.*?</td>)", x).group(0)[4:-5])

    area_high_ades_gj.Description = area_high_ades_gj.Description.map(
        lambda x: re.search(r"(<td>.*?</td>)", x).group(0)[4:-5])

    # Addition of layers to map
    folium.GeoJson(
        cluster_gj,
        tooltip=folium.GeoJsonTooltip(fields=["Description"],
                                      aliases=["Location"],
                                      localize=True),
    ).add_to(m)

    folium.GeoJson(
        area_high_ades_gj,
        style_function=lambda x: area_high_ades_style,
        tooltip=folium.GeoJsonTooltip(fields=["Description"],
                                      aliases=["Location"],
                                      localize=True),
    ).add_to(m)

    # Legend
    # Template from: https://nbviewer.jupyter.org/gist/talbertc-usgs/18f8901fc98f109f2b71156cf3ac81cd
    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</div>
    <div class='legend-scale'>
    <ul class='legend-labels'>
        <li><span style='background:#73adff;opacity:0.9;'></span>Dengue clusters</li>
        <li><span style='background:#FF0000;opacity:0.7;'></span>Areas with high ades population</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 %}"""

    macro = MacroElement()
    macro._template = Template(template)
    m.get_root().add_child(macro)

    m.save("dengue-cluster.html")
    return m
Example #15
0
def map_legend(col_pilot_dict):
    from branca.element import Template, MacroElement
    legend_txt = ""
    for pilot in col_pilot_dict:
        legend_txt += ("<li><span style='background:" + col_pilot_dict[pilot] +
                       ";opacity:0.7;'></span>" + pilot + "</li>")

    first_block = """
    {% 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/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'>"""

    second_block = """</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 %}"""

    template = first_block + legend_txt + second_block
    macro = MacroElement()
    macro._template = Template(template)
    return macro
Example #16
0
    margin-left: 0;
    border: 1px solid #999;
    }
  .maplegend .legend-source {
    font-size: 80%;
    color: #777;
    clear: both;
    }
  .maplegend a {
    color: #777;
    }
</style>
{% endmacro %}"""

macro = MacroElement()
macro._template = Template(template)

html = """
    <h3> Event ID  : </h3><p>{}</p>
    <h3> Event Name: </h3><p></p>
    <h3> Location: </h3><p>{}</p>
    """

legend_html = """
     <div style=”position: fixed; 
     bottom: 50px; left: 50px; width: 100px; height: 90px; 
     border:2px solid grey; z-index:9999; font-size:14px;
     “>&nbsp; Cool Legend <br>
     &nbsp; East &nbsp; <i class=”fa fa-map-marker fa-2x”
                  style=”color:green”></i><br>
     &nbsp; West &nbsp; <i class=”fa fa-map-marker fa-2x”
Example #17
0
def legend(map):
    '''Funtion to create a custom Folium map legend using branca.element class 
    
    Parameters:
    -----------
    map (folium.folium.Map): Folium Map Object

    Returns:
    --------
    no returns
    
    '''

    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: 2px; font-size:14px; right: 20px; bottom: 20px;'>

        <div class='legend-title'>Legend (draggable!)</div>

        <div class="container">
          <div class="left">
            <p>
              <b>Hotpots 24 hours</b>
            </p>
          </div>
          <div class="right"> 
            <img width="30" height="30" src="icons/fire24.png" alt="fire 24h"/>  
          </div>
        </div>

        <div class="container">
          <div class="left">
            <p>
              <b>Hotpots 48 hours</b>
            </p>
          </div>
          <div class="right"> 
            <img width="30" height="30" src="icons/fire48.png" alt="fire 48h"/>  
          </div>
        </div>

         <div class="container">
          <div class="left">
            <p>
              <b>Hotpots 7 days</b>
            </p>
          </div>
          <div class="right"> 
            <img width="30" height="30" src="icons/fire7d.png" alt="fire 7d"/>  
          </div>
        </div>
        <br>
      </div>

      </body>
      </html>

      <style type='text/css'>
        .maplegend .legend-title {
          text-align: left;
          font-weight: bold;
          font-size: 90%;
          }
        .maplegend a {
          color: #777;
          }
        .container {
          width:150px;
          display:table;
          margin-bottom: -15px;
          padding: 2px;
        }
          .container > div {
            display:table-cell;
          }
            .container > div p {
              margin:0;
            }
            .container .left {
              text-align:left;
              font-size: 80%;
              color: #777;
              clear: both;
              vertical-align: bottom;
            }
            .container .right {
              text-align:center;
            }
      </style>
      {% endmacro %}"""

    macro = MacroElement()

    macro._template = Template(template)

    map.get_root().add_child(macro)
Example #18
0
def create_categorical_legend(map, palette, classnames):
    """
    Function to create and add a categorical legend to a folium map.

    :param map: folium map to which the legend will be added
    :param palette: list with color codes for each class
    :param classnames: list with class names, matching the palette list
    :return: folium map with categorical legend
    """
    categories = ""
    # creates class category label to add to legend
    for ind, cl in enumerate(classnames):
        categories += f"<li><span style='background:#{palette[ind]};opacity:0.85;'></span>{classnames[cl]}</li>"

    template_head = """
    {% 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>
    """

    styling = f"""
    <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</div>
    <div class='legend-scale'>
      <ul class='legend-labels'>
        {categories}
      </ul>
    </div>
    </div>

    </body>
    </html>
    """
    end = """
    <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 %}"""

    template = template_head + styling + end  # Combine all the parts into a single templace docstring
    macro = MacroElement()
    macro._template = Template(template)  # create an element

    return map.get_root().add_child(
        macro)  # add element to the map and return the map
Example #19
0
def generate_location_map(reportfolderbase, legend_title):
    KML_path = os.path.join(reportfolderbase, iLEAPP_KMLs)
    if not os.path.isdir(KML_path) or not os.listdir(KML_path):
        return

    location_path = os.path.join(reportfolderbase, 'LOCATIONS')
    os.makedirs(location_path, exist_ok=True)
    db = sqlite3.connect(os.path.join(KML_path, "_latlong.db"))
    df = pd.read_sql_query(
        "SELECT key as Name, Activity as Description, latitude, longitude FROM data ;",
        db)
    df["Point"] = df.apply(
        lambda row: Point(float(row['longitude']), float(row['latitude']), .0),
        axis=1)

    #sorting is needed for correct display
    df.sort_values(by=['Name'], inplace=True)

    #Parse geo data and add to Folium Map
    data_names = df[~df.Description.str.contains('Photos')].Description.unique(
    )
    featuresProp = {}

    for c, d in zip(colors, data_names):
        descFilter = d
        if 'ZRT' in d:
            fType = 'LineString'
            icon = 'marker'
            iconUrl = defaultIconUrl.format(c)
            shadowUrl = defaultShadowUrl
        else:
            fType = 'MultiPoint'
            icon = 'circle'
            iconUrl = ''
            shadowUrl = ''

        color = c

        featuresProp[d] = {
            'fType': fType,
            'color': c,
            'icon': icon,
            'iconUrl': iconUrl,
            'shadowUrl': defaultShadowUrl,
        }

    location_map = folium.Map([df.iloc[0].Point.y, df.iloc[0].Point.x],
                              prefer_canvas=True,
                              zoom_start=6)
    bounds = (
        df[~df.Description.str.contains('Photos')]['longitude'].min(),
        df[~df.Description.str.contains('Photos')]['latitude'].min(),
        df[~df.Description.str.contains('Photos')]['longitude'].max(),
        df[~df.Description.str.contains('Photos')]['latitude'].max(),
    )
    location_map.fit_bounds([
        (bounds[1], bounds[0]),
        (bounds[3], bounds[2]),
    ])

    tsGeo = TimestampedGeoJson(
        {
            'type': 'FeatureCollection',
            'features':
            [geodfToFeatures(df, f, featuresProp) for f in data_names]
        },
        period="PT1M",
        duration="PT1H",
        loop=False,
        transition_time=50,
        time_slider_drag_update=True,
        add_last_point=True,
        max_speed=200).add_to(location_map)

    #legend
    legend = '\n'.join([
        legend_tag.format(featuresProp[f]['color'], htmlencode(f))
        for f in data_names
    ])
    template = '\n'.join([
        template_part1,
        legend_title_tag.format(htmlencode(legend_title)),
        legend_div.format(legend), template_part2
    ])

    macro = MacroElement()
    macro._template = Template(template)

    location_map.get_root().add_child(macro)

    location_map.save(os.path.join(location_path, "Locations_Map.html"))

    report = ArtifactHtmlReport('Locations Map')
    report.start_artifact_report(location_path, 'Locations Map',
                                 'Map plotting all locations')
    report.write_raw_html(
        open(os.path.join(location_path, "Locations_Map.html")).read())
    report.end_artifact_report()
Example #20
0
def plot_initial_state(current_df,geojson):
    
    # Initiate map
    m = folium.Map(location=[62, 20], zoom_start=5)
    
    # Define styling rules for counties
    def style_function(feature):
        d = feature['properties']['name']   
        
        if current_df.at[d,"Rate"] < 0.5:
            if current_df.at[d,"SurplusCapacity"] > 3:
                color = '#7AA826' #green
            else: 
                color = '#FFCA2D' #yellow
        elif 0.5 <= current_df.at[d,"Rate"] < 0.9:
            color='#FFCA2D' #yellow
        elif 0.9 <= current_df.at[d,"Rate"] <= 1:
            color='#EA830E' #orange 
        elif 1 < current_df.at[d,"Rate"]:
            color='#BF2C2A'  #red
            
        return {'fillOpacity': 0.4,'weight': 0.5,
                'color': 'black','fillColor': color}
    
    # Import geojson data and apply styling rule
    folium.GeoJson(
        geojson,
        name='geojson',
        style_function=style_function
    ).add_to(m)
    
    # Add a clickable circle to each county
    for idx, row in current_df.iterrows():           
        
        # Define styling rules
        if row.Rate < 0.5:
            if row.SurplusCapacity > 3:
                color = '#7AA826' #green
            else: 
                color = '#FFCA2D' #yellow
        elif 0.5 <= row.Rate < 0.9:
            color='#FFCA2D' #yellow
        elif 0.9 <= row.Rate <= 1:
            color='#EA830E' #orange
        elif 1 < row.Rate:
            color='#BF2C2A'  #red
        
        # Draw circle
        folium.Circle(
            radius= 7000 + row.IVA*200,
            location=[row.Lat, row.Long],
            popup=folium.Popup('<b>'+row.Region+'</b><br>'+\
                               '<br>Patienter: '+str(row.IVA)+\
                               '<br>Kapacitet: '+str(row.Capacity),
                               max_width=450,min_width=150),
            color=color,
            fill=True,
            fill_color=color,
            tooltip="Klicka här!",
        ).add_to(m)
        
    from branca.element import Template, MacroElement

    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'>Color code explanation</div>
    <div class='legend-scale'>
      <ul class='legend-labels'>
        <li><span style='background:#BF2C2A;opacity:0.7;'></span>Over 100% of capacity</li>
        <li><span style='background:#EA830E;opacity:0.7;'></span>Between 90% and 100% of capacity</li>
        <li><span style='background:#FFCA2D;opacity:0.7;'></span>Between 50% and 90% of capacity</li>
        <li><span style='background:#7AA826;opacity:0.7;'></span>Less than 50% of capacity</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 %}"""

    macro = MacroElement()
    macro._template = Template(template)
    m.get_root().add_child(macro)
    
    return m
Example #21
0
def plot_to_map(
    camera_pano_path,
    mountains_in_sight,
    coordinates,
    filename,
    dem_file,
    converter,
    locs=None,
    mountains=None,
    images=None,
):
    p_i("Creating Interactive Map")
    c_lat, c_lon, _, _ = coordinates
    ll, ul, ur, lr = location_handler.get_raster_bounds(dem_file)
    load_dotenv()
    MAPBOX_TOKEN = os.getenv("MAPBOX_TOKEN")
    MAPBOX_STYLE_URL = os.getenv("MAPBOX_STYLE_URL")
    m = folium.Map(
        [c_lat, c_lon],
        tiles=None,
        zoom_start=12,
        scrollWheelZoom=False,
    )
    folium.TileLayer(
        location=[c_lat, c_lon],
        tiles=MAPBOX_STYLE_URL,
        API_key=MAPBOX_TOKEN,
        attr="Christian Hein",
        name="Settings",
    ).add_to(m)

    min_ele, max_ele = 10000, 0
    for i in mountains:
        if i.location.elevation > max_ele:
            max_ele = i.location.elevation
        if i.location.elevation < min_ele:
            min_ele = i.location.elevation

    ###########################################################################
    ###########################################################################
    # All mountains in dataset

    if mountains:
        mountains_fg = folium.FeatureGroup(name="All Mountains", show=False)
        m.add_child(mountains_fg)
        [(folium.Marker(
            location=(i.location.latitude, i.location.longitude),
            popup="%s\n%im" % (
                str(i.name),
                i.location.elevation,
            ),
            icon=folium.DivIcon(html=get_glyph(
                f"am-{i.name}-{int(i.location.elevation)}", "#755239",
                i.location.elevation, min_ele, max_ele)),
            zIndexOffset=1,
        ).add_to(mountains_fg)) for i in mountains]

    ###########################################################################
    ###########################################################################
    # Mountains in sight

    if mountains_in_sight:
        mountains_in_sight_fg = folium.FeatureGroup(name="Visible Mountains",
                                                    show=True)
        m.add_child(mountains_in_sight_fg)

        [(folium.Marker(
            location=(i.location.latitude, i.location.longitude),
            popup="%s\n%im" % (
                str(i.name),
                i.location.elevation,
            ),
            icon=folium.DivIcon(html=get_glyph(
                f"vm-{i.name}-{int(i.location.elevation)}", "#426877",
                i.location.elevation, min_ele, max_ele)),
            zIndexOffset=10,
        ).add_to(mountains_in_sight_fg)) for i in mountains_in_sight]

    ###########################################################################
    ###########################################################################
    # Other images in dataset

    if images:
        images_fg = folium.FeatureGroup(name="Visible Images", show=True)
        m.add_child(images_fg)
        for im in images:
            encoded = base64.b64encode(open(im.thumbnail_path, "rb").read())

            html = f'''
            <!doctype html>
            <html>
                <head>
                    <style>
                        .redirect-button {{
                            color: #fff;
                            cursor: pointer;
                            background-color: #6c757d;
                            border-color: #6c757d;
                            display: inline-block;
                            font-weight: 400;
                            line-height: 1.5;
                            text-align: center;
                            text-decoration: none;
                            vertical-align: middle;
                            padding: .375rem .75rem;
                            border-radius: .25rem;
                            transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
                        }}

                        .redirect-button:hover {{
                            color: #fff;
                            background-color: #5c636a;
                            border-color: #545b62;
                        }}
                    </style>
                    <script type="text/javascript">
                        function redirect() {{
                            console.log("Redirecting to: ", "{im.name}");
                            window.parent.parent.postMessage("{im.name}", '*');
                        }}
                    </script>
                </head>
                <body>
                    <button class="redirect-button" onclick="redirect();">View image</button>
                    <img src="data:image/JPG;base64,{encoded.decode("UTF-8")}">
                </body>
            </html>
            '''
            iframe = folium.IFrame(html, width=450 + 20, height=150 + 20)
            popup = folium.Popup(iframe, max_width=470)

            folium.Marker(
                location=(im.location.latitude, im.location.longitude),
                popup=popup,
                icon=folium.Icon(color="orange", icon="camera"),
                zIndexOffset=12,
            ).add_to(images_fg)

    ###########################################################################
    ###########################################################################
    # Current viewpoint

    encoded = base64.b64encode(open(camera_pano_path, "rb").read())
    html = f'''
    <!doctype html>
    <html>
        <img src="data:image/JPG;base64,{encoded.decode("UTF-8")}">
    </html>
    '''
    iframe = folium.IFrame(html, width=450 + 20, height=150 + 20)
    popup = folium.Popup(iframe, max_width=450)
    folium.Marker(
        location=[c_lat, c_lon],
        popup=popup,
        icon=folium.Icon(color="green", icon="camera"),
        zIndexOffset=13,
    ).add_to(m)

    ###########################################################################
    ###########################################################################
    # Visible coordinates

    if locs:
        locs_fg = folium.FeatureGroup(name="Retrieved Coordinates", show=True)
        m.add_child(locs_fg)
        for i in locs:
            loc = converter.convert(*i)
            folium.Circle(
                location=(loc.latitude, loc.longitude),
                color="#0a6496",
                fill=True,
                fill_color="#0a6496",
                fill_opacity=1,
                radius=15,
            ).add_to(locs_fg)

    ###########################################################################
    ###########################################################################
    # Raster bounds

    raster_bounds = folium.FeatureGroup(name="Raster Bounds", show=False)
    m.add_child(raster_bounds)
    folium.PolyLine(locations=[ll, ul, ur, lr, ll],
                    color="#d63e29",
                    zIndexOffset=15).add_to(raster_bounds)

    ###########################################################################
    ###########################################################################
    # Legend

    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">
    </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 10px 1px; font-size:16px; font-weight:500; right: 20px; bottom: 24px;'>
        <div class='legend-scale'>
            <ul class='legend-labels'>
                <li><span style='background:#71b025;opacity:1.0;'></span>Current Viewpoint</li>
                <li><span style='background:#f69730;opacity:1.0;'></span>Images in dataset</li>
                <li><span style='background:#755239;opacity:1.0;'></span>All mountains in dataset</li>
                <li><span style='background:#426877;opacity:1.0;'></span>Mountains in sight</li>
                <li><span style='background:#d63e29;opacity:1.0;'></span>DEM bounding box</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 %}"""

    macro = MacroElement()
    macro._template = Template(template)

    ###########################################################################
    ###########################################################################
    # Add to map
    folium.LayerControl().add_to(m)
    m.get_root().add_child(macro)
    # m.add_child(Fullscreen(position='topleft'))

    m.save(filename)
Example #22
0
def index():
    # UP Diliman coordinates
    start_coords = (14.6538, 121.0685)

    macro = MacroElement()

    # Geojson data
    route = os.path.join('map_data', 'route.json')

    # initialize excel file for data writing
    wb = Workbook()
    ws = wb.active
    ws['A1'] = 'Case number'
    ws['B1'] = '# of Passengers'
    ws['C1'] = 'Radial Parameter Pass (m)'
    ws['D1'] = '# of Drivers'
    ws['E1'] = 'Radial Parameter Driver (m)'
    ws['F1'] = 'Route Length (km)'
    ws['G1'] = 'Route Time (minutes)'
    ws['H1'] = '# of Matches'
    ws['I1'] = 'Trip Price (Php)'
    ws['J1'] = 'SRPs'
    ws['K1'] = 'SRPs'
    ws['L1'] = 'SRPs'
    ws['M1'] = 'Average SRP'
    ws['N1'] = 'Processing time (seconds)'
    ws['O1'] = 'Route Length (km)'
    ws['P1'] = 'Route Time (minutes)'
    ws['Q1'] = '# of Matches'
    ws['R1'] = 'Trip Price (Php)'
    ws['S1'] = 'SRPs'
    ws['T1'] = 'SRPs'
    ws['U1'] = 'SRPs'
    ws['V1'] = 'Average SRP'
    ws['W1'] = 'Angle'
    ws['X1'] = 'Processing time (seconds)'

    # passengers = ['30763177','5585622052','30763115']
    # passenger_destinations = ['17216442','2517360527','2517360522']
    # drivers = ['30763220','1402297896','5499240548']
    # passengers = ['5446811375','29025439','17216409']
    # passenger_destinations = ['17216442','2517360527','2517360522']
    # drivers = ['30763220','1402297896','5499240548']

    passengers = load_object('passenger_sources.pkl')
    passenger_destinations = load_object('passenger_destinations.pkl')
    drivers = load_object('driver_locations.pkl')
    pass_radii = load_object('rand_pass_radii.pkl')
    dri_radii = load_object('rand_dri_radii.pkl')

    # ctr = 0
    row_excel = 2
    main_ctr = 0
    while main_ctr < 300:
        a = ws.cell(row = row_excel, column = 1)
        a.value = main_ctr+1
        a = ws.cell(row = row_excel, column = 2)
        a.value = len(passengers[main_ctr])
        a = ws.cell(row = row_excel, column = 3)
        a.value = pass_radii[main_ctr]
        a = ws.cell(row = row_excel, column = 4)
        a.value = len(drivers[main_ctr])
        a = ws.cell(row = row_excel, column = 5)
        a.value = dri_radii[main_ctr]

        folium_map = folium.Map(location=start_coords,zoom_start=16,height='85%')

        # searchbased-rs implementation ------------------
        start_time = time.perf_counter()
        sources, destinations, path, route_distance, route_time, fare, srp_list = searchbasedRS('adj_list_obj.pkl', drivers[main_ctr], passengers[main_ctr], passenger_destinations[main_ctr], 0.5, row_excel)
        end_time = time.perf_counter()
        print('\nSearch-BasedRS time elapsed (seconds): ' + str(end_time - start_time) + '\n')
        if sources != None:
            a = ws.cell(row = row_excel, column = 6)
            a.value = route_distance
            a = ws.cell(row = row_excel, column = 7)
            a.value = route_time
            a = ws.cell(row = row_excel, column = 8)
            a.value = len(sources)
            a = ws.cell(row = row_excel, column = 9)
            a.value = fare
            srp_column = 10
            for srp in srp_list:
                a = ws.cell(row = row_excel, column = srp_column)
                a.value = srp
                srp_column += 1
            a = ws.cell(row = row_excel, column = 14)
            a.value = end_time - start_time
        # ------------------------------------------------

        # save html file for searchbased
        # ----------------------------------------------------------------------- #
            driver_coordinates = get_coordinates('nodes_coordinates.pkl', drivers[main_ctr])
            for driver_coordinate in driver_coordinates:
                    # folium.Marker(driver_coordinate, tooltip='Driver', icon=folium.Icon(color='red', icon='user')).add_to(folium_map),
                     # Create custom marker icon
                    car_icon = folium.features.CustomIcon('map_data/car_marker.png', icon_size=(40, 40))
                    folium.Marker(driver_coordinate,icon=car_icon).add_to(folium_map),

            # # add additional markers and path if match/es found
            if sources!=None:
                # add path
                coordinates = get_coordinates('nodes_coordinates.pkl', path)
                way_sample=folium.PolyLine(locations=coordinates,weight=5,color = 'red')
                folium_map.add_child(way_sample)
                # Create markers for matched sources and destinations
                # markers for other available passengers shown
                # All drivers will have a marker to mimic actual ride sharing applications
                coordinates_pass = get_coordinates('nodes_coordinates.pkl', passengers[main_ctr])
                for passenger in coordinates_pass:
                    if passenger in coordinates:
                        continue
                    icon_color = 'beige'
                    folium.Marker(passenger, tooltip='Source', icon=folium.Icon(color=icon_color, icon='user')).add_to(folium_map),

                ctr = 0
                for source in sources:
                    index = path.index(source)
                    if ctr == 0:
                        icon_color = 'blue'
                    elif ctr == 1:
                        icon_color = 'green'
                    elif ctr == 2:
                        icon_color = 'purple'
                    folium.Marker(coordinates[index], tooltip='Source', icon=folium.Icon(color=icon_color, icon='chevron-up')).add_to(folium_map),
                    ctr+=1

                ctr = 0
                for destination in destinations:
                    index = path.index(destination)
                    if ctr == 0:
                        icon_color = 'blue'
                    elif ctr == 1:
                        icon_color = 'green'
                    elif ctr == 2:
                        icon_color = 'purple'
                    folium.Marker(coordinates[index], tooltip='Destination', icon=folium.Icon(color=icon_color, icon='chevron-down')).add_to(folium_map),
                    ctr+=1

                # add legend
                if len(sources) == 1:
                    macro._template = Template(template1)
                    folium_map.get_root().add_child(macro)
                elif len(sources) == 2:
                    macro._template = Template(template2)
                    folium_map.get_root().add_child(macro)
                else:
                    macro._template = Template(template3)
                    folium_map.get_root().add_child(macro)

        # # Geojson overlay
        # folium.GeoJson(route, name='route').add_to(folium_map)

        fn='templates/map.html'
        fn = fn.replace(fn, 'templates/map' + str(main_ctr) + '_search.html')
        folium_map.save(fn)

        folium_map = folium.Map(location=start_coords,zoom_start=16,height='85%')
        # # grab algorithm implementation ------------------
        start_time = time.perf_counter()
        sources, destinations, path, route_distance, route_time, fare, srp_list, angle = grab_share('adj_list_obj.pkl', drivers[main_ctr], passengers[main_ctr], passenger_destinations[main_ctr], 60)
        end_time = time.perf_counter()
        print('\nGrabShare Algorithm time elapsed (seconds): ' + str(end_time - start_time) + '\n')
        if sources != None:
            a = ws.cell(row = row_excel, column = 15)
            a.value = route_distance
            a = ws.cell(row = row_excel, column = 16)
            a.value = route_time
            a = ws.cell(row = row_excel, column = 17)
            a.value = len(sources)
            a = ws.cell(row = row_excel, column = 18)
            a.value = fare
            srp_column = 19
            for srp in srp_list:
                a = ws.cell(row = row_excel, column = srp_column)
                a.value = srp
                srp_column += 1
            a = ws.cell(row = row_excel, column = 23)
            a.value = angle
            a = ws.cell(row = row_excel, column = 24)
            a.value = end_time - start_time

            # save html file for grab
            # ----------------------------------------------------------------------- #
            driver_coordinates = get_coordinates('nodes_coordinates.pkl', drivers[main_ctr])
            for driver_coordinate in driver_coordinates:
                    # folium.Marker(driver_coordinate, tooltip='Driver', icon=folium.Icon(color='red', icon='user')).add_to(folium_map),
                     # Create custom marker icon
                    car_icon = folium.features.CustomIcon('map_data/car_marker.png', icon_size=(40, 40))
                    folium.Marker(driver_coordinate,icon=car_icon).add_to(folium_map),

            # # add additional markers and path if match/es found
            if sources!=None:
                # add path
                coordinates = get_coordinates('nodes_coordinates.pkl', path)
                way_sample=folium.PolyLine(locations=coordinates,weight=5,color = 'red')
                folium_map.add_child(way_sample)
                # Create markers for matched sources and destinations
                # markers for other available passengers shown
                # All drivers will have a marker to mimic actual ride sharing applications
                coordinates_pass = get_coordinates('nodes_coordinates.pkl', passengers[main_ctr])
                for passenger in coordinates_pass:
                    if passenger in coordinates:
                        continue
                    icon_color = 'beige'
                    folium.Marker(passenger, tooltip='Source', icon=folium.Icon(color=icon_color, icon='user')).add_to(folium_map),

                ctr = 0
                for source in sources:
                    index = path.index(source)
                    if ctr == 0:
                        icon_color = 'blue'
                    elif ctr == 1:
                        icon_color = 'green'
                    elif ctr == 2:
                        icon_color = 'purple'
                    folium.Marker(coordinates[index], tooltip='Source', icon=folium.Icon(color=icon_color, icon='chevron-up')).add_to(folium_map),
                    ctr+=1

                ctr = 0
                for destination in destinations:
                    index = path.index(destination)
                    if ctr == 0:
                        icon_color = 'blue'
                    elif ctr == 1:
                        icon_color = 'green'
                    elif ctr == 2:
                        icon_color = 'purple'
                    folium.Marker(coordinates[index], tooltip='Destination', icon=folium.Icon(color=icon_color, icon='chevron-down')).add_to(folium_map),
                    ctr+=1

                # add legend
                if len(sources) == 1:
                    macro._template = Template(template1)
                    folium_map.get_root().add_child(macro)
                elif len(sources) == 2:
                    macro._template = Template(template2)
                    folium_map.get_root().add_child(macro)
                else:
                    macro._template = Template(template3)
                    folium_map.get_root().add_child(macro)

        # # Geojson overlay
        # folium.GeoJson(route, name='route').add_to(folium_map)

        fn='templates/map.html'
        fn = fn.replace(fn, 'templates/map' + str(main_ctr) + '_grab.html')
        folium_map.save(fn)

        # # ------------------------------------------------
        row_excel += 1
        main_ctr += 1


    wb.save('data.xlsx')
    return render_template('index.html')
Example #23
0
def create_legend(folium_object, service, events, hostelry):
    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: 470px; bottom: 100px;'>

    <div class='legend-title'>Legend</div>
    <div class='legend-scale'>
      <ul class='legend-labels'>
        <li><span style='background:#400D79;opacity:0.7;'></span>Companies</li>
        <li><span style='background:#3386FF;opacity:0.7;'></span>""" + service.title(
    ) + """s</li>
        <li><span style='background:#158E34;opacity:0.7;'></span>""" + events.title(
    ) + """ events</li>
        <li><span style='background:#F97100;opacity:0.7;'></span>""" + hostelry.title(
    ) + """</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 %}"""

    macro = MacroElement()
    macro._template = Template(template)

    folium_object.get_root().add_child(macro)
    folium_object.save('../output/map_folium.html')  # save map as html
    return folium_object
Example #24
0
def add_map_legend(m: Map, title: str, items: tuple | Sequence[tuple]):
    """
    Adds a legend for a folium map.

    Parameters
    ----------
    m : Map
        Represents a folium map.
    title : str
        Represents the title of the legend
    items : list of tuple
        Represents the color and name of the legend items

    References
    ----------
    https://github.com/python-visualization/folium/issues/528#issuecomment-421445303

    Examples
    --------
    >>> import folium
    >>> from pymove.utils.visual import add_map_legend
    >>> df
              lat          lon              datetime  id
    0   39.984094   116.319236   2008-10-23 05:53:05   1
    1   39.984198   116.319322   2008-10-23 05:53:06   1
    2   39.984224   116.319402   2008-10-23 05:53:11   1
    3   39.984211   116.319389   2008-10-23 05:53:16   2
    4   39.984217   116.319422   2008-10-23 05:53:21   2
    >>> m = folium.Map(location=[df.lat.median(), df.lon.median()])
    >>> folium.PolyLine(mdf[['lat', 'lon']], color='red').add_to(m)
    >>> pm.visual.add_map_legend(m, 'Color by ID', [(1, 'red')])
    >>> m.get_root().to_dict()
    {
        "name": "Figure",
        "id": "1d32230cd6c54b19b35ceaa864e61168",
        "children": {
            "map_6f1abc8eacee41e8aa9d163e6bbb295f": {
                "name": "Map",
                "id": "6f1abc8eacee41e8aa9d163e6bbb295f",
                "children": {
                    "openstreetmap": {
                        "name": "TileLayer",
                        "id": "f58c3659fea348cb828775f223e1e6a4",
                        "children": {}
                    },
                    "poly_line_75023fd7df01475ea5e5606ddd7f4dd2": {
                        "name": "PolyLine",
                        "id": "75023fd7df01475ea5e5606ddd7f4dd2",
                        "children": {}
                    }
                }
            },
            "map_legend": {  # legend element
                "name": "MacroElement",
                "id": "72911b4418a94358ba8790aab93573d1",
                "children": {}
            }
        },
        "header": {
            "name": "Element",
            "id": "e46930fc4152431090b112424b5beb6a",
            "children": {
                "meta_http": {
                    "name": "Element",
                    "id": "868e20baf5744e82baf8f13a06849ecc",
                    "children": {}
                }
            }
        },
        "html": {
            "name": "Element",
            "id": "9c4da9e0aac349f594e2d23298bac171",
            "children": {}
        },
        "script": {
            "name": "Element",
            "id": "d092078607c04076bf58bd4593fa1684",
            "children": {}
        }
    }
    """
    item = "<li><span style='background:%s;'></span>%s</li>"
    list_items = '\n'.join([item % (c, n) for (n, c) in items])
    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">
      <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'> {} </div>
    <div class='legend-scale'>
      <ul class='legend-labels'>
        {}
      </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 %}}""".format(title, list_items)

    macro = MacroElement()
    macro._template = Template(template)

    m.get_root().add_child(macro, name='map_legend')
Example #25
0
    def add_legend(
        self,
        title="Legend",
        colors=None,
        labels=None,
        legend_dict=None,
        builtin_legend=None,
        opacity=1.0,
        **kwargs,
    ):
        """Adds a customized basemap to the map. Reference: https://bit.ly/3oV6vnH

        Args:
            title (str, optional): Title of the legend. Defaults to 'Legend'. Defaults to "Legend".
            colors ([type], optional): A list of legend colors. Defaults to None.
            labels ([type], optional): A list of legend labels. Defaults to None.
            legend_dict ([type], optional): A dictionary containing legend items as keys and color as values. If provided, legend_keys and legend_colors will be ignored. Defaults to None.
            builtin_legend ([type], optional): Name of the builtin legend to add to the map. Defaults to None.
            opacity (float, optional): The opacity of the legend. Defaults to 1.0.

        """

        import pkg_resources
        from branca.element import MacroElement, Template

        pkg_dir = os.path.dirname(
            pkg_resources.resource_filename("geemap", "geemap.py")
        )
        legend_template = os.path.join(pkg_dir, "data/template/legend.txt")

        if not os.path.exists(legend_template):
            raise FileNotFoundError("The legend template does not exist.")

        if labels is not None:
            if not isinstance(labels, list):
                raise ValueError("The legend labels must be a list.")
        else:
            labels = ["One", "Two", "Three", "Four", "etc"]

        if colors is not None:
            if not isinstance(colors, list):
                raise ValueError("The legend colors must be a list.")
            elif all(isinstance(item, tuple) for item in colors):
                try:
                    colors = ["#" + rgb_to_hex(x) for x in colors]
                except Exception as e:
                    raise Exception(e)
            elif all((item.startswith("#") and len(item) == 7) for item in colors):
                pass
            elif all((len(item) == 6) for item in colors):
                pass
            else:
                raise ValueError("The legend colors must be a list of tuples.")
        else:
            colors = ["#8DD3C7", "#FFFFB3", "#BEBADA", "#FB8072", "#80B1D3"]

        if len(labels) != len(colors):
            raise ValueError("The legend keys and values must be the same length.")

        allowed_builtin_legends = builtin_legends.keys()
        if builtin_legend is not None:
            if builtin_legend not in allowed_builtin_legends:
                raise ValueError(
                    "The builtin legend must be one of the following: {}".format(
                        ", ".join(allowed_builtin_legends)
                    )
                )
            else:
                legend_dict = builtin_legends[builtin_legend]
                labels = list(legend_dict.keys())
                colors = list(legend_dict.values())
                if all(isinstance(item, tuple) for item in colors):
                    try:
                        colors = [rgb_to_hex(x) for x in colors]
                    except Exception as e:
                        raise Exception(e)
                elif all(isinstance(item, str) for item in colors):
                    colors = ["#" + color for color in colors]

        if legend_dict is not None:
            if not isinstance(legend_dict, dict):
                raise ValueError("The legend dict must be a dictionary.")
            else:
                labels = list(legend_dict.keys())
                colors = list(legend_dict.values())

                if all(isinstance(item, tuple) for item in colors):
                    try:
                        colors = [rgb_to_hex(x) for x in colors]
                    except Exception as e:
                        raise Exception(e)
                elif all(isinstance(item, str) for item in colors):
                    colors = ["#" + color for color in colors]

        content = []

        with open(legend_template) as f:
            lines = f.readlines()
            for index, line in enumerate(lines):
                if index < 36:
                    content.append(line)
                elif index == 36:
                    line = lines[index].replace("Legend", title)
                    content.append(line)
                elif index < 39:
                    content.append(line)
                elif index == 39:
                    for i, color in enumerate(colors):
                        item = f"    <li><span style='background:{check_color(color)};opacity:{opacity};'></span>{labels[i]}</li>\n"
                        content.append(item)
                elif index > 41:
                    content.append(line)

        template = "".join(content)
        macro = MacroElement()
        macro._template = Template(template)

        self.get_root().add_child(macro)
Example #26
0
def template_macro(date):

    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:0px solid grey; background-color:rgba(255, 255, 255, 0.8);
         border-radius:6px; padding: 20px; font-size:32px; right: 20px; bottom: 20px;'>

    <div class='legend-title'>"""+date+\
    """</div>
    <div class='legend-scale'>
      <ul class='legend-labels'>
        <li><span style='background:blue;opacity:0.7;'></span> Verkehr</li>
        <li><span style='background:#E37222;opacity:0.7;'></span>Stickstoffdioxid NO2</li>
<li><span style='background:#808080;opacity:0.7;'></span>Regressionsmodell</li>

      </ul>
    </div>
    </div>

    </body>
    </html>

    <style type='text/css'>
      .maplegend .legend-title {
        text-align: left;
        margin-bottom: 10px;
        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: 12px;
        }
      .maplegend ul.legend-labels li span {
        display: block;
        float: left;
        height: 16px;
        width: 30px;
        margin-right: 5px;
        margin-left: 0;
        border: 0px solid #999;
        }
      .maplegend .legend-source {
        font-size: 80%;
        color: #777;
        clear: both;
        }
      .maplegend a {
        color: #777;
        }
    </style>
    {% endmacro %}"""

    macro = MacroElement()
    macro._template = Template(template)

    return macro
Example #27
0
def return_and_save_bike_station_map(df, station_location):
    """Function which returns a map of bike stations.

    Parameters
    ----------
    df : dataframe
        a dataframe which contains all data from the bikeshare rental company Capital Bike
    station_location : dataframe
        a dataframe which contains all Terminal IDs to bike rental stations from Capital Bike

    Returns
    -------
    map
        returns a folium html map with a draggable legend
    """
    if len(df["Start station number"].unique()) == len(
            df["End station number"].unique()):
        pass
    else:
        return False
    unique_stats = (pd.DataFrame({
        "Start station number": (df["Start station number"].unique())
    }).merge(pd.DataFrame({
        "NO_OF_BIKES":
        (df.groupby(["Start station number"]).count()["Bike number"])
    }),
             on="Start station number",
             how="left").rename(
                 columns={"Start station number": "TERMINAL_NUMBER"}))
    unique_stats["color"] = pd.cut(unique_stats['NO_OF_BIKES'],
                                   bins=3,
                                   labels=['green', 'orange', 'red'])
    cuts = pd.cut(unique_stats['NO_OF_BIKES'],
                  bins=3,
                  retbins=True,
                  labels=['green', 'orange', 'red'])
    station_loc_full = pd.merge(unique_stats,
                                station_location[[
                                    "TERMINAL_NUMBER", "LONGITUDE", "LATITUDE",
                                    "ADDRESS"
                                ]],
                                on="TERMINAL_NUMBER")
    m = folium.Map(location=[
        ((station_loc_full.LATITUDE.min() + station_loc_full.LATITUDE.max()) /
         2),
        ((station_loc_full.LONGITUDE.min() + station_loc_full.LONGITUDE.max())
         / 2)
    ],
                   zoom_start=12,
                   no_touch=True,
                   control_scale=True)

    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 of usage over two years</div>
    <div class='legend-scale'>
        <ul class='legend-labels'>
        <li><span style='background:red;opacity:0.7;'></span> High usage (""" + str(
        round(cuts[1][2])) + """ to """ + str(round(cuts[1][3])) + """)</li>
        <li><span style='background:orange;opacity:0.7;'></span>Medium usage (""" + str(
            round(cuts[1][1])) + """ to """ + str(round(
                cuts[1][2])) + """)</li>
        <li><span style='background:green;opacity:0.7;'></span>Small usage (0 to """ + str(
                    round(cuts[1][1])) + """)</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 %}"""

    macro = MacroElement()
    macro._template = Template(template)

    for i in range(0, len(station_loc_full) - 1):
        folium.Marker([
            station_loc_full["LATITUDE"][i], station_loc_full["LONGITUDE"][i]
        ],
                      icon=folium.Icon(color=station_loc_full["color"][i],
                                       icon="bicycle",
                                       prefix='fa')).add_to(m)

    m = m.get_root().add_child(macro)

    return m
def add_html(m):
    template = """
    {% macro html(this, kwargs) %}
    <!doctype html>
    <html lang="en">
    <body>
    <div id='maplegend' class='maplegend' 
        style='position: absolute; z-index:9999; border:0px solid grey;; background-color:rgba(255, 255, 255, 0.9);
        border-radius:6px; padding: 0px; left: 50px; top: 11px;'>
        
    <div class='home-button'><a href="https://my-heatmap.azurewebsites.net/" class="btn btn-outline-dark">Back to home</a></div>
    </div>

    <div id='maplegend' class='maplegend' 
        style='position: absolute; z-index:9999; border:1px solid grey; background-color:rgba(255, 255, 255, 0.8);
        border-radius:6px; padding: 10px; font-size:15px; right: 11px; top: 150px;'>
        
    <div class='legend-title'>Activity type</div>
    <div class='legend-scale'>
    <ul class='legend-labels'>
        <li><span style='background:#ff9933;opacity:0.7;'></span>Run</li>
        <li><span style='background:#f6ff00;opacity:0.7;'></span>Ice Skate</li>
        <li><span style='background:#00ff55;opacity:0.7;'></span>Canoe</li>
        <li><span style='background:#00ffff;opacity:0.7;'></span>Nordic Ski</li>
        <li><span style='background:#00ccff;opacity:0.7;'></span>Alpine Ski</li>
        <li><span style='background:#0066ff;opacity:0.7;'></span>Ride</li>
        <li><span style='background:#cc00ff;opacity:0.7;'></span>Other</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 %}"""

    macro = MacroElement()
    macro._template = Template(template)
    m.get_root().add_child(macro)

    return m
Example #29
0
def create_gdp_viz():
    '''
    Load and pre-process the geojson file
    '''
    geojson_path = os.path.normpath(
        os.path.join(script_dir_path, '..', 'data', 'borders_geo.json'))
    world_geojson = gpd.read_file(geojson_path)
    world_geojson.drop(columns=['ISO_A2', 'ADMIN'], inplace=True)
    world_geojson.drop(world_geojson[world_geojson['ISO_A3'] == '-99'].index,
                       inplace=True)
    country_list = world_geojson['ISO_A3'].tolist()
    '''
    Load and pre-process the GDP data
    '''
    # Load the GDP data
    df_GDP_path = os.path.normpath(
        os.path.join(script_dir_path, '..', 'data',
                     'GDP_per_capita_world_data.csv'))
    df_GDP = pd.read_csv(df_GDP_path, index_col='Country Code', skiprows=4)

    # Drop unnecessary data
    df_GDP.drop(labels='2020', axis=1, inplace=True)

    csv_country_list = df_GDP.index.tolist()
    country_list = list(set(country_list).intersection(csv_country_list))
    df_GDP.drop(df_GDP[~df_GDP.index.isin(country_list)].index, inplace=True)
    world_geojson.drop(
        world_geojson[~world_geojson['ISO_A3'].isin(country_list)].index,
        inplace=True)
    country_list.sort()

    # Create an enumerated country dict for id mapping
    country_dict = {k: v for v, k in enumerate(country_list)}
    world_geojson['country_id'] = world_geojson['ISO_A3'].map(country_dict)

    # Count min and max GDP values
    min_GDP_val, max_GDP_val = df_GDP[df_GDP.columns[4:]].min().min(), df_GDP[
        df_GDP.columns[4:]].max().max()

    # Create a color list
    color_list = [
        '#808080', '#A50026', '#D73027', '#F46D43', '#FDAE61', '#FEE08B',
        '#FFFFBF', '#D9EF8B', '#A6D96A', '#66BD63', '#1A9850', '#006837'
    ]

    # Create a list of geometrically spaced numbers over a min-max interval
    bins = np.geomspace(min_GDP_val, max_GDP_val, 12)

    # Replace NaNs (records with no data available) with '-1'
    df_GDP.fillna(-1, inplace=True)

    # Add NaN category to the bins
    bins = np.insert(bins, 0, -1.)
    bins = bins.tolist()

    # Append 'color_[year]' columns to the GDP DataFrame
    year = 1960
    while year <= 2019:
        pasted_col_id = df_GDP.columns.get_loc(str(year)) + 1
        col_value = pd.cut(df_GDP[str(year)],
                           bins,
                           include_lowest=True,
                           labels=[
                               '#808080', '#A50026', '#D73027', '#F46D43',
                               '#FDAE61', '#FEE08B', '#FFFFBF', '#D9EF8B',
                               '#A6D96A', '#66BD63', '#1A9850', '#006837'
                           ])
        df_GDP.insert(loc=pasted_col_id,
                      column='color_' + str(year),
                      value=col_value)
        year += 1

    print(df_GDP)
    '''
    Create appropriately formatted dictionary that the TimeSliderChoropleth will receive as an input
    '''
    gdp_dict = {}
    for country_code in df_GDP.index.tolist():
        country_id = str(country_dict[country_code])
        gdp_dict[country_id] = {}
        year = 1960
        while year <= 2019:
            dt_obj = datetime(year=year, month=12, day=31)
            year_in_ms = str(time.mktime(dt_obj.timetuple()))
            color_hex = df_GDP.at[country_code, 'color_' + str(year)]
            gdp_dict[country_id][year_in_ms] = {
                'color': color_hex,
                'opacity': 0.7
            }
            year += 1
    ''' 
    Initialize the map
    '''
    map_GDP = folium.Map(location=[0, 0],
                         zoom_start=4,
                         max_bounds=True,
                         min_zoom=3)
    '''
    Create the map content and add it to the map object
    '''
    # Create the choropleth
    choropleth = TimeSliderChoropleth(
        world_geojson.set_index('country_id').to_json(), styledict=gdp_dict)
    choropleth.add_to(map_GDP)

    # Create the map legend
    legend_labels_dict = {}
    i = 0
    for color in color_list:
        if i == 0:
            legend_labels_dict[color_list[i]] = 'No data'
        elif i == len(color_list) - 1:
            legend_labels_dict[color_list[i]] = '> ' + str(round(bins[i],
                                                                 2)) + '$'
            break
        else:
            legend_labels_dict[color] = str(round(
                bins[i], 2)) + '$' + ' - ' + str(round(bins[i + 1], 2)) + '$'
        i += 1

    template = utils.create_legend(caption='GDP per capita in USD',
                                   legend_labels=legend_labels_dict)
    macro = MacroElement()
    macro._template = Template(template)
    map_GDP.get_root().add_child(macro)
    '''
    Save completed map viz to an appropriate folder
    '''
    map_GDP.save(
        os.path.join(script_dir_path, '..', 'webapp', 'templates',
                     'GDP_viz.html'))
    print('Successfully created the GDP viz!')
Example #30
0
def create_sf_crime_viz():
    '''
    Load and pre-process the San Francisco crime data
    '''
    # Load the crime data
    df_crime = pd.read_csv(
        os.path.join(data_dir_path, 'last_week_SF_crimes.csv'))

    # Drop the rows in which there's no lat lon data
    df_crime = df_crime[df_crime['latitude'].notna()]
    df_crime = df_crime[df_crime['longitude'].notna()]

    # Create popups and their contents
    popups_list, locations_list = [], []
    for _, row in df_crime.iterrows():
        # Trim unnecessary information from the timestamp
        incident_timestamp = row['incident_datetime']
        incident_timestamp = incident_timestamp.replace('T', ' ')
        incident_timestamp = incident_timestamp[:-7]

        # Create a popup object and append it to the popups array
        popup_content = '<strong>Timestamp: </strong>' + incident_timestamp + '<br>' \
                        + '<strong>Day of the week: </strong>' + row['incident_day_of_week'] + '<br>' \
                        + '<strong>Description: </strong>' + row['incident_description']
        popups_list.append(folium.Popup(html=popup_content))

        # Get the lat, lon location data and add it to the list
        locations_list.append(row[['latitude',
                                   'longitude']].to_numpy().tolist())
    ''' 
    Initialize the map
    '''
    map_crime = folium.Map(location=[37.773972, -122.431297],
                           zoom_start=11,
                           max_bounds=True,
                           min_zoom=9,
                           max_lat=38.5,
                           max_lon=-122,
                           min_lat=37,
                           min_lon=-123)
    '''
    Create the map content and add it to the map object
    '''
    # Create marker cluster
    icon_list = []
    for _ in range(len(locations_list)):
        icon_list.append(
            folium.Icon(icon='exclamation', prefix='fa', color='orange'))

    marker_cluster = MarkerCluster(locations=locations_list,
                                   popups=popups_list,
                                   icons=icon_list)
    marker_cluster.add_to(map_crime)

    # Create map legend
    current_timestamp = datetime.now() - timedelta(days=1)
    week_before = current_timestamp - timedelta(weeks=1)
    current_timestamp = current_timestamp.strftime('%Y-%m-%d')
    week_before = week_before.strftime('%Y-%m-%d')

    template = utils.create_legend(caption='San Francisco crimes between ' +
                                   week_before + ' and ' + current_timestamp)
    macro = MacroElement()
    macro._template = Template(template)
    map_crime.get_root().add_child(macro)
    '''
    Save completed map viz to an appropriate folder
    '''
    map_crime.save(
        os.path.join(script_dir_path, '..', 'webapp', 'templates',
                     'SF_crime_viz.html'))
    print('Successfully created the San Francisco crime viz!')