Как создать интерактивную карту через Folium?

Визуализация данных – это то, что помогает нам легче понять и обработать большие или маленькие массивы «сухих» цифр.

В этой статье я расскажу о своем опыте работы с одним из инструментов визуализации в форме интерактивной карты на Jupyter Notebook — Folium. Folium позволяет объединить экосистему языка программирования Python и Open Source библиотеку для построения интерактивных карт для сайтов Leaflet.js.

Цель создания интерактивной карты в моем случае – показать наглядно филиалы банка, в которых предоставляется услуга регистрации в Единой биометрической системе для клиентов физических лиц по данным официального сайта банка и bio.rt.ru, а также долю таких филиалов по регионам российской Федерации.

Для работы с Folium импортируем библиотеку:

import folium

И создаем главный объект, к которому будем добавлять остальные – карту:

m = folium.Map(location=[63.391522, 96.328125], zoom_start=3)

Здесь location – координаты центра отображаемой карты, zoom_start – первоначальный масштаб.

Добавим к карте регионы РФ с заполнением цветом в соответствии с долей филиалов банка с услугой регистрации – хороплет. Для отображения контуров регионов необходим файл в формате GeoJSON, и его можно взять здесь из архива – это admin_level_4.geojson. Данные для заполнения цветом возьмем из предварительно подготовленного датафрейма DF с долями share и region_ID регионов, совпадающими с ID регионов из файла GeoJSON.

rel_ = folium.Choropleth( geo_data = path_to_ GeoJSON_file, name = 'Отношение числа филиалов с ЕБС ко всем', data = DF, columns=['REGION_ID', 'share'], key_on='id', bins = 5, fill_color='BuGn', nan_fill_color='darkblue', nan_fill_opacity=0.5, fill_opacity=0.7, line_opacity=0.2, legend_name= 'Отношение числа филиалов с ЕБС ко всем', highlight = True, show = False )

Добавляем слой хороплета к карте:

rel_.add_to(m)

Теперь можно увидеть общую картину по доступности услуги регистрации в ЕБС в филиалах банка по регионам РФ.

Добавим на карту отдельные филиалы банка с разделением по доступности услуги регистрации – маркеры двух цветов. Данные с официального сайта банка и bio.rt.ru, включая координаты филиалов, собираем через request, выделяем из них координаты и наименования филиалов.

Чтобы карта была функциональной и удобной, маркеры филиалов мы объединим в кластеры в зависимости от масштаба, что избавит нас от загромождения элементами.

Создадим группы для маркеров:

feature_group_EBS = folium.FeatureGroup(name = 'Филиалы с регистрацией ЕБС', show = False) feature_group_nonEBS = folium.FeatureGroup(name = 'Филиалы без регистрации ЕБС', show = False)

Подготовим кластеры:

from folium.plugins import MarkerCluster marker_cluster_EBS = MarkerCluster(name = ' cluster_ EBS ', popups = 'Филиалы с регистрацией ЕБС ', show = False, icon_create_function=icon_green) marker_cluster_nonEBS = MarkerCluster(name = ' cluster_nonEBS ', popups = 'Филиалы без регистрации ЕБС ', show = False, icon_create_function = icon_red)

Параметр popups покажет соответствующую информацию при клике на кружок кластера. С помощью icon_create_function можно добавить строку на JavaScript, которой можно задать нужный цвет кластера (по умолчанию он меняется каждый раз в зависимости от количества маркеров в кластере).

Добавляем маркеры филиалов в соответствующие кластеры:

for lt, ln, filial_name in zip(latitude_EBS, longitude_EBS, name_EBS): marker_EBS = folium.Marker( [lt, ln], popup = filial_name, icon = folium.Icon(color='green',icon='ok-sign')) marker_cluster_EBS.add_child(marker_EBS)

Добавляем кластеры в слой соответствующей группы:

feature_group_EBS.add_child(marker_EBS) feature_group_nonEBS.add_child(marker_nonEBS)

Группы добавляем на карту:

feature_group_EBS.add_to(m) feature_group_nonEBS.add_to(m)

Важно наличие на карте элемента по контролю слоев, с помощью которого можно включить/выключить показ элементов. Ранее в параметрах хороплета, маркеров и кластеров параметр show указан со значением False – при загрузке на карте слои не показаны.

folium.LayerControl(collapsed=True).add_to(m)

Результат можно выгрузить в отдельный HTML файл и просматривать в любом браузере, при условии доступности ресурса www.openstreetmap.org:

m.save('map.html')

В итоге, можно оценить распространённость услуги как по регионам, так и отдельным населенным пунктам.

Связка Jupyter Notebook и Folium предоставляет максимально гибкий инструмент по визуализации данных, имеющих картографическую привязку.

0
2 комментария
Максим Ефимов

Не очень понятен тайный смысл этого действа. Leaflet - клиентская js библиотека, которой от сервера, собственно, ничего не надо. В любом случае уже на клиенте идут вызовы в нее с командами "нарисуй клизму в такой-то координате". Этот самый Folium выглядит как непонятный посредник с непонятными возможностями по кастомизации. В общем, как по мне странное решение, в оправдание которому могу придумать разве что полное нежелание использовать js код.

Ответить
Развернуть ветку
NTA
Автор

Согласны, что можно было реализовывать и через js минуя "костыль" в виде Folium, но дело все в автоматизации и быстроте реализации. В описанной ситуации Folium-Leaflet использовались на последнем этапе - визуализации, на предыдущих этапах - только Python с многими другими модулями. В рамках описанной задачи посчитали более подходящим использование возможностей Python в части генерации js-кода.

Ответить
Развернуть ветку
-1 комментариев
Раскрывать всегда