Как создать интерактивную карту через Folium?
Визуализация данных – это то, что помогает нам легче понять и обработать большие или маленькие массивы «сухих» цифр.
В этой статье я расскажу о своем опыте работы с одним из инструментов визуализации в форме интерактивной карты на Jupyter Notebook — Folium. Folium позволяет объединить экосистему языка программирования Python и Open Source библиотеку для построения интерактивных карт для сайтов Leaflet.js.
Цель создания интерактивной карты в моем случае – показать наглядно филиалы банка, в которых предоставляется услуга регистрации в Единой биометрической системе для клиентов физических лиц по данным официального сайта банка и bio.rt.ru, а также долю таких филиалов по регионам российской Федерации.
Для работы с Folium импортируем библиотеку:
И создаем главный объект, к которому будем добавлять остальные – карту:
Здесь location – координаты центра отображаемой карты, zoom_start – первоначальный масштаб.
Добавим к карте регионы РФ с заполнением цветом в соответствии с долей филиалов банка с услугой регистрации – хороплет. Для отображения контуров регионов необходим файл в формате GeoJSON, и его можно взять здесь из архива – это admin_level_4.geojson. Данные для заполнения цветом возьмем из предварительно подготовленного датафрейма DF с долями share и region_ID регионов, совпадающими с ID регионов из файла GeoJSON.
Добавляем слой хороплета к карте:
Теперь можно увидеть общую картину по доступности услуги регистрации в ЕБС в филиалах банка по регионам РФ.
Добавим на карту отдельные филиалы банка с разделением по доступности услуги регистрации – маркеры двух цветов. Данные с официального сайта банка и bio.rt.ru, включая координаты филиалов, собираем через request, выделяем из них координаты и наименования филиалов.
Чтобы карта была функциональной и удобной, маркеры филиалов мы объединим в кластеры в зависимости от масштаба, что избавит нас от загромождения элементами.
Создадим группы для маркеров:
Подготовим кластеры:
Параметр popups покажет соответствующую информацию при клике на кружок кластера. С помощью icon_create_function можно добавить строку на JavaScript, которой можно задать нужный цвет кластера (по умолчанию он меняется каждый раз в зависимости от количества маркеров в кластере).
Добавляем маркеры филиалов в соответствующие кластеры:
Добавляем кластеры в слой соответствующей группы:
Группы добавляем на карту:
Важно наличие на карте элемента по контролю слоев, с помощью которого можно включить/выключить показ элементов. Ранее в параметрах хороплета, маркеров и кластеров параметр show указан со значением False – при загрузке на карте слои не показаны.
Результат можно выгрузить в отдельный HTML файл и просматривать в любом браузере, при условии доступности ресурса www.openstreetmap.org:
В итоге, можно оценить распространённость услуги как по регионам, так и отдельным населенным пунктам.
Связка Jupyter Notebook и Folium предоставляет максимально гибкий инструмент по визуализации данных, имеющих картографическую привязку.
Не очень понятен тайный смысл этого действа. Leaflet - клиентская js библиотека, которой от сервера, собственно, ничего не надо. В любом случае уже на клиенте идут вызовы в нее с командами "нарисуй клизму в такой-то координате". Этот самый Folium выглядит как непонятный посредник с непонятными возможностями по кастомизации. В общем, как по мне странное решение, в оправдание которому могу придумать разве что полное нежелание использовать js код.
Согласны, что можно было реализовывать и через js минуя "костыль" в виде Folium, но дело все в автоматизации и быстроте реализации. В описанной ситуации Folium-Leaflet использовались на последнем этапе - визуализации, на предыдущих этапах - только Python с многими другими модулями. В рамках описанной задачи посчитали более подходящим использование возможностей Python в части генерации js-кода.