PyrOSM работа с данными Open Street Map

PyrOSM эффективная работа с данными OpenStreetMap

Эффективные геопространственные манипуляции для данных карты OSM

Фото от Tabea Schimpf на Unsplash

Если вы работали с данными OSM раньше, то вы знаете, что их не так легко извлечь. Данные OSM могут быть огромными, и поиск эффективных решений для анализа того, что вы хотите, часто является вызовом. PyrOSM – это пакет, который делает процесс чтения и работы с данными OSM намного эффективнее. Как? Во-первых, PyrOSM построен на Cython (C Python), и он использует более быстрые библиотеки для десериализации данных OSM, а также мелкие оптимизации, такие как массивы numpy, что позволяет ему обрабатывать данные быстро. Особенно, если вы ранее использовали OSMnx (для очень похожих задач), вы знаете, что большие наборы данных занимают очень много времени для загрузки в память, и именно здесь PyrOSM может помочь вам работать с ними. Давайте рассмотрим, что может делать эта библиотека!

🌎 Данные PBF

Давайте немного поговорим о конкретном формате файлов, в котором поступают данные OSM. PBF расшифровывается как «Protocolbuffer Binary Format» и является очень эффективным для работы с хранящимися данными OSM. Данные OSM организованы в «fileblocks», которые являются группами данных, которые могут быть независимо закодированы или декодированы. Fileblocks содержат PrimitiveGroups, которые в свою очередь включают тысячи сущностей OSM, таких как узлы, пути и отношения.

Данные могут быть масштабированы в соответствии с желаемым уровнем детализации пользователя. Например, разрешение текущей базы данных OSM составляет около ~1 см. Фактически, если вы хотели бы, вы могли бы загрузить все данные Open Street Maps в один файл, известный как Planet (около 1000 ГБ данных)!

👩‍💻 Основы PyrOSM: чтение наборов данных

PyrOSM – это пакет, который считывает данные PBF Open Street Map на основе двух основных поставщиков данных: Geofabrik (данные уровня мира и стран) и BBBike (данные уровня города). Пакет позволяет пользователю получать доступ к различным типам объектов:

  • Здания, POI (точки интереса), использование земли
  • Уличные сети
  • Пользовательские фильтры
  • Экспорт в виде сетей
  • и многое другое!

В настоящее время BBBike поддерживает 235 городов по всему миру, и вы можете легко получить доступ к полному списку, вызвав метод “sources.cities.available”. Начать работу довольно просто: просто инициализируйте объект OSM reader и загрузите нужные вам данные:

С этого момента вам потребуется использовать объект OSM для взаимодействия с данными Berkeley. Теперь давайте получим уличную сеть Berkeley для движения:

DataFrame для уличной сети Berkeley

Вывод фактического объекта street_network показывает, что он хранится в GeoPandas GeoDataFrame со всеми атрибутами OSM, такими как длина, дорога, максимальная скорость и т. д., что может быть очень полезно для дальнейшего анализа.

Примечание: BBBike (поставщик этого набора данных) имеет множество других форматов данных разных размеров, включая Organic Maps OSM, Garmin OSM или SVG Mapnik, в зависимости от вашей конкретной задачи.

🔍 Более точная фильтрация

Результаты загрузки данных выше включают все данные Berkeley и, фактически, даже данные соседних городов, что является неидеальным. Что, если вы хотите получить гораздо меньшую или более конкретную область? Здесь вводится использование ограничивающего прямоугольника. Чтобы создать ограничивающий прямоугольник, вы можете либо:

  • Вручную указать список из 4 координат в формате [minx, miny, maxx, maxy]
  • передать геометрии Shapely (например, LineString или Multipolygon)

Для поиска координат ограничивающей рамки я обычно использую этот сайт bbox finder, который позволяет создавать прямоугольники и затем копировать координаты. Вот как ограничить область вокруг кампуса UC Berkeley и получить его сеть пешеходных маршрутов:

Street network using a bounding box

🎯 Экспорт и работа с графиками

Еще одна хорошая вещь в PyrOSM – это то, что он позволяет обрабатывать сети и подключаться к другим библиотекам анализа сети. Помимо сохранения уличных сетей в виде геодатафреймов, PyrOSM позволяет извлекать узлы и ребра, храня их в двух отдельных датафреймах. Вот один из них – узлы:

Dataframe of nodes from the street network

Если у вас есть такое графовое представление, очень легко сохранить его в различных форматах: OSMnx, igraph и Pandana, и работать с ними там.

💭 Заключительные мысли

Это было краткое резюме того, что может сделать для вас pyrosm в вашей геопространственной работе! Я упомянул некоторые методы, которые могут быть очень полезны, например, загрузка конкретных наборов данных из области или ограничение интересующей области, а также то, как это связано с другими библиотеками. Я считаю, что лучшее в pyrosm именно это: то, что он устраняет разрыв между огромными наборами данных OSM и инженерными или аналитическими вопросами, на которые вы можете ответить с его помощью.

Спасибо за чтение!