Матрица времени в пути от зданий до сервисов

Этот ноутбук рассчитывает матрицу времени в пути от зданий из примера до сервисов из примера по интермодальному графу (пешком + общественный транспорт) функцией od_matrix из IduEdu и сохраняет её в examples_data/matrix_time.parquet для примера обеспеченности.

Последний раздел, Своя территория, объясняет, как рассчитать матрицу для другой территории.

# !pip install "iduedu[pbf]" pyarrow
import geopandas as gpd
import iduedu
import pandas as pd
from iduedu import get_intermodal_graph, od_matrix
from shapely.ops import unary_union

1. Здания и сервисы

# Read building and service datasets
buildings = gpd.read_parquet('examples_data/buildings.parquet')
services = gpd.read_parquet('examples_data/services.parquet')

2. Территория

Выпуклая оболочка всех зданий и сервисов с буфером 0,001° (около 60–110 м) задаёт границы графа.

polygon = unary_union(
    buildings.to_crs(4326).geometry.to_list() + services.to_crs(4326).geometry.to_list()
).convex_hull.buffer(0.001)

3. Интермодальный граф

Территория вырезается из выгрузки Geofabrik по Северо-Западному федеральному округу (iduedu.use_pbf); тот же вызов без блока with скачивает данные из Overpass API.

with iduedu.use_pbf(territory=polygon, region="northwestern-fed-district"):
    G_intermodal = get_intermodal_graph(territory=polygon, clip_by_territory=True)
2026-11-04 22:07:48.449 | WARNING  | Removing 407 nodes outside the largest strongly connected component. Retaining 21326 of 21733 nodes.
2026-11-04 22:07:48.470 | WARNING  | Public transport nodes dropped with the smaller components: {'trolleybus': 2}

4. Матрица времени в пути

od_matrix привязывает точки отправления и назначения к узлам графа и выполняет поиски Дейкстры с весом рёбер weight ("time_min", минуты) до threshold (45 минут). Пары за пределами порога недостижимы.

# Compute travel time matrix (in minutes)
matrix: pd.DataFrame = od_matrix(
    G_intermodal,
    gdf_origins=buildings,
    gdf_destinations=services,
    weight="time_min",
    threshold=45,
)

5. Сохранение

Матрица сохраняется для примера обеспеченности.

# Save matrix to Parquet format
# IduEdu returns a sparse DataFrame to keep large OD matrices compact in memory.
# Parquet writers do not support pandas SparseDtype columns, so convert to a dense
# DataFrame before saving. Unreachable pairs stay encoded as np.inf.
matrix_dense = matrix.sparse.to_dense()
matrix_dense.to_parquet('examples_data/matrix_time.parquet')

6. Своя территория

Этот ноутбук и есть рецепт для другой территории: запишите свои здания и сервисы (GeoDataFrame в любой системе координат) в buildings и services в разделе 1 и выполните его. Территория вокруг них, граф и матрица рассчитаются по ним; если region не задан, iduedu.use_pbf сам выбирает выгрузку Geofabrik. Сохраните матрицу под своим именем и передайте её в get_service_provision, как в примере обеспеченности.