Основные возможности библиотеки

Turf.js работает поверх стандарта GeoJSON и рассматривает все пространственные объекты как геометрические примитивы:

  • Point — точка (координата)
  • LineString — линия (последовательность точек)
  • Polygon — полигон (замкнутая область)
  • FeatureCollection — набор объектов

Ключевая особенность модели — строгое соответствие GeoJSON-структурам. Любая функция Turf.js принимает и возвращает валидные GeoJSON-объекты, что обеспечивает совместимость с картографическими библиотеками (Mapbox GL, Leaflet, OpenLayers).

Пример точки:

const point = turf.point([30.5, 50.5]);

Пример полигона:

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

Измерение расстояний и площадей

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

Расстояние между точками

Функция distance рассчитывает геодезическое расстояние:

const from = turf.point([30.5, 50.5]);
const to = turf.point([30.6, 50.6]);

const dist = turf.distance(from, to, { units: 'kilometers' });

Особенности:

  • учитывается кривизна Земли
  • поддерживаются единицы измерения: kilometers, miles, meters, degrees

Площадь полигона

const area = turf.area(polygon);

Ключевой момент: площадь вычисляется на сфере, а не в плоской проекции, что критично для больших территорий.


Работа с линиями и маршрутами

Turf.js предоставляет инструменты для анализа линейных объектов.

Длина линии

const line = turf.lineString([
  [30, 50],
  [30.5, 50.5],
  [31, 51]
]);

const length = turf.length(line, { units: 'kilometers' });

Сегментация линий

Разбиение линии на равные части:

const segments = turf.lineChunk(line, 5, { units: 'kilometers' });

Применение:

  • маршрутизация
  • анализ дорожных сетей
  • георазметка

Геометрические преобразования

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

Сдвиг (translate)

const moved = turf.transformTranslate(point, 10, 90, { units: 'kilometers' });

Масштабирование (scale)

const scaled = turf.transformScale(polygon, 2);

Поворот (rotate)

const rotated = turf.transformRotate(polygon, 45);

Особенность: все трансформации выполняются в географических координатах с учетом сферической модели.


Буферизация пространственных объектов

Буферизация — создание зоны вокруг объекта на заданном расстоянии.

const buffer = turf.buffer(point, 5, { units: 'kilometers' });

Используется для:

  • определения зон доступности
  • анализа влияния объектов
  • построения охранных зон

Алгоритм учитывает кривизну поверхности Земли, что отличает Turf.js от простых геометрических библиотек.


Пространственные операции над полигонами

Пересечение (intersection)

const intersect = turf.intersect(polygonA, polygonB);

Возвращает область пересечения двух полигонов или null, если пересечения нет.

Объединение (union)

const union = turf.union(polygonA, polygonB);

Разность (difference)

const diff = turf.difference(polygonA, polygonB);

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


Работа с точечными данными и статистикой

Центроид

const center = turf.center(polygon);

Центроид может находиться вне геометрии, особенно у вогнутых фигур.

Геометрический центр масс

const centroid = turf.centroid(polygon);

Bounding box

const bbox = turf.bbox(polygon);
const bboxPolygon = turf.bboxPolygon(bbox);

Применение:

  • оптимизация отображения карты
  • кластеризация данных
  • индексирование

Кластеризация точек

Turf.js поддерживает группировку точек по пространственной близости.

const clustered = turf.clustersKmeans(points, {
  numberOfClusters: 3
});

Результат: каждая точка получает свой кластерный индекс.

Дополнительные алгоритмы:

  • DBSCAN
  • hierarchical clustering (через расширения)

Пространственные запросы и фильтрация

Проверка попадания точки в полигон

const inside = turf.booleanPointInPolygon(point, polygon);

Пересечение линий

const crosses = turf.booleanCrosses(line1, line2);

Совпадение геометрий

const equal = turf.booleanEqual(poly1, poly2);

Особенность: все проверки основаны на строгих геометрических правилах, а не на визуальном совпадении координат.


Генерация геометрических данных

Turf.js может создавать синтетические наборы пространственных объектов.

Сетка точек

const grid = turf.pointGrid([-180, -85, 180, 85], 100, {
  units: 'kilometers'
});

Случайные точки

const randomPoints = turf.randomPoint(100, {
  bbox: [30, 50, 31, 51]
});

Использование:

  • тестирование систем
  • моделирование распределений
  • нагрузочные сценарии

Интерполяция и работа с поверхностями

Интерполяция (IDW / Kriging через расширения)

const interpolated = turf.interpolate(points, 1, {
  gridType: 'points',
  property: 'temperature'
});

Triangulation

const tin = turf.tin(points, 'value');

Назначение:

  • построение тепловых карт
  • моделирование высот
  • анализ плотности данных

Обработка координатных систем и нормализация

Turf.js работает в WGS84 (EPSG:4326). Все операции предполагают:

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

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


Оптимизация и производительность

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

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

Рекомендованные подходы:

  • предварительное упрощение геометрии (simplify)
  • разбиение FeatureCollection на части
  • использование bbox-фильтрации перед точными операциями
const simplified = turf.simplify(polygon, {
  tolerance: 0.01,
  highQuality: true
});

Работа с наборами данных FeatureCollection

FeatureCollection — основной контейнер для массовых операций.

const features = turf.featureCollection([
  turf.point([30, 50]),
  turf.point([31, 51])
]);

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


Композиция операций и функциональный стиль

Turf.js ориентирован на композицию функций:

const result = turf.buffer(
  turf.centroid(polygon),
  10,
  { units: 'kilometers' }
);

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