ObjectNat

Пространственный и сетевой анализ городских объектов

ObjectNat — библиотека Python с открытым исходным кодом для пространственного анализа городских объектов: зданий, сервисов, наблюдателей на улицах и источников шума. Её разрабатывает команда IDU Университета ИТМО.

Стиль кода: black Версия на PyPI Тесты и покрытие Покрытие тестами Лицензия GitHub


Обзор

ObjectNat работает с данными GeoPandas и с графами улиц (iduedu.UrbanGraph), которые строит IduEdu по данным OpenStreetMap и GTFS. Страница каждого метода описывает, что вычисляется, алгоритм, параметры и результаты с единицами измерения, пример рисунка и ограничения.

Метод

Результат

Функции

Изохроны

Территория, достижимая из точек отправления по графу в пределах бюджета времени (мин) или расстояния (м)

get_graph_isochrones(), get_stepped_graph_isochrones()

Зоны покрытия

Неперекрывающиеся зоны, которые обслуживает каждый сервис в пределах бюджета

get_graph_coverage(), get_stepped_graph_coverage(), get_radius_coverage()

Обеспеченность сервисами

Распределение спроса зданий между сервисами ограниченной вместимости в пределах порога стоимости

get_service_provision() и вспомогательные функции

Анализ видимости

Полигоны видимости и метрики изовист (2D), области видимости с учётом высот зданий и рельефа (2.5D), зоны охвата для множества наблюдателей

get_visibility(), get_isovist_grid(), get_viewshed(), get_visibility_catchment(), get_viewshed_catchment()

Моделирование шума

Уровни звука (дБ) вокруг точечных, линейных и площадных источников среди препятствий и растительности

simulate_noise_grid(), simulate_noise(), calculate_simplified_noise_frame()

Инсоляция

Часы прямого солнца на земле и на фасадах по этажам, за день или за период

get_insolation(), get_facade_insolation()

Растры

Результаты на сетке в виде растров: рисунки matplotlib, файлы GeoTIFF, слои веб-карт folium

rasterize(), Raster

Ресурсоёмкие части (точная видимость, лучи зрения 2.5D, инсоляция, шум на сетке приёмников и распределение в модели обеспеченности) выполняются в параллельных потоках в скомпилированном расширении на Rust, objectnat._rust; поиск по графу использует ускоренные Numba процедуры Дейкстры из IduEdu. В разделе Примеры для каждого метода есть исполняемый ноутбук.


Установка

pip install objectnat

ObjectNat поддерживает Python 3.11–3.14 в Linux, macOS и Windows и устанавливает IduEdu версии 2.4.2 или новее в пределах серии 2.x. Колёса (wheels) содержат скомпилированное расширение, поэтому pip не нужен компилятор; сборка из исходного кода требует инструментов Rust (rustup). Для чтения рельефа из GeoTIFF в инсоляции и областях видимости нужен необязательный пакет rasterio. Изменения для кода, написанного под 2.x, перечислены на странице Переход на 3.0.


Быстрый старт

Методы на графах принимают iduedu.UrbanGraph. IduEdu может скачать выгрузку Geofabrik, вырезать из неё территорию и построить граф по локальному файлу вместо запросов к Overpass API (для вырезания нужен pip install "iduedu[pbf]"):

import geopandas as gpd
import iduedu
from iduedu import get_4326_boundary, get_intermodal_graph
from shapely.geometry import Point

from objectnat import get_stepped_graph_isochrones

# Vasilyevsky Island district, Saint Petersburg (OSM relation 1114252)
with iduedu.use_pbf(osm_id=1114252, region="northwestern-fed-district"):
    boundary = get_4326_boundary(osm_id=1114252)
    graph = get_intermodal_graph(territory=boundary, clip_by_territory=True)

origins = gpd.GeoDataFrame(geometry=[Point(30.2706, 59.9355)], crs=4326)
bands = get_stepped_graph_isochrones(
    graph,
    gdf_origins=origins,
    weight_type="time_min",
    weight_value_cutoff=10,  # minutes
    step=2,
    geometry_type="separate",
)

Без блока with те же вызовы обращаются к Overpass API.

Методы без графа принимают GeoDataFrame напрямую, например часы солнца среди зданий со столбцом этажности:

from objectnat import get_insolation

receivers = get_insolation(buildings, "2026-06-21", height_column=None, storeys_column="storeys_count")

Настройка

from objectnat import config

config.change_logger_lvl("INFO")  # hide debug messages
config.set_enable_tqdm(False)     # disable progress bars

Участие, контакты и цитирование

Задачи (issues) и пул-реквесты принимаются на GitHub; порядок работы описан в CONTRIBUTING.md.

ObjectNat распространяется по лицензии BSD 3-Clause (LICENSE.txt). Для цитирования используйте метаданные из CITATION.cff (на GitHub кнопка Cite this repository экспортирует их в формате APA или BibTeX). Публикации об ObjectNat будут перечислены здесь.