Рассмотрим три библиотеки по работе с геоданными: gmaps, ipyleaflet и более продвинутую по сравнению с предыдущими – folium. Забегая вперед, скажем, что лучше использовать folium, так как в ней удобнее строить интерактивные карты и работать со слоями. В конце статьи вы найдете ссылки на блокноты с кодом.
Установка Jupyter
Установим блокноты Jupyter следующей командой:
Запустим блокноты Jupyter:
Автоматически откроется страница по адресу http://localhost:8888/tree. Затем создадим новый блокнот, кликнув по кнопке New .
1. Библиотека gmaps
Начнем с простого – библиотеки gmaps. Для работы с ней нужен API-ключ. Как его получить читайте на сайте Google Maps Platform.
Помимо gmaps нам понадобятся инструменты интерактивного управления ipywidgets , widgetsnbextension и библиотека для обработки и анализа данных pandas . Они устанавливаются как через консоль ( pip install ), так и прямо из блокнота через восклицательный знак ( !pip install ):
Активируем виджеты следующими командами:
1.1. Карта точек WiFi
Рис. 1. Карта с маркерами точек WiFi (gmaps)
За основу возьмем датасет, размещенный на портале открытых данных Москвы, в котором содержится информация о 2.8 тыс. бесплатных точек Wi-Fi. На каждой 1001-й строчке датасета дублируются названия столбцов. Во избежание ошибок при обработке набора данных, удалим эти строчки из таблицы. Очищенный массив доступен в репозитории на Гитхабе.
Какую информацию возьмем из датасета? Нам нужны координаты ( Latitude_WGS84 , Longitude_WGS84 ), адрес ( Location ) и количество точек доступа ( NumberOfAccessPoints ).
Cоздадим список wifi_points , состоящий из словарей, в каждом из которых хранится вышеперечисленная информация о каждой точке. Затем создадим отдельный список marker_coordinates с координатами и переведем элементы списка из типа строка str в тип вещественное число float , потому что координаты – это число, а не строчка.
sep – разделитель между столбцами.
encoding – кодировка файла.
info_box_template – формирует HTML-форму с описанием точки Wi-Fi.
<dl> – создает контейнер.
<dt> – заголовок.
<dd> – описание.
marker_info – список, содержащий форматированные строчки с описанием точек Wi-Fi: адрес точки ( Location ) и количество работающих точек Wi-Fi ( NumberOfAccessPoints ).
marker_layer – создает слой маркеров с соответствующими координатами.
fig=gmaps.figure() – инициирует создание карты.
fig.add_layer(marker_layer ) – добавляет слой с маркерами на карту.
fig – запускает карту.
2. Библиотека ipyleaflet
ipyleaflet – интерактивная библиотека виджетов, основанная ipywidgets. Библиотека использует карты OpenStreetMap.
Установим библиотеки pandas, ipyleaflet и ipywidgets:
2.1. Карта точек WiFi
Рис. 2. Карта с маркерами точек WiFi (ipyleaflet)
Создадим карту с точками Wi-Fi, но уже с помощью библиотеки ipyleaflet. Воспользуемся датасетом из раздела про gmaps:
markers – список из координат маркеров.
locations_info – список из адресов и количества точек Wi-Fi.
for i in range(len(markers)) – каждый из элементов на карте представляет из себя слой, поэтому напишем цикл создающий нужное количество слоев. Один слой – один маркер.
m – отрисовывает карту с маркерами.
2.2. Маршрут марафона
Рис. 3. Маршрут 5 км московского марафона (ipyleaflet)
Построим маршрут 5 км московского марафона: импортируем из библиотеки ipyleaflet модуль «Муравьиный путь» AntPath и добавим маркеры Старт и Финиш! .
marathon_path – координаты марафона.
start_marker и finish_marker – координаты маркеров Старт и Финиш! соответственно.
start.value и finish.value – описания маркеров старта и финиша, которые появятся во всплывающем окне при клике на маркер.
zoom_slider – ползунок масштаба.
color – цвет линии.
pulse_color – цвет бегущих муравьев.
2.3. Маршрут марафона с иконками AwesomeIcon
Рис. 4. Маршрут марафона с иконками AwesomeIcon (ipyleaflet)
Заменим стандартные иконки маркеров на иконки из каталога AwesomeIcon:
start_icon и finish_icon – содержат элементы из библиотеки AwesomeIcon.
marker_color – цвет маркера.
icon_color – цвет иконки.
2.4. Маршрут марафона с собственными иконками
Рис. 5. Маршрут марафона с собственными иконками (ipyleaflet)
Добавим собственные иконки с помощью модуля Icon :
Импортируем из библиотеки ipyleaflet модуль Icon , чтобы использовать собственные иконки.
icon_url – ссылка на иконку.
icon_size=[x, y] – задает размеры иконки: x – длина, y – высота.
2.5. Карта 85 субъектов РФ
Рис. 6. Карта 85 субъектов РФ (ipyleaflet)
Создадим карту с 85 субъектами РФ. Координаты границ субъектов возьмем из json-файла. Данные актуальны на 2015 год и в них есть дефект с Чукотским Автономным округом, но для нашей задачи – демонстрации возможностей библиотеки – этого вполне достаточно. Очищенная версия лежит в репозитории.
load_data – функция, которая записывает файл с данным в локальное хранилище.
random_color – функция, генерирующая случайные цвета для субъектов РФ.
style и hover_style – задают графическое отображение субъекта по умолчанию и при наведении на него курсора мыши.
2.6. Интерактивная карта РФ (по клику)
Рис. 7. Интерактивная карта 85 субъектов РФ (ipyleaflet)
Сделаем карту интерактивной: при клике на субъект под картой появится название центрального города субъекта:
handle_click – функция, которая принимает именованные аргументы.
[‘name’] – имя субъекта.
geo_json.on_click(handle_click) – подключает к карте событие (вывод на экран) при клике на субъект.
2.7. Больше интерактива
Рис. 8. Интерактивная карта 85 субъектов РФ (ipyleaflet)
Теперь, с помощью функции handle_hover сделаем так, чтобы название центрального города субъекта появлялось при наведении курсора мыши на субъект:
handle_hover – функция, принимающая именованные аргументы.
geo_json.on_click(handle_hover) – подключает к карте событие при наведении на субъект.
2.8. Хороплет-карта США по COVID-19
Рис. 9. Хороплет-карта карта США по COVID-19 (ipyleaflet)
Построим хороплет-карту (фоновая картограмма) штатов США по COVID-19. На хороплет-карте цветом с различной степенью насыщенности отображается интенсивность какого-либо показателя. Данные по заболеваемости возьмем из репозитория университета Джона Хопкинса, а координаты границ штатов с сайта библиотеки ipyleaflet . Слегка изменим csv-файл, добавив в него второй столбец State с почтовыми сокращениями штатов США (Alabama – AL и так далее), чтобы была связь со вторым ключом ( id ) для каждого штата из json-файла. Также удалим несколько штатов из csv-файла, границы которых отсутствуют в json-файле.
geo_json_data – загрузка json-файла с координатами границ штатов.
сonfirmed – загрузка csv-файла с данными по заболеваемости.
confirmed=dict. – создает словарь с ключем Почтовое название штата и значением Количество подтвержденных случаев заражения .
geo_data – координаты границ штатов.
choro_data – хороплет-данные, количество заболевших в каждом штате.
colormap – цвет из палитры ColorBrewer.
3. Библиотека folium
Теперь воспользуемся библиотекой folium, которая также работает на картах OpenStreetMap, но обладает большими возможностями по сравнению с ipyleaflet.
3.1. Установка folium
Установим folium следующей командой:
3.2. Два слоя на одной карте
Рис. 10. Хороплет-карта США по COVID-19 (folium). Два слоя на одной карте.
Построим карту по COVID-19 в США с двумя слоями: количество заболевших в каждом штате и летальность.
folium.Choropleth – импорт модуля для построения карты.
columns – столбцы, которые используются для построения карты.
key – ключ, используемый для построения карты. По умолчанию id .
name – название карты.
fill_color – цвет из палитры ColorBrewer. Если данных в столбце нет ( NaN ), то цвет будет серый.
legend_name – описание под шкалой.
show – определяет, показывать ли слой при загрузке карты. По умолчанию значение True .
Рис. 11. Хороплет-карта США по COVID-19 (folium). Два слоя на одной карте.
3.3. Добавляем интерактив: всплывающий текст
Рис. 12. Интерактивная хороплет-карта США по COVID-19 (folium)
Сделаем так, чтобы при наведении курсора мыши на штат всплывало название штата:
covid_map.geojson.add_child. – добавляет всплывающее окошко с названием штата.
3.4. Две карты в одном окне
Рис. 13. Две карты в одном окне (folium).
Создадим две карты в одном окне с помощью плагина DualMap . Для этого добавим к основной карте m дочерние карты m1 и m2 через запись m.m1 и m.m2 соответственно:
folium.TileLayer(” “) – добавляет на карту картографический слой. В нашем случае: openstreetmap, Stamen Terrain и cartodbpositron.
m.m1 и m.m2 – создает две карты: первая карта (слева) и вторая карта (справа).
.add_to(m) , .add_to(m.m1) , .add_to(m.m2) – добавляют маркеры на обе карты, только на первую карту и только на вторую соответственно.
3.5. Группируем маркеры
Рис. 14. Группируем маркеры в (folium)
Создадим группы маркеров с возможностью включения и отключения их видимости:
plugins.FeatureGroupSubGroup(figure, “name”) – создает группы маркеров с именем name .
m.add_child(group1) – добавляет группы маркеров на карту.
folium.Marker([59.93863, 30.31413]).add_to(group1) – добавляет маркер в группу.
Мы проделали большую работу и познакомились с тремя географическими библиотеками: gmaps, ipyleaflet и folium. С их помощью научились: