Как добавить условное обозначение размера «Круг» в Folium map (на python) и как аннотировать текст, чтобы он был виден во всех случаях?

#python #pandas #maps #folium

#python #pandas #Карты #folium

Вопрос:

Ниже найдите мой фрагмент кода. У меня есть карта Европы и некоторые города, которые я хочу отметить, и их численность населения. Я хочу пометить эти города «Кругом», а размер должен соответствовать масштабируемому «населению».

  1. Я пытаюсь добавить легенду о размере круга на эту карту, но я не смог найти способ это сделать. С круговым слоем нет возможности добавить легенду.

  2. Я также пытаюсь аннотировать названия городов на карте с помощью DivIcon, и это работает, но некоторые города расположены слишком близко друг к другу, поэтому я бы предпочел, чтобы я мог переместить названия этих городов дальше от соответствующей точки и соединить их линией.

Просто к сведению, здесь я показываю только некоторые города Великобритании, но в целом у меня есть карта всей Европы и много городов, поэтому названия этих городов в Великобритании действительно не видны.

У кого-нибудь есть идея, как это сделать? Поддержка Folium в Интернете не столь обширна, поэтому я не смог найти ничего подобного.

 import pandas as pd
import numpy as np
import folium
import json
import geopandas as gpd
# Pretty display for notebooks
%matplotlib inline

data = [['Birmingham', 1141374, 52.4796992, -1.9026911],
          ['Bradford', 537173, 53.7944229, -1.7519186],
          ['Bristol', 463405, 51.4538022, -2.5972985],
          ['Edinburgh', 518500, 55.9533456, -3.1883749],
          ['Glasgow', 626410, 55.8609825, -4.2488787],
          ['Leeds', 789194, 53.7974185, -1.5437941],
          ['Liverpool', 494814, 53.407154, -2.991665]]
cities = pd.DataFrame(data, columns = ['City', 'Population', 'Latitude', 'Longitude'])

europe = #geojson file of Europe dowloaded from https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units/countries

import folium.plugins
from folium.features import *

# adding the DivIcon element for the text annotation
class DivIcon(MacroElement):
    def __init__(self, html='', size=(30,30), anchor=(0,0), style=''):
        """TODO : docstring here"""
        super(DivIcon, self).__init__()
        self._name = 'DivIcon'
        self.size = size
        self.anchor = anchor
        self.html = html
        self.style = style

        self._template = Template(u"""
            {% macro header(this, kwargs) %}
              <style>
                .{{this.get_name()}} {
                    {{this.style}}
                    }
              </style>
            {% endmacro %}
            {% macro script(this, kwargs) %}
                var {{this.get_name()}} = L.divIcon({
                    className: '{{this.get_name()}}',
                    iconSize: [{{ this.size[0] }},{{ this.size[1] }}],
                    iconAnchor: [{{ this.anchor[0] }},{{ this.anchor[1] }}],
                    html : "{{this.html}}",
                    });
                {{this._parent.get_name()}}.setIcon({{this.get_name()}});
            {% endmacro %}
            """)

# creating the map
map = folium.Map(location=[53.7974185, -1.5437941], zoom_start=4, tiles=None)
style1 = {'fillColor': '#4682b4', 'fill': True, 'weight': 1, 'opacity': 0.3, 'fillOpacity': 1}
style2 = {'color': 'black', 'weight': -1, 'opacity': 0.2}

folium.GeoJson(
    europe,
    name='Europe',
    overlay=False,
    control= False,
    style_function = lambda x: style2).add_to(map)
        
# Adding a circle for each selected city
for idx, city in cities.iterrows():
    folium.Circle(location=(city['Latitude'], city['Longitude']),
                  popup=city['City'],
                  radius=city['Population']/10000,
                  fillColor= 'red',
                  color= 'red', 
                  fill= True,
                  fillOpacity= 0,
                  opacity= 1,
                  weight= 2
                 ).add_to(map)
    folium.Marker(location=(city['Latitude'], city['Longitude']),
                  icon=DivIcon(
                     size=(75,25),
                     anchor=(50,-3),
                     html=city.City,
                     style='font-size:13px; color:black; text-align: center')).add_to(map)

map