#python #pandas #maps #folium
#python #pandas #Карты #folium
Вопрос:
Ниже найдите мой фрагмент кода. У меня есть карта Европы и некоторые города, которые я хочу отметить, и их численность населения. Я хочу пометить эти города «Кругом», а размер должен соответствовать масштабируемому «населению».
-
Я пытаюсь добавить легенду о размере круга на эту карту, но я не смог найти способ это сделать. С круговым слоем нет возможности добавить легенду.
-
Я также пытаюсь аннотировать названия городов на карте с помощью 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