Turf.js предоставляет набор инструментов для геопространственных вычислений, где окружность в географическом смысле почти всегда представляется не идеальной кривой, а многоугольником с большим числом вершин. Такой подход обусловлен тем, что любые геодезические данные в GeoJSON оперируют дискретными координатами, а не непрерывными линиями.
Построение окружности в Turf.js сводится к генерации набора точек на равных угловых интервалах вокруг центральной точки с учетом кривизны Земли. Результат — полигон, визуально неотличимый от окружности при достаточном количестве сегментов.
В географических системах координат окружность не является простым объектом Евклидовой геометрии. Радиус задается в единицах расстояния (километры, метры, мили), но сами координаты находятся на сфере или эллипсоиде.
Основные особенности:
В Turf.js эти сложности скрыты внутри высокоуровневых функций, которые используют сферическую геометрию.
Ключевая функция построения окружности — 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
unitsoptions.steps
options.units
единицы измерения радиуса:
"kilometers""meters""miles""degrees"Внутри алгоритма происходит разбиение окружности на равные угловые сегменты:
steps частей;Таким образом каждая вершина полигона определяется как геодезическая точка:
Более низкоуровневый способ — ручная генерация точек с помощью
функции 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.
При построении окружности на сфере возникают характерные эффекты:
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);
Геодезическое вычисление каждой точки основано на решении задачи прямой геодезии:
Формально:
где:
При увеличении радиуса:
Особенно заметно при радиусах свыше нескольких сотен километров, где геодезическая окружность начинает существенно отличаться от плоской геометрической модели.
С помощью модификации базового алгоритма возможно создание вариаций:
Такие конструкции используются в моделировании покрытия сетей, радиолокации и пространственной аналитике.