Начало работы с анализом географических данных в Python с использованием OSMnx и Kepler.gl

Введение

Геопространственные данные распространены повсеместно и используются во многих различных приложениях во всех компаниях (например, для расчета риска собственности в зависимости от ее местоположения, разработки новой архитектуры, планирования отгрузки товаров и поиска возможных маршрутов между различными местоположениями).

Геопространственные данные обычно хранятся в двух возможных форматах: Растр и Вектор.

  • Растры представляют данные в виде матрицы пикселей (поэтому имеют фиксированное разрешение). В этом представлении каждому пикселю может быть присвоено другое значение, и можно использовать несколько сеток, сложенных вместе, чтобы еще больше увеличить одно и то же изображение. Например, одно и то же изображение может быть сохранено с использованием 3 каналов/диапазонов (например, RGB — красный, зеленый, синий) или с одним каналом.
  • Векторы можно использовать для абстрагирования геометрии реального мира с помощью таких элементов, как точки, линии, многоугольники и т. д., и их обычно можно хранить вместе с некоторыми полезными метаданными об объектах, которые они представляют (например, имя, адрес, владелец, и т. д…). Поскольку они хранятся в виде математических объектов, можно увеличивать масштаб векторов без ущерба для разрешения.

Векторные данные обычно хранятся в файловых форматах, таких как SVG и Shapefiles, а растровые данные — в TIFF, JPG, PNG и т. д.

При работе с геопространственными данными обычно требуется множество различных форм операций/преобразований, некоторые примеры:

  • Преобразование из нетабличных/необработанных двоичных форматов в векторные/растровые.
  • Разделение непрерывных данных на дискретные категории.
  • Извлечение полигонов/объектов из данных.
  • Обработка без данных и выбросов.
  • Перепроецирование в разных системах координат.
  • Создание обзоров данных с более низким разрешением для обработки различных уровней масштабирования и без перегрузки рендеринга изображений.

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

Демонстрация

В рамках этой статьи мы рассмотрим практическую демонстрацию того, как анализировать геопространственные векторные данные для определения конкретного местоположения и расчета кратчайшего пути к нему. Весь код, использованный в этой статье (и не только!) доступен на моем GitHub и учетных записях Kaggle.

Прежде всего, нам нужно убедиться, что в нашей среде установлены все необходимые зависимости.

pip install osmnx
pip install folium
pip install keplergl

В этом примере мы собираемся исследовать район Альтштадт в Цюрихе (Швейцария). Использование OSMnx может быть таким же простым, как использование двух строк кода для извлечения и визуализации необходимых данных (рис. 1). На самом деле OSMnx был разработан для получения и использования данных OpenStreetMap самым простым способом. OpenStreetMap — это бесплатная всемирная географическая база данных, поддерживаемая сообществом добровольцев.

import osmnx as ox
import networkx as nx
import matplotlib.pyplot as plt
import folium
from keplergl import KeplerGl

place_name = "Altstadt, Zurich, Switzerland"

graph = ox.graph_from_place(place_name)

ox.plot_graph_folium(graph)

Теперь мы готовы изучить различные способы извлечения наших данных. Прежде всего, мы можем получить полигон области, которую мы представляем, в качестве основы для нашего исследования. После извлечения данных они представляются во фрейме данных Geo Pandas, содержащем всю интересующую информацию об области (рис. 2). Geo Pandas — это библиотека с открытым исходным кодом, специально разработанная для расширения возможностей Pandas по обработке геопространственных данных.

Для создания любого визуального представления столбец геометрия используется в качестве точки отсчета, в каждой строке этого столбца фактически представлены все координаты, необходимые для создания объект на карте (например, полигон, линия, точка, мультиполигон). В этом примере в качестве языка разметки текста для представления наших объектов векторной геометрии используется Общеизвестный текст (WKT), но обычно можно использовать и другие форматы, такие как GeoJSON. Кроме того, каждое из этих значений в GeoSeries хранится в Shapely Object, чтобы максимально упростить выполнение операций и преобразований над ним.

area = ox.geocode_to_gdf(place_name)
area.head()

На этом этапе мы можем просто повторить ту же процедуру, чтобы получить различные точки интереса, которые мы хотим нанести на нашу карту. В этом случае давайте представим, что мы находимся в Альтштадте, Цюрих, на отдыхе, и мы хотим изучить все варианты, которые у нас есть, чтобы пойти в ресторан. Чтобы упростить наше исследование, мы можем затем получить все узлы и ребра, которые представляют улицы в районах, а также все доступные здания и рестораны, чтобы мы могли ориентироваться на карте.

buildings = ox.geometries_from_place(place_name, tags={'building':True})
restaurants = ox.geometries_from_place(place_name, 
                                       tags={"amenity": "restaurant"})
nodes, edges = ox.graph_to_gdfs(graph)

После того, как мы загрузили все данные, мы можем построить график каждой характеристики независимо (рис. 3).

Используя приведенный ниже код, это можно, наконец, хорошо обобщить на одном графике, показанном ниже (рис. 4).

fig, ax = plt.subplots(figsize=(10, 14))
area.plot(ax=ax, facecolor='white')
edges.plot(ax=ax, linewidth=1, edgecolor='blue')
buildings.plot(ax=ax, facecolor='yellow', alpha=0.7)
restaurants.plot(ax=ax, color='red', alpha=0.9, markersize=12)
plt.tight_layout()

Чтобы сделать наш анализ более интерактивным, мы могли бы также использовать дополнительные библиотеки, такие как KeplerGL. KeplerGL — это набор геопространственных инструментов с открытым исходным кодом, разработанный Uber для создания высокопроизводительных веб-приложений для геопространственных данных.

Используя KeplerGL, мы можем очень легко наложить нашу карту на реальную карту мира и применить к ней различные преобразования и фильтрацию на лету (рис. 5).

K_map = KeplerGl()
K_map.add_data(data=restaurants, name='Restaurants')
K_map.add_data(data=buildings, name='Buildings')
K_map.add_data(data=edges, name='Edges')
K_map.add_data(data=area, name='Area')
K_map.save_to_html()

Теперь, когда мы построили нашу карту и у нас есть интерактивный инструмент для изучения этих данных, мы можем, наконец, попытаться сузить наше исследование до одного ресторана. В этом случае мы сначала ограничиваем наше внимание только итальянскими ресторанами, а затем выбираем Antica Roma в качестве места выбора.

Теперь нам просто нужно указать координаты нашего начального положения и место назначения, чтобы начать поиск наилучшего пути для прохождения (рис. 6).

it_resturants = restaurants.loc[restaurants.cuisine.str.contains('italian')
                                  .fillna(False)].dropna(axis=1, how='all')
resturant_choice = it_resturants[it_resturants['name'] == 'Antica Roma']
orig = list(graph)[993]
dest = ox.nearest_nodes(graph, 
          resturant_choice['geometry'][0].xy[0][0],
          resturant_choice['geometry'][0].xy[1][0])
nodes[nodes.index == orig]

Для выполнения этой задачи мы можем использовать Networkx» shortest_path function для автоматического запуска Алгоритм Дейкстры и попробуем оптимизировать наш путь, чтобы минимизировать его общую длину (рис. 7).

route = nx.shortest_path(graph, orig, dest, weight='length')
ox.plot_route_folium(graph, route, route_linewidth=6, node_size=0)

Наконец, чтобы подтвердить наше исследование, мы можем попробовать выполнить тот же запрос на Картах Google, и, как показано ниже, результаты довольно близки друг к другу! (Рисунок 8).

Заключение

Подводя итог, в этой статье мы сначала представили, как геопространственные данные используются в компаниях, как они обычно хранятся/обрабатываются, и рассмотрели практический пример, чтобы определить кратчайшие пути между двумя разными точками. Конечно, мы можем выполнить аналогичный анализ с помощью инструментов на основе пользовательского интерфейса, таких как OpenStreetMap App или Google Maps, хотя изучение этих основ все еще может быть чрезвычайно ценным, поскольку они могут применяться во многих других формах сетевых технологий. проблемы (например, Проблема коммивояжёра).

Контакты

Если вы хотите быть в курсе моих последних статей и проектов, подпишитесь на меня на Medium и подпишитесь на мой список рассылки. Вот некоторые из моих контактных данных: