Руководство о том, как получить доступ к базе данных 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.