Работа библиотек геоаналитики в JavaScript строится вокруг стандарта
GeoJSON и системы координат WGS84. В Turf.js все пространственные
операции выполняются в плоскости сферической модели Земли, где
координаты задаются в формате [долгота, широта] в
градусах.
Такой подход определяет ключевое ограничение: любые преобразования координат не являются классическими декартовыми операциями. Вместо этого используются геодезические расчёты, учитывающие кривизну Земли, расстояния по дуге и азимуты.
Координатные преобразования в Turf.js делятся на несколько категорий:
Все геометрии представлены в формате GeoJSON:
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [lng, lat]
}
}
Ключевой момент: порядок координат строго фиксирован — сначала долгота, затем широта. Ошибка в порядке приводит к смещению точек на тысячи километров.
Turf.js не выполняет проекционные преобразования между системами координат (например, EPSG:3857 ↔︎ EPSG:4326). Библиотека работает исключительно в WGS84 и применяет сферическую геометрию для расчётов расстояний и направлений.
Перенос в Turf.js реализуется через функцию
transformTranslate. Операция заключается в смещении
геометрии на заданное расстояние вдоль заданного азимута.
Перенос определяется тремя параметрами:
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 использует сферическую модель:
Это делает результат корректным даже на больших расстояниях, где плоская геометрия даёт значительные искажения.
Поворот реализуется через функцию transformRotate. В
отличие от переноса, вращение требует опорной точки (pivot),
относительно которой выполняется преобразование.
Поворот каждой точки выполняется по схеме:
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 играет ключевую роль: при его смещении изменяется вся структура результата.
Функция 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 позволяет комбинировать операции:
Порядок операций критически влияет на результат, поскольку каждая трансформация изменяет систему координат.
Многие функции 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-й меридиан.
Направление задаётся в градусах:
Значения могут выходить за пределы 0–360°, при этом выполняется нормализация угла.
При малых расстояниях (до нескольких километров) погрешность минимальна. Однако при увеличении масштаба:
Turf.js ориентирован на прикладные задачи GIS, а не на высокоточные геодезические расчёты уровня специализированных систем.
Трансформации используются в задачах:
Например, последовательное применение transformTranslate
позволяет моделировать траекторию движения объекта по карте.
Координатные преобразования часто комбинируются с:
buffer (создание зон вокруг объектов)bbox (ограничивающие прямоугольники)centroid (опорные точки)distance (расстояния между объектами)Такая комбинация позволяет строить сложные геопространственные модели без использования внешних GIS-систем.
Особое внимание требуется при работе с:
В этих случаях Turf.js применяет нормализацию координат, чтобы сохранить валидность GeoJSON и избежать разрывов геометрии.
При многократном применении трансформаций возникает эффект накопления погрешности.
Например:
Каждая итерация усиливает геодезические искажения, что особенно заметно в сложных геометриях с большим числом вершин.
Все операции предполагают, что входные данные находятся в WGS84. Попытка применять Turf.js к уже проецированным данным (например, Web Mercator в метрах) приводит к некорректным результатам, так как алгоритмы интерпретируют значения как градусы.
Это принципиальное ограничение архитектуры библиотеки и причина, по которой Turf.js часто используется совместно с другими GIS-инструментами для предварительной репроекции данных.