Поворот геометрий

Операция поворота в пространственной геометрии сводится к преобразованию координат каждого узла объекта относительно выбранной опорной точки (pivot). В контексте GeoJSON это означает, что каждая вершина Point, LineString или Polygon проходит через аффинное преобразование, основанное на матрице поворота в двумерной плоскости.

В геоинформационных вычислениях поворот используется для нормализации данных, моделирования ориентации объектов, генерации симметрий, анализа пространственных конфигураций и подготовки геометрий к последующим операциям (например, упаковке в bounding box или проверке пересечений в упрощённых координатных системах).


Геометрическая модель поворота

Пусть имеется точка в декартовой системе координат:

x, y

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

x’ = x · cos(θ) − y · sin(θ) y’ = x · sin(θ) + y · cos(θ)

Если поворот выполняется вокруг произвольной точки pivot (px, py), применяется последовательность:

  1. Сдвиг системы координат в начало: x = x − px y = y − py

  2. Применение матрицы поворота

  3. Возврат в исходную систему: x’ = x’ + px y’ = y’ + py

Эта схема используется во всех геометрических операциях поворота в Turf.js.


Функция transformRotate

В Turf.js поворот реализуется через модуль transform-rotate:

turf.transformRotate(geojson, angle, options)

Функция принимает GeoJSON-объект и возвращает новый объект с преобразованной геометрией.


Основные параметры

angle

Угол поворота в градусах.

  • положительное значение — вращение против часовой стрелки
  • отрицательное — по часовой стрелке

Turf.js работает в градусной системе, что важно при интеграции с географическими координатами WGS84.


options

pivot

Точка вращения. Формат:

[pivotX, pivotY]

Если не задан, используется центр bounding box геометрии.

mutate

Булевый флаг:

  • true — изменяет исходный объект
  • false — возвращает копию (поведение по умолчанию)

units (в некоторых версиях/расширениях)

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


Поворот точек (Point)

Для одиночной точки преобразование сводится к одной операции над координатами:

import { point } from "@turf/helpers";
import transformRotate from "@turf/transform-rotate";

const pt = point([30, 10]);

const rotated = transformRotate(pt, 45);

Точка вращается вокруг центра bounding box (в данном случае совпадающего с самой точкой), поэтому визуально координаты остаются неизменными. Реальный эффект проявляется при наличии pivot.


Поворот линий (LineString)

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

import { lineString } from "@turf/helpers";
import transformRotate from "@turf/transform-rotate";

const line = lineString([
  [0, 0],
  [10, 0],
  [10, 10]
]);

const rotatedLine = transformRotate(line, 30, {
  pivot: [0, 0]
});

При задании pivot в начале координат вся линия вращается как жёсткое тело, сохраняя геометрию сегментов.


Поворот полигонов (Polygon)

Polygon в GeoJSON состоит из внешнего кольца и внутренних колец (дыр). Поворот применяется ко всем координатам всех колец без изменения топологии.

import { polygon } from "@turf/helpers";
import transformRotate from "@turf/transform-rotate";

const poly = polygon([[
  [0, 0],
  [10, 0],
  [10, 10],
  [0, 10],
  [0, 0]
]]);

const rotatedPoly = transformRotate(poly, -45, {
  pivot: [5, 5]
});

Использование центра полигона как pivot сохраняет его положение в пространстве, меняя только ориентацию.


Выбор pivot и его влияние

Pivot определяет поведение всего преобразования.

Центр bounding box (по умолчанию)

Используется, когда pivot не указан. Алгоритм:

  • вычисляется минимальный прямоугольник, охватывающий геометрию
  • берётся его центр

Этот вариант подходит для визуальных трансформаций.


Геометрический центр вручную

Часто используется для симметричных операций:

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

Пример:

const rotated = transformRotate(geom, 90, {
  pivot: [100, 50]
});

Географический смысл pivot

В системах координат WGS84 pivot задаётся в долготе/широте. Это означает, что поворот выполняется в плоской проекции, что приводит к допустимым искажениям на больших масштабах.


Поведение с координатными системами

Turf.js работает в геодезической системе координат, но математические операции выполняются в евклидовой плоскости.

Следствия:

  • малые области: высокая точность
  • большие области: возможны искажения формы
  • полярные регионы: рост ошибок

При необходимости высокой точности используются проекционные преобразования до применения rotate.


Внутренний алгоритм transformRotate

Процесс обработки геометрии включает следующие этапы:

  1. Деконструкция GeoJSON в массив координат

  2. Вычисление pivot (если отсутствует)

  3. Итерация по каждой координате:

    • сдвиг относительно pivot
    • применение матрицы вращения
    • возврат координаты
  4. Сборка новой геометрии

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


Пример комплексного преобразования

import { featureCollection, point, lineString, polygon } from "@turf/helpers";
import transformRotate from "@turf/transform-rotate";

const fc = featureCollection([
  point([2, 3]),
  lineString([[0, 0], [5, 5]]),
  polygon([[[0, 0], [4, 0], [4, 4], [0, 4], [0, 0]]])
]);

const rotated = transformRotate(fc, 120, {
  pivot: [2, 2],
  mutate: false
});

FeatureCollection поддерживается напрямую: каждая вложенная геометрия обрабатывается рекурсивно.


Типичные ошибки при повороте геометрий

Неверный pivot

Использование pivot вне области данных приводит к смещению всей геометрии без ожидаемого центра вращения.


Игнорирование системы координат

Предположение о плоской метрике в градусной системе приводит к неправильной интерпретации расстояний после вращения.


Мутация исходных данных

При mutate: true исходный объект изменяется, что может нарушить цепочки геообработки.


Ожидание сохранения площади в глобальных координатах

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


Поворот в составе геообработки

Операция rotate часто используется как промежуточный шаг:

  • выравнивание объектов перед вычислением convex hull
  • подготовка данных для spatial clustering
  • нормализация ориентации перед сравнением геометрий
  • создание шаблонов симметричных структур

В связке с другими функциями Turf.js (buffer, centroid, transformScale) поворот формирует основу аффинных преобразований пространственных данных.