Впорядкованість вулиць міста з ОСМ

Сергій Щусь
3 min readJan 21, 2022

--

Уявіть собі компас. У кожного компаса є стрілка, яка завжди вказує на північ. За допомогою компаса ми завжди можемо дізнатись розташування сторін світу та пройти по азімуту від точки до точки.

А тепер уявимо, що замість стрілки на компас ми покладемо вулицю. Наприклад, ту, на якій знаходимось зараз, або вулицю на якій народились. Куди в такому випадку покаже “стрілка”? У якому напрямку прокладена ця вулиця?

Кожне місто планується, відштовхуючісь від місцини, на якій знаходиться, історичних подій, наявності промисловості тощо. Надихаючись дослідженням Geoff Boeing та його статтєю можна дослідити “розу доріг” різних міст та побачити особливості планування кожного з них. Для цього можна використати загальнодоступні дані Open Street Map.

На прикладі двох міст наочно видно, що може бути досить продумане планування, а може бути і хаотичне.

Отже, хто має сітку, а хто немає? Кожне міст представлено полярною гістограмою, що показує, як орієнтовані його вулиці. Напрямок кожного стовпця є азимутом вулиці по компасу (у цьому осередку гістограми), довжина представляє відносну частоту вулиць із цими азимутами.

Скористуємось для аналізу пакетом для роботи з Open Street Map у Python — OSMNX.

!pip install osmnx

Інсталюємо пакет та імпортуємо необхідне до Google Colab Notebook

import matplotlib.pyplot as pltimport numpy as npimport osmnx as oximport geopandas as gpd%matplotlib inlineox.__version__%matplotlib inlineweight_by_length = Falseox.__version__# turn response caching offox.config(use_cache=False)# turn it back on and turn on/off logging to your consoleox.config(use_cache=True, log_console=False)

Знаходимо місцини, які хочемо переглянути та візуалізуємо для аналізу

# download/model a street network for some city then visualize it
G = ox.graph_from_place("Yaremche, Ukraine", network_type="drive")
fig, ax = ox.plot_graph(G)

Робимо перелік усіх місць для компанування на одній дошці

# verify OSMnx geocodes each query to what you expect (i.e., a [multi]polygon geometry)gdf = ox.geocode_to_gdf(list(places.values()))gdf

Та формуємо звіт, який зберігаємо у каталозі на Google drive

# create figure and axesn = len(places)ncols = int(np.ceil(np.sqrt(n)))nrows = int(np.ceil(n / ncols))figsize = (ncols * 5, nrows * 5)fig, axes = plt.subplots(nrows, ncols, figsize=figsize, subplot_kw={"projection": "polar"})# plot each city's polar histogramfor ax, place in zip(axes.flat, sorted(places.keys())):print(ox.utils.ts(), place)# get undirected graphs with edge bearing attributesG = ox.graph_from_place(place, network_type="drive")Gu = ox.add_edge_bearings(ox.get_undirected(G))fig, ax = ox.bearing.plot_orientation(Gu, ax=ax, title=place, area=True)# add figure title and save imagesuptitle_font = {"family": "DejaVu Sans","fontsize": 60,"fontweight": "normal","y": 1,}fig.suptitle("Орієнтація вуличної мережі міста", **suptitle_font)fig.tight_layout()fig.subplots_adjust(hspace=0.35)fig.savefig("/content/image/street-orientations_05.png", facecolor="w", dpi=100, bbox_inches="tight")plt.close()

На зображенні можна побачити різницю у плануванні міст. Частина має чітке зонування кварталів за виключенням незначних провулків та вуличок, найбільші ж міста, навпаки, мають хаотичне планування з напрямком вулиць на усі сторони світу.

--

--

Сергій Щусь
Сергій Щусь

Written by Сергій Щусь

GIS 🗺️, TrailRunner 🏃‍♂️ add Diver 🤿 . .

Responses (1)