OpenStreetMap (OSM) — это совместный открытый картографический проект, предоставляющий бесплатные и редактируемые географические данные по всему миру. Его часто называют «Википедией карт», потому что любой желающий может внести свой вклад — и миллионы пользователей действительно это делают.
Данные OSM охватывают широкий спектр объектов реального мира, включая:
дороги, здания, парки, реки;
остановки общественного транспорта, велодорожки и пешеходные маршруты;
точки интереса — школы, больницы, кафе и многое другое.
Благодаря открытости, гибкости и глобальному охвату OSM стал одним из наиболее широко используемых источников пространственных данных. Его применяют в городском планировании, транспортных исследованиях, гуманитарных проектах и научных работах. (Больше источников открытых пространственных данных можно найти здесь.)
Большая часть анализа в этом курсе будет основана именно на данных OpenStreetMap.
Данные OSM можно экспортировать разными способами — через веб-интерфейсы, ГИС-программы или API. Однако, поскольку мы работаем в Python, мы можем получать данные OSM напрямую в Jupyter Notebook, что делает рабочий процесс быстрее и полностью воспроизводимым.
Для этого мы будем использовать мощную библиотеку OSMnx.
0. Импорт библиотек¶
import osmnx as oxOSMnx (
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')Отлично! Именно это нам и нужно — границы Центрального района Санкт-Петербурга
2. Экспорт объектов по тегам¶
Теперь попробуем выгрузить данные о зданиях для Центрального района.
Для этого создадим переменную tags и укажем ключ объектов, которые нам нужны — buildings.
Затем передадим название района и заданные теги в функцию geometries_from_place.
Подробнее о ключах и значениях OSM можно прочитать здесь.
tags = {'building': True}
buildings = ox.features_from_place('Wieden, Vienna', tags)
buildings.explore(tiles='cartodbpositron',tooltip=None)Здания получены!
Теперь отфильтруем данные так, чтобы остались только геометрии типов 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 мощным и доступным источником данных для пространственных проектов.