Построение окружности как полигона

Turf.js предоставляет набор инструментов для геопространственных вычислений, где окружность в географическом смысле почти всегда представляется не идеальной кривой, а многоугольником с большим числом вершин. Такой подход обусловлен тем, что любые геодезические данные в GeoJSON оперируют дискретными координатами, а не непрерывными линиями.

Построение окружности в Turf.js сводится к генерации набора точек на равных угловых интервалах вокруг центральной точки с учетом кривизны Земли. Результат — полигон, визуально неотличимый от окружности при достаточном количестве сегментов.


Геодезическая природа окружности

В географических системах координат окружность не является простым объектом Евклидовой геометрии. Радиус задается в единицах расстояния (километры, метры, мили), но сами координаты находятся на сфере или эллипсоиде.

Основные особенности:

  • расстояние измеряется по дуге большого круга;
  • форма зависит от проекции и модели Земли;
  • равные углы не соответствуют равным расстояниям в градусах широты/долготы;
  • необходимо учитывать геодезические вычисления при генерации точек.

В Turf.js эти сложности скрыты внутри высокоуровневых функций, которые используют сферическую геометрию.


Основной способ: turf.circle

Ключевая функция построения окружности — circle. Она генерирует GeoJSON-полигон, приближенный к окружности.

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

const center = [37.6173, 55.7558]; // Москва: [lng, lat]
const radius = 5; // километры

const options = {
  steps: 64,
  units: "kilometers"
};

const circlePolygon = circle(center, radius, options);

Параметры функции

center

  • массив [longitude, latitude]
  • задает центр окружности

radius

  • числовое значение радиуса
  • интерпретация зависит от units

options.steps

  • количество сегментов полигона
  • чем больше значение, тем более гладкая окружность
  • типичные значения: 32, 64, 128

options.units

  • единицы измерения радиуса:

    • "kilometers"
    • "meters"
    • "miles"
    • "degrees"

Геометрия формирования полигона

Внутри алгоритма происходит разбиение окружности на равные угловые сегменты:

  1. полный круг делится на steps частей;
  2. вычисляется азимут для каждой точки;
  3. для каждого направления рассчитывается новая координата на заданном расстоянии от центра;
  4. используется сферическая формула перемещения по поверхности Земли.

Таким образом каждая вершина полигона определяется как геодезическая точка:

  • стартовая точка — центр;
  • направление — угол от 0 до 360°;
  • расстояние — радиус.

Альтернативное построение через destination

Более низкоуровневый способ — ручная генерация точек с помощью функции destination, которая вычисляет координату по направлению и расстоянию.

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

const center = [37.6173, 55.7558];
const radius = 10;
const steps = 72;

const points = [];

for (let i = 0; i <= steps; i++) {
  const angle = (i * 360) / steps;

  const point = destination(center, radius, angle, {
    units: "kilometers"
  });

  points.push(point.geometry.coordinates);
}

const polygon = {
  type: "Feature",
  geometry: {
    type: "Polygon",
    coordinates: [points]
  }
};

Такой подход даёт полный контроль над:

  • формой окружности;
  • распределением точек;
  • возможностью модификации радиуса по углу (анизотропные формы);
  • интеграцией дополнительных вычислений.

Влияние количества сегментов

Качество окружности напрямую зависит от параметра steps.

Низкие значения (8–16)

  • форма напоминает многоугольник;
  • заметны угловые сегменты;
  • подходит для грубых расчетов зон покрытия.

Средние значения (32–64)

  • визуально близко к окружности;
  • оптимальный баланс производительности и точности;
  • стандарт для большинства картографических задач.

Высокие значения (128+)

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

Геодезические искажения

При построении окружности на сфере возникают характерные эффекты:

  • форма становится слегка эллиптической в проекциях Web Mercator;
  • расстояние между точками не является постоянным в градусах;
  • при приближении к полюсам окружности искажаются сильнее;
  • “радиус” в километрах сохраняется, но визуальная форма может изменяться.

Turf.js учитывает это через сферические вычисления, а не плоскую геометрию.


Использование различных единиц измерения

Выбор единиц влияет на интерпретацию радиуса:

  • километры — стандарт для геоаналитики;
  • метры — для локальных вычислений высокой точности;
  • мили — для интеграции с англосаксонскими системами;
  • градусы — чисто математическое приближение, редко используется.

Пример:

circle(center, 1000, {
  steps: 64,
  units: "meters"
});

Оптимизация производительности

При работе с множеством окружностей важны оптимизационные стратегии:

  • уменьшение steps при зуме карты;
  • кэширование сгенерированных полигонов;
  • повторное использование центров с разными радиусами;
  • генерация окружностей на сервере для снижения нагрузки клиента.

Дополнительно используется упрощение геометрии после построения, хотя для окружностей это применяется редко из-за их регулярной структуры.


Построение концентрических окружностей

Часто требуется набор окружностей с одним центром:

const center = [37.6173, 55.7558];

const radii = [1, 5, 10, 20];

const circles = radii.map((r) =>
  circle(center, r, {
    steps: 64,
    units: "kilometers"
  })
);

Такая структура применяется в:

  • анализе зон доступности;
  • построении изолиний влияния;
  • радиусном поиске объектов.

Комбинация с пространственными операциями

Окружности часто используются как входные данные для других операций:

  • пересечение (intersect);
  • объединение (union);
  • вычитание (difference);
  • проверка попадания точки (booleanPointInPolygon).

Пример проверки:

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

const zone = circle(center, 5, { steps: 64, units: "kilometers" });

const point = {
  type: "Feature",
  geometry: {
    type: "Point",
    coordinates: [37.62, 55.75]
  }
};

const inside = booleanPointInPolygon(point, zone);

Математическая модель генерации

Геодезическое вычисление каждой точки основано на решении задачи прямой геодезии:

  • известна начальная точка;
  • известен азимут;
  • известно расстояние;
  • вычисляется конечная точка на сфере.

Формально:

  • вход: (φ₁, λ₁, d, θ)
  • выход: (φ₂, λ₂)

где:

  • φ — широта,
  • λ — долгота,
  • d — расстояние,
  • θ — направление.

Особенности работы на больших радиусах

При увеличении радиуса:

  • увеличивается влияние кривизны Земли;
  • возрастает погрешность визуального совпадения с идеальной окружностью;
  • требуется больше сегментов для сохранения формы;
  • может потребоваться адаптация под проекцию карты.

Особенно заметно при радиусах свыше нескольких сотен километров, где геодезическая окружность начинает существенно отличаться от плоской геометрической модели.


Построение нестандартных окружностей

С помощью модификации базового алгоритма возможно создание вариаций:

  • эллипсоидальные зоны (разные радиусы по осям);
  • деформированные окружности с шумом координат;
  • секторные окружности (дуги вместо полного круга);
  • взвешенные зоны влияния.

Такие конструкции используются в моделировании покрытия сетей, радиолокации и пространственной аналитике.