Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

OpenStreetMap (OSM) — это совместный открытый картографический проект, предоставляющий бесплатные и редактируемые географические данные по всему миру. Его часто называют «Википедией карт», потому что любой желающий может внести свой вклад — и миллионы пользователей действительно это делают.

Данные OSM охватывают широкий спектр объектов реального мира, включая:

  • дороги, здания, парки, реки;

  • остановки общественного транспорта, велодорожки и пешеходные маршруты;

  • точки интереса — школы, больницы, кафе и многое другое.

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

Большая часть анализа в этом курсе будет основана именно на данных OpenStreetMap.

Данные OSM можно экспортировать разными способами — через веб-интерфейсы, ГИС-программы или API. Однако, поскольку мы работаем в Python, мы можем получать данные OSM напрямую в Jupyter Notebook, что делает рабочий процесс быстрее и полностью воспроизводимым.

Для этого мы будем использовать мощную библиотеку OSMnx.

0. Импорт библиотек

import osmnx as ox
  • OSMnx (osmnx) — библиотека Python для загрузки, анализа и визуализации данных OpenStreetMap. Она позволяет легко получать пространственные объекты — например, здания, уличные сети и административные границы — по названию места или по координатам. OSMnx хорошо интегрируется с GeoPandas и особенно удобна для задач городского анализа, исследования транспортных сетей и работы с реальными географическими данными — прямо в среде Python.

1. Определение территории

Сначала нужно задать территорию, для которой мы хотим получить данные. Выберем Центральный район Санкт-Петербурга.

Для получения границ района воспользуемся функцией geocode_to_gdf.

admin_district = ox.geocode_to_gdf('Wieden, Vienna')

Давайте посмотрим, что у нас получилось. В методе explore зададим параметр tiles, чтобы изменить базовую подложку OSM по умолчанию на Positron.

admin_district.explore(tiles='cartodbpositron')
Loading...

Отлично! Именно это нам и нужно — границы Центрального района Санкт-Петербурга

2. Экспорт объектов по тегам

Теперь попробуем выгрузить данные о зданиях для Центрального района.

Для этого создадим переменную tags и укажем ключ объектов, которые нам нужны — buildings. Затем передадим название района и заданные теги в функцию geometries_from_place.

Подробнее о ключах и значениях OSM можно прочитать здесь.

tags = {'building': True}   

buildings = ox.features_from_place('Wieden, Vienna', tags)

buildings.explore(tiles='cartodbpositron',tooltip=None)
Loading...

Здания получены!

Теперь отфильтруем данные так, чтобы остались только геометрии типов Polygon и MultiPolygon.

buildings = buildings.loc[buildings.geom_type.isin(['Polygon', 'MultiPolygon'])]

Теперь данные можно сохранить.

Спойлер: при сохранении возникнет ошибка, потому что в некоторых полях значения записаны в формате списков (list). Такой формат не поддерживается при экспорте, поэтому мы исправим это, преобразовав такие поля в строки.

Этот цикл проверяет каждый столбец в GeoDataFrame buildings, чтобы определить, содержит ли он значения типа list.

В данных OSM некоторые поля (особенно теги, такие как amenity, building:use и другие) могут хранить списки — например, если одному объекту присвоено несколько значений.

Однако форматы файлов, такие как GeoJSON или Shapefile, не поддерживают значения в формате списка, что может приводить к ошибкам при сохранении данных.

for col in buildings.columns:
    if any(isinstance(val, list) for val in buildings[col]):
        buildings = buildings.astype({col: str})
  • Цикл проходит по каждому столбцу в buildings.

  • Для каждого столбца он проверяет, есть ли в нём хотя бы одно значение типа list.

  • Если такие значения есть, весь столбец преобразуется в строки с помощью astype({col: str}), чтобы списки стали обычным текстом (например, "['shop', 'office']").

3. Сохранение данных

#buildings.to_file('../data/osm_build.geojson')

Эта команда сохраняет GeoDataFrame buildings в файл формата GeoJSON, который затем можно открыть в любой ГИС-программе или использовать в других проектах.

Формат файла определяется автоматически по его расширению (в данном случае — .geojson).

4. Итог

В этом разделе мы рассмотрели, как получать и использовать данные OpenStreetMap (OSM) напрямую в Python с помощью библиотеки OSMnx.

Мы научились:

  • задавать территорию интереса по названию и получать её границы;

  • загружать данные OSM — например, здания или уличные сети;

  • преобразовывать данные OSM в GeoDataFrame для дальнейшего пространственного анализа;

  • визуализировать результаты на интерактивной карте — не выходя из ноутбука.

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