Геопространственные данные в формате GeoJSON представляют объекты в виде координат на сфере (WGS84), где операции с формой объекта требуют учета кривизны Земли и особенностей проекции. В таких условиях классические матричные преобразования из линейной алгебры адаптируются к сферической геометрии, но сохраняют фундаментальную структуру: преобразование координат через операции смещения, масштабирования и вращения.
В библиотеке Turf.js геометрические трансформации реализованы через функции высокого уровня, которые инкапсулируют математические преобразования и учитывают особенности геодезической системы координат. Понимание матричной модели преобразований позволяет интерпретировать работу этих функций как последовательность операций над координатными векторами.
Для описания преобразований в пространстве используется расширение координат до однородного вида. Точка в двумерном пространстве представляется как вектор:
(x, y) → (x, y, 1)
Такое представление позволяет выразить аффинные преобразования через умножение матриц:
| x' | | a b tx | | x |
| y' | = | c d ty | × | y |
| 1 | | 0 0 1 | | 1 |
Где:
Преимущество однородных координат заключается в унификации всех базовых преобразований в одну матричную операцию.
Смещение точки в пространстве задается матрицей:
| 1 0 tx |
| 0 1 ty |
| 0 0 1 |
Перенос не изменяет форму объекта, а только изменяет его позицию.
Масштабирование относительно начала координат:
| sx 0 0 |
| 0 sy 0 |
| 0 0 1 |
Где sx и sy задают коэффициенты изменения масштаба по осям.
Вращение на угол θ:
| cosθ -sinθ 0 |
| sinθ cosθ 0 |
| 0 0 1 |
Угол задается в радианах, что критично для геодезических вычислений.
В отличие от классической евклидовой геометрии, Turf.js оперирует координатами в градусах широты и долготы. Это накладывает ограничения:
Поэтому матричные преобразования в Turf.js реализуются не напрямую, а через геодезические формулы, приближенно эквивалентные аффинным операциям в локальных областях.
Функция вращения реализуется через пересчет координат относительно центра:
turf.transformRotate(geojson, angle, options);
Внутренне операция эквивалентна:
Композиция:
P' = T × R × T⁻¹ × P
Где P — вектор координат объекта.
Ключевая особенность заключается в том, что центр вращения задает точку декомпозиции матричной цепочки.
turf.transformScale(geojson, factor, options);
Масштабирование в геопространственном контексте выполняется относительно центра масс или указанной точки. Формально:
P' = T × S × T⁻¹ × P
Где S — матрица масштабирования.
При этом Turf.js компенсирует сферическое искажение, используя геодезическое расстояние вместо линейного евклидового.
turf.transformTranslate(geojson, distance, bearing, options);
Перенос в географическом смысле не является простым добавлением dx и dy. Вместо этого используется:
Фактически операция соответствует преобразованию вдоль геодезической линии, что можно интерпретировать как нелинейный аналог матрицы переноса.
При последовательном применении преобразований используется умножение матриц, где порядок имеет критическое значение.
Если заданы операции:
то итоговая трансформация:
P' = T × R × S × P
Перестановка множителей изменяет результат, так как матричное умножение не коммутативно.
В геопространственных вычислениях это проявляется особенно явно: изменение порядка операций может приводить к смещению объекта на десятки километров.
Для корректного применения матриц в Turf.js часто используется стратегия локализации:
Математически это выражается как:
P_local = T⁻¹ × P_global
P_transformed = M × P_local
P_result = T × P_transformed
Где M — композиция матриц преобразований.
Важным элементом является выбор центра трансформации. В Turf.js применяются:
Этот выбор определяет матрицы T и T⁻¹ и влияет на конечный результат.
При вращении полигона вокруг центра:
С точки зрения линейной алгебры:
[x', y'] = R × ([x, y] - [cx, cy]) + [cx, cy]
При масштабировании:
Матричная интерпретация:
P' = S × (P - C) + C
В отличие от классического переноса:
Это можно рассматривать как нелинейное преобразование, аналогичное экспоненциальному отображению на сфере.
Применение матриц в геопространственной области сталкивается с фундаментальными ограничениями:
Поэтому Turf.js использует гибридный подход: матричная модель применяется локально, а глобальные операции выполняются через геодезические алгоритмы.
Любое преобразование GeoJSON-геометрии можно представить как композицию операторов:
F(P) = T × R × S × G(P)
Где:
Эта модель позволяет рассматривать Turf.js как систему, в которой геометрические операции сводятся к последовательности матричных и геодезических преобразований над векторными представлениями координат.
Каждая координата GeoJSON может быть представлена как вектор:
P = [longitude, latitude, 1]
А вся геометрия — как набор таких векторов. Тогда любая функция трансформации в Turf.js эквивалентна применению набора матриц к множеству векторов с последующей нормализацией обратно в географическую систему координат.
Матричные преобразования тесно связаны с другими операциями:
Во всех случаях геометрические операции можно интерпретировать как трансформации вектора координат в пространстве с последующей агрегацией результатов.
Несмотря на сферическую природу координат, большинство алгоритмов Turf.js опирается на принцип локальной линейности:
Это позволяет использовать аппарат линейной алгебры без полной потери геодезической корректности в ограниченных диапазонах.