Трансформация координат

Работа библиотек геоаналитики в JavaScript строится вокруг стандарта GeoJSON и системы координат WGS84. В Turf.js все пространственные операции выполняются в плоскости сферической модели Земли, где координаты задаются в формате [долгота, широта] в градусах.

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

Координатные преобразования в Turf.js делятся на несколько категорий:

  • геометрические трансформации (перенос, поворот, масштабирование)
  • вычисление новых точек по направлению и расстоянию
  • преобразования наборов геометрий (FeatureCollection)
  • операции с опорной точкой (pivot-based transformations)

Геометрическая модель координат в Turf.js

Все геометрии представлены в формате GeoJSON:

{
  type: "Feature",
  geometry: {
    type: "Point",
    coordinates: [lng, lat]
  }
}

Ключевой момент: порядок координат строго фиксирован — сначала долгота, затем широта. Ошибка в порядке приводит к смещению точек на тысячи километров.

Turf.js не выполняет проекционные преобразования между системами координат (например, EPSG:3857 ↔︎ EPSG:4326). Библиотека работает исключительно в WGS84 и применяет сферическую геометрию для расчётов расстояний и направлений.


Перенос координат (Translation)

Перенос в Turf.js реализуется через функцию transformTranslate. Операция заключается в смещении геометрии на заданное расстояние вдоль заданного азимута.

Базовая модель переноса

Перенос определяется тремя параметрами:

  • расстояние (в километрах, милях и др.)
  • направление (bearing в градусах)
  • исходная геометрия

Пример использования

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

const p = point([30.5, 50.5]);

const moved = transformTranslate(p, 10, 90, {
  units: "kilometers"
});

Здесь точка смещается на 10 км строго на восток (90°).


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

В отличие от простого прибавления координат, Turf.js использует сферическую модель:

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

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


Поворот координат (Rotation)

Поворот реализуется через функцию transformRotate. В отличие от переноса, вращение требует опорной точки (pivot), относительно которой выполняется преобразование.

Математическая модель

Поворот каждой точки выполняется по схеме:

  1. перенос точки в систему координат с центром в pivot
  2. применение угла поворота
  3. обратный перенос

Пример

import { polygon, transformRotate } from "@turf/turf";

const poly = polygon([[
  [30, 50],
  [31, 50],
  [31, 51],
  [30, 50]
]]);

const rotated = transformRotate(poly, 45, {
  pivot: [30.5, 50.5]
});

Особенности поворота в геодезической системе

Поворот в Turf.js не является чисто евклидовым:

  • используется локальная аппроксимация плоскости
  • при малых объектах искажения минимальны
  • при больших полигонах возможны отклонения формы

Pivot играет ключевую роль: при его смещении изменяется вся структура результата.


Масштабирование координат (Scaling)

Функция transformScale выполняет увеличение или уменьшение геометрии относительно центра.

Общая формула масштабирования

x’ = c_x + (x - c_x) k

где:

  • c_x — координата центра
  • k — коэффициент масштабирования

Аналогично для координаты y.

Пример

import { polygon, transformScale } from "@turf/turf";

const poly = polygon([[
  [30, 50],
  [31, 50],
  [31, 51],
  [30, 50]
]]);

const scaled = transformScale(poly, 2, {
  center: [30.5, 50.5]
});

Центр масштабирования

При отсутствии явного центра используется центроид геометрии. Это может приводить к неожиданным смещениям при асимметричных полигонах.

Центроид вычисляется как геометрический баланс точек, а не как визуальный центр.


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

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

  • сначала перенос
  • затем поворот
  • затем масштабирование

Порядок операций критически влияет на результат, поскольку каждая трансформация изменяет систему координат.


Трансформация FeatureCollection

Многие функции Turf.js поддерживают работу не только с одиночными геометриями, но и с коллекциями:

import { featureCollection, transformTranslate } from "@turf/turf";

const fc = featureCollection([
  point([30, 50]),
  point([31, 51])
]);

const moved = transformTranslate(fc, 5, 180);

Каждая геометрия внутри коллекции преобразуется независимо, но с одинаковыми параметрами трансформации.


Ограничения геометрических преобразований

Координатные трансформации в Turf.js имеют ряд системных ограничений:

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

Особенно заметны эффекты при работе с объектами, охватывающими большие территории (страны, континенты).


Геодезические вычисления в трансформациях

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

При переносе точки учитываются:

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

Это позволяет корректно рассчитывать положение точки на поверхности сферы, включая пересечение меридианов и переход через 180-й меридиан.


Работа с направлением (bearing)

Направление задаётся в градусах:

  • 0° — север
  • 90° — восток
  • 180° — юг
  • 270° — запад

Значения могут выходить за пределы 0–360°, при этом выполняется нормализация угла.


Влияние масштаба на точность

При малых расстояниях (до нескольких километров) погрешность минимальна. Однако при увеличении масштаба:

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

Turf.js ориентирован на прикладные задачи GIS, а не на высокоточные геодезические расчёты уровня специализированных систем.


Преобразование координат в аналитических задачах

Трансформации используются в задачах:

  • моделирование зон покрытия
  • расчёт смещённых геометрий (buffers + offset)
  • симуляция движения объектов
  • генерация географических сценариев

Например, последовательное применение transformTranslate позволяет моделировать траекторию движения объекта по карте.


Связь трансформаций с геометрическими операциями

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

  • buffer (создание зон вокруг объектов)
  • bbox (ограничивающие прямоугольники)
  • centroid (опорные точки)
  • distance (расстояния между объектами)

Такая комбинация позволяет строить сложные геопространственные модели без использования внешних GIS-систем.


Поведение трансформаций на границах координат

Особое внимание требуется при работе с:

  • пересечением 180° меридиана
  • полярными областями
  • объектами, пересекающими экватор

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


Итеративные преобразования

При многократном применении трансформаций возникает эффект накопления погрешности.

Например:

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

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


Взаимодействие с исходной системой координат

Все операции предполагают, что входные данные находятся в WGS84. Попытка применять Turf.js к уже проецированным данным (например, Web Mercator в метрах) приводит к некорректным результатам, так как алгоритмы интерпретируют значения как градусы.

Это принципиальное ограничение архитектуры библиотеки и причина, по которой Turf.js часто используется совместно с другими GIS-инструментами для предварительной репроекции данных.