Работа с геоданными в Python и Jupyter

Работа с геоданными в Python и Jupyter

Рассмотрим три библиотеки по работе с геоданными: 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)Рис. 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)Рис. 2. Карта с маркерами точек WiFi (ipyleaflet)

Создадим карту с точками Wi-Fi, но уже с помощью библиотеки ipyleaflet. Воспользуемся датасетом из раздела про gmaps:

markers – список из координат маркеров.

locations_info – список из адресов и количества точек Wi-Fi.

for i in range(len(markers)) – каждый из элементов на карте представляет из себя слой, поэтому напишем цикл создающий нужное количество слоев. Один слой – один маркер.

m – отрисовывает карту с маркерами.

2.2. Маршрут марафона

Рис. 3. Маршрут 5 км московского марафона (ipyleaflet)Рис. 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)Рис. 4. Маршрут марафона с иконками AwesomeIcon (ipyleaflet)

Заменим стандартные иконки маркеров на иконки из каталога AwesomeIcon:

start_icon и finish_icon – содержат элементы из библиотеки AwesomeIcon.

marker_color – цвет маркера.

icon_color – цвет иконки.

2.4. Маршрут марафона с собственными иконками

Рис. 5. Маршрут марафона с собственными иконками (ipyleaflet)Рис. 5. Маршрут марафона с собственными иконками (ipyleaflet)

Добавим собственные иконки с помощью модуля Icon :

Импортируем из библиотеки ipyleaflet модуль Icon , чтобы использовать собственные иконки.

icon_url – ссылка на иконку.

icon_size=[x, y] – задает размеры иконки: x – длина, y – высота.

2.5. Карта 85 субъектов РФ

Рис. 6. Карта 85 субъектов РФ (ipyleaflet)Рис. 6. Карта 85 субъектов РФ (ipyleaflet)

Создадим карту с 85 субъектами РФ. Координаты границ субъектов возьмем из json-файла. Данные актуальны на 2015 год и в них есть дефект с Чукотским Автономным округом, но для нашей задачи – демонстрации возможностей библиотеки – этого вполне достаточно. Очищенная версия лежит в репозитории.

load_data – функция, которая записывает файл с данным в локальное хранилище.

random_color – функция, генерирующая случайные цвета для субъектов РФ.

style и hover_style – задают графическое отображение субъекта по умолчанию и при наведении на него курсора мыши.

2.6. Интерактивная карта РФ (по клику)

Рис. 7. Интерактивная карта 85 субъектов РФ (ipyleaflet)Рис. 7. Интерактивная карта 85 субъектов РФ (ipyleaflet)

Сделаем карту интерактивной: при клике на субъект под картой появится название центрального города субъекта:

handle_click – функция, которая принимает именованные аргументы.

[‘name’] – имя субъекта.

geo_json.on_click(handle_click) – подключает к карте событие (вывод на экран) при клике на субъект.

2.7. Больше интерактива

Рис. 8. Интерактивная карта 85 субъектов РФ (ipyleaflet)Рис. 8. Интерактивная карта 85 субъектов РФ (ipyleaflet)

Теперь, с помощью функции handle_hover сделаем так, чтобы название центрального города субъекта появлялось при наведении курсора мыши на субъект:

handle_hover – функция, принимающая именованные аргументы.

geo_json.on_click(handle_hover) – подключает к карте событие при наведении на субъект.

2.8. Хороплет-карта США по COVID-19

Рис. 9. Хороплет-карта карта США по COVID-19 (ipyleaflet)Рис. 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). Два слоя на одной карте.Рис. 10. Хороплет-карта США по COVID-19 (folium). Два слоя на одной карте.

Построим карту по COVID-19 в США с двумя слоями: количество заболевших в каждом штате и летальность.

folium.Choropleth – импорт модуля для построения карты.

columns – столбцы, которые используются для построения карты.

key – ключ, используемый для построения карты. По умолчанию id .

name – название карты.

fill_color – цвет из палитры ColorBrewer. Если данных в столбце нет ( NaN ), то цвет будет серый.

legend_name – описание под шкалой.

show – определяет, показывать ли слой при загрузке карты. По умолчанию значение True .

Рис. 11. Хороплет-карта США по COVID-19 (folium). Два слоя на одной карте.Рис. 11. Хороплет-карта США по COVID-19 (folium). Два слоя на одной карте.

3.3. Добавляем интерактив: всплывающий текст

Рис. 12. Интерактивная хороплет-карта США по COVID-19 (folium)Рис. 12. Интерактивная хороплет-карта США по COVID-19 (folium)

Сделаем так, чтобы при наведении курсора мыши на штат всплывало название штата:

covid_map.geojson.add_child. – добавляет всплывающее окошко с названием штата.

3.4. Две карты в одном окне

Рис. 13. Две карты в одном окне (folium).Рис. 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)Рис. 14. Группируем маркеры в (folium)

Создадим группы маркеров с возможностью включения и отключения их видимости:

plugins.FeatureGroupSubGroup(figure, “name”) – создает группы маркеров с именем name .

m.add_child(group1) – добавляет группы маркеров на карту.

folium.Marker([59.93863, 30.31413]).add_to(group1) – добавляет маркер в группу.

Мы проделали большую работу и познакомились с тремя географическими библиотеками: gmaps, ipyleaflet и folium. С их помощью научились: