Руководство о том, как получить доступ к базе данных OpenStreetMap с помощью Python с помощью Google Colab.

Если вы хотите получить геопространственные данные из OpenStreetMap (OSM), вы можете загрузить их, но это требует времени и хранения. Не выходя из среды разработки (Jupyter Notebooks), вы можете получить доступ к данным OpenStreetMap и получить их. Представьте, что вы проводите анализ и хотите узнать, сколько мест отдыха или ресторанов находится в интересующей вас области.
В этом руководстве мы научимся извлекать данные OpenStreetMap с помощью OSMNX, пакета python.
OSMnx - это пакет Python, который позволяет загружать пространственную геометрию и модели, проектировать, визуализировать и анализировать уличные сети и другие пространственные данные из API OpenStreetMap.
В следующих трех разделах мы извлекаем из OpenStreetMap три различных типа данных: кафе как достопримечательности, здания и уличные сети. Мы также исследуем визуализацию геопространственных данных с помощью Folium.
Улицы
Сначала мы создаем переменную для хранения интересующей нас области. Не стесняйтесь исследовать любое другое место, которое вы хотите, но в этом уроке я использую город Ливерпуль (обратите внимание, чем больше ваша территория, тем больше времени занимает вычисление).
place = “Liverpool, United Kingdom” graph = ox.graph_from_place(place, network_type=’drive’)
С помощью двух приведенных выше строк кода OSMnx позволяет нам быстро извлекать уличные сети города. Результатом является класс Networkx, который мы конвертируем в Geopandas для дальнейшей обработки данных. Давайте посмотрим, как мы можем превратить его в Geopandas Geodataframe. OSMnx поставляется с функцией «graph_to_gdf», которая может легко это сделать:
nodes, streets = ox.graph_to_gdfs(graph) streets.head()
Теперь, если мы посмотрим на данные, они преобразуются в знакомую форму фрейма данных pandas с дополнительными возможностями для обработки географических данных.

Вы можете обрабатывать полученные данные с помощью любого инструмента по вашему выбору (в нашем случае Pandas) или визуализировать свои данные с помощью любой из библиотек Python. Допустим, мы хотим получить гистограмму типов улиц. Следующий процесс - это просто чистая функциональность панд с визуализацией морских данных.
street_types = pd.DataFrame(edges["highway"].apply(pd.Series)[0].value_counts().reset_index())
street_types.columns = ["type", "count"]
fig, ax = plt.subplots(figsize=(12,10))
sns.barplot(y="type", x="count", data=street_types, ax=ax)
plt.tight_layout()
plt.savefig("barchart.png")
Вот график выходной гистограммы для данных. Жилые улицы имеют самую высокую частоту в этом наборе данных.

Мы также можем использовать карты для визуализации данных улиц с помощью любого из ваших любимых инструментов геопространственной визуализации на Python. Пользуюсь здесь Фолиумом.
style = {‘color’: ‘#F7DC6F’, ‘weight’:’1'}
m = folium.Map([-2.914018, 53.366925],
zoom_start=15,
tiles=”CartoDb dark_matter”)
folium.GeoJson(edges.sample(), style_function=lambda x: style).add_to(m)
m.save(“edges.html”)
m
На выходе получилась красивая карта всех улиц Ливерпуля. Не нужно скачивать данные, выгружать их и читать с помощью Pandas.

В следующем разделе мы извлекаем все здания, доступные в данных OpenStreetMap в Ливерпуле.
Следы зданий
Чтобы получить следы здания, мы используем функцию «footprints_from_place» из OSMnx. Нам нужно передать название места.
buildings = ox.footprints_from_place(place) buildings.shape
Набор данных о здании содержит 27329 строк и 185 столбцов (обратите внимание, что это может измениться, когда пользователи OSM обновят любую функцию в этой области). Давайте посмотрим на подмножество полученного набора данных о зданиях.
cols = [‘amenity’,’building’, ‘name’, ‘tourism’] buildings[cols].head()

Мы также можем нанести на карту здания. Из-за большего набора данных Folium может некорректно отображать его в записной книжке, но вы можете сохранить его и открыть в браузере.
style_buildings = {‘color’:’#6C3483 ‘, ‘fillColor’: ‘#6C3483 ‘, ‘weight’:’1', ‘fillOpacity’ : 1}
m = folium.Map([ 57.70958, 11.96687],
zoom_start=15,
tiles=”Stamen Toner”)
folium.GeoJson(buildings[:1000], style_function=lambda x: style_buildings).add_to(m)
m

Достопримечательности (кафе)
Мы также можем получить доступ и получить некоторые другие наборы данных на основе точек из набора данных OpenStreetMap. OSMnx также имеет функцию ox.pois_from_place (), где вы можете передать интересующую вас переменную в параметре удобства. Список доступных возможностей доступен в OpenStreetMap Wiki.
В этом примере мы получаем кафе в Ливерпуле.
cafe = ox.pois_from_place(place, amenities=[“cafe”]) cafe.head()
Вот подмножество набора данных кафе, где у нас есть столбцы с именем, наличием инвалидных колясок и часами работы. Однако в некоторых столбцах нет данных.

Наконец, нанесем эти кафе на карту.
cafe_points = cafe[cafe.geom_type == “Point”] m = folium.Map([53.366925, -2.914018], zoom_start=10, tiles=”CartoDb dark_matter”) locs = zip(cafe_points.geometry.y, cafe_points.geometry.x) #folium.GeoJson(buildings, style_function=lambda x: style_buildings).add_to(m) for location in locs: folium.CircleMarker(location=location, color = “#F4F6F7”, radius=2).add_to(m) m.save(“cafes.html”) m
Ниже представлена карта всех кафе, доступных в базе данных OpenStreetMap в Ливерпуле.

Получение данных OSM может быть включено в любой другой ваш проект анализа или визуализации данных. Поэкспериментируйте с любым другим интересным местом. Также имейте в виду, что вы можете предоставить данные OpenStreetMap, если обнаружите, что в интересующей вас области недостаточно данных.
Заключение
В этом руководстве мы получили данные OpenStreetMap с помощью OSMnx, а также обработали их с помощью Pandas и Geopandas. Мы также увидели, как визуализировать геопространственные данные с помощью Folium.
Доступна записная книжка для этого учебника. Вы можете напрямую запустить это в Google Colab.