Расчет изохрон

Изохрона в пространственной аналитике — это область, ограничивающая все точки, достижимые из заданной стартовой позиции за фиксированное время при заданных ограничениях передвижения. В веб-картографии изохроны используются для оценки доступности инфраструктуры: транспорт, пешеходные маршруты, велосипедные сети, автомобильные дороги.

При использовании Turf.js изохроны строятся не как готовая функция уровня «одной команды», а как композиция геометрических операций: дискретизация пространства, расчет расстояний, фильтрация точек по условию достижимости и построение изолиний или выпуклой/вогнутой оболочки.

Ключевая идея: изохрона — это не окружность в евклидовом смысле, а множество точек, удовлетворяющих условию:

  • время(старт → точка) ≤ T
  • с учетом модели движения (скорость, сеть, препятствия)

Базовые геометрические примитивы Turf.js для изохрон

При построении изохрон используются следующие операции:

  • расчет расстояний между точками
  • создание буферных зон
  • работа с сетками (grid sampling)
  • построение полигонов из набора точек
  • генерация изолиний

В Turf.js ключевыми функциями являются:

  • turf.distance — вычисление геодезического расстояния
  • turf.booleanPointInPolygon — проверка принадлежности точки
  • turf.circle — приближённая радиальная область
  • turf.concave / turf.convex — построение оболочек
  • turf.envelope — ограничивающий прямоугольник
  • turf.squareGrid / turf.hexGrid — генерация сетки

Математическая модель изохроны

Если движение моделируется равномерной скоростью v, то время до точки выражается как:

t =

где:

  • t — время достижения
  • d — расстояние по поверхности Земли
  • v — скорость перемещения

Тогда условие изохроны:

d v T

Это превращает задачу из временной в геометрическую: построение множества точек, удалённых не дальше чем на v·T.


Простая изохрона через круговую аппроксимацию

Самая базовая модель изохроны в Turf.js строится через радиус:

import { point, circle } from "@turf/turf";

const center = point([71.4304, 51.1281]); // координаты
const radius = 5; // километры

const isochrone = circle(center, radius, {
  steps: 128,
  units: "kilometers"
});

Этот подход эквивалентен предположению:

  • движение возможно во всех направлениях
  • скорость постоянна
  • отсутствуют ограничения сети

Преимущество — вычислительная простота. Недостаток — отсутствие реализма.


Изохрона на основе сетки (grid-based approach)

Более точная модель строится через дискретизацию пространства.

Шаг 1. Создание сетки

import { bbox, squareGrid } from "@turf/turf";

const bounds = [70.5, 50.8, 72.2, 51.5];

const grid = squareGrid(bounds, 1, { units: "kilometers" });

Каждая ячейка сетки становится кандидатом в изохрону.


Шаг 2. Оценка достижимости

import { distance, point } from "@turf/turf";

const start = point([71.4304, 51.1281]);
const speed = 5; // км/ч
const timeLimit = 0.5; // часы

const maxDistance = speed * timeLimit;

const reachable = grid.features.filter(cell => {
  const d = distance(start, cell, { units: "kilometers" });
  return d <= maxDistance;
});

Шаг 3. Преобразование точек в полигон

import { concave } from "@turf/turf";

const isochrone = concave({
  type: "FeatureCollection",
  features: reachable
}, {
  maxEdge: maxDistance
});

Так формируется приближённая изохрона с неровными границами.


Многоуровневые изохроны (time bands)

Часто требуется построение нескольких зон доступности: 5, 10, 15 минут.

Математически это набор вложенных множеств:

I_1 I_2 I_3 T_1 < T_2 < T_3

В Turf.js это реализуется повторным применением фильтрации:

const times = [5, 10, 15]; // минуты

const bands = times.map(t => {
  const maxDist = speed * (t / 60);

  const points = grid.features.filter(cell =>
    distance(start, cell, { units: "kilometers" }) <= maxDist
  );

  return concave({
    type: "FeatureCollection",
    features: points
  });
});

Улучшение модели через взвешенную сетку

Реальные изохроны требуют учета:

  • дорог
  • препятствий
  • разных скоростей движения
  • направлений движения (односторонние улицы)

В этом случае каждому ребру или ячейке присваивается вес.

Алгоритмически задача превращается в поиск кратчайших путей (Dijkstra / A*), а Turf.js используется как геометрический слой для визуализации результата.


Построение изохрон через граф дорог

Типовая архитектура:

  1. Данные дорог из OpenStreetMap
  2. Преобразование в граф
  3. Расчет времени до узлов
  4. Генерация изолиний

Псевдологика:

for (node of graph) {
  node.time = dijkstra(start, node);
}

Далее узлы группируются по диапазонам времени и преобразуются в полигоны через:

  • triangulation
  • concave hull
  • isoline interpolation

Интерполяция изолиний

При наличии набора точек с значением времени используется построение изолиний.

Общий принцип:

  • пространство разбивается на триангуляцию
  • значения интерполируются внутри треугольников
  • линии равного значения соединяются

В Turf.js это приближается через комбинацию:

  • turf.triangulate
  • turf.isobands (в расширенных сборках)
  • постобработка контуров

Оптимизация вычислений

При построении изохрон ключевые узкие места:

  • вычисление расстояний O(n)
  • фильтрация сетки
  • построение оболочки O(n log n)

Оптимизации:

  • предварительный bounding box
  • spatial indexing (R-tree)
  • уменьшение плотности сетки на периферии
  • кэширование расстояний

Ошибки и ограничения модели Turf.js

При использовании Turf.js для изохрон важно учитывать:

  • геодезические расстояния ≠ дорожные расстояния
  • отсутствие встроенного routing engine
  • чувствительность к плотности сетки
  • приближённый характер concave hull

Следовательно, Turf.js подходит для:

  • прототипов
  • визуализаций
  • аналитики первого уровня

Но не заменяет полноценные routing-системы.


Комбинированная архитектура изохронных сервисов

Практическая система обычно строится так:

  • routing engine (OSRM / GraphHopper)

  • генерация точек доступности

  • Turf.js:

    • фильтрация
    • агрегация
    • построение полигонов
    • визуализация

Роль Turf.js — геометрический слой, а не транспортный движок.


Сглаживание границ изохрон

Для устранения «ступенчатости» сетки применяются:

  • увеличение шага сетки
  • Chaikin smoothing
  • уплотнение точек по границе
  • повторная генерация concave hull

Алгоритмически:

  • выделение границы
  • ресемплинг
  • повторное построение полигона

Визуальная интерпретация результата

Изохроны обычно представляются как:

  • вложенные полигоны
  • градиентные зоны
  • тепловые карты

В WebGIS их используют для:

  • анализа доступности транспорта
  • планирования инфраструктуры
  • оценки зон доставки
  • моделирования городской мобильности