Векторные геометрические данные, полученные из GPS-треков, оцифровки карт или сенсорных систем, часто содержат избыточное количество координат. Ломаные линии и полигоны могут включать тысячи точек, значительная часть которых не влияет на форму объекта.
Избыточные вершины приводят к ряду проблем:
Библиотека Turf.js предоставляет набор алгоритмов для упрощения геометрии, ключевой из которых является реализация алгоритма Дугласа–Пекера.
Основой большинства методов уменьшения количества вершин служит алгоритм Ramer–Douglas–Peucker. Его идея заключается в рекурсивном удалении точек, которые находятся на расстоянии меньше заданного порога от аппроксимирующего отрезка.
Формально критерий удаления точки основан на перпендикулярной дистанции:
d_{} <
где:
Чем больше значение ( ), тем сильнее упрощение и тем меньше остаётся вершин.
В Turf.js базовая функция упрощения геометрии реализована через
turf.simplify.
import * as turf from "@turf/turf";
const line = turf.lineString([
[0, 0],
[0.1, 0.01],
[0.2, 0.02],
[1, 1],
[2, 2]
]);
const simplified = turf.simplify(line, {
tolerance: 0.05,
highQuality: false,
mutate: false
});
Параметр tolerance определяет максимальное допустимое
отклонение исходной геометрии от упрощённой.
Геометрическая интерпретация:
2 * tolerance вокруг базовой линии.Опция highQuality переключает алгоритм на более точный,
но более медленный вариант.
false — используется оптимизированная версия с меньшей
точностью вычисления расстояний;true — применяется более строгая проверка отклонений,
обеспечивающая лучшее сохранение формы.Разница особенно заметна на геометриях с большим количеством изгибов, где стандартная версия может давать более грубую аппроксимацию.
Параметр mutate контролирует, изменяется ли исходный
объект:
mutate: false — создаётся новая геометрия;mutate: true — исходный объект модифицируется на
месте.Использование мутации уменьшает нагрузку на память, но требует осторожности при работе с неизменяемыми структурами данных и реактивными фреймворками.
Для ломаных линий алгоритм удаляет промежуточные точки, не влияющие на общую траекторию.
const route = turf.lineString(coords);
const simplifiedRoute = turf.simplify(route, { tolerance: 0.01 });
Типичный сценарий — GPS-треки, маршруты транспорта, движения объектов.
При упрощении полигонов важно сохранять топологическую целостность. Turf.js учитывает замкнутость кольца и не допускает разрыва контуров.
const polygon = turf.polygon([ringCoords]);
const simplifiedPolygon = turf.simplify(polygon, {
tolerance: 0.02
});
Особенности:
Для составных геометрий упрощение применяется к каждому элементу отдельно.
const multi = turf.multiLineString([line1, line2]);
const result = turf.simplify(multi, { tolerance: 0.05 });
Уменьшение числа вершин неизбежно изменяет исходную форму объекта. Основные эффекты:
Изменение длины можно выразить как:
L = L_{original} - L_{simplified}
где разница зависит от степени агрессивности упрощения.
Поведение алгоритма зависит не только от tolerance, но и от распределения точек.
Перед применением simplify часто выполняется очистка
геометрии:
Такая подготовка снижает риск искажений и повышает стабильность результата.
Простейший способ уменьшения количества вершин — удаление точек через фиксированный шаг:
const reduced = coords.filter((_, i) => i % 2 === 0);
Недостатки такого подхода:
В отличие от этого, turf.simplify использует
геометрический критерий расстояния, а не индексную выборку.
На плавных кривых алгоритм сохраняет ключевые экстремумы, удаляя промежуточные точки. На прямых участках почти все внутренние точки исчезают, так как отклонение от сегмента минимально.
Критическими точками считаются:
Алгоритм работает в плоской декартовой модели. При использовании географических координат (longitude/latitude) возможны искажения из-за кривизны Земли.
Для повышения точности применяется:
@turf/projection.При обработке геометрий с десятками тысяч точек основная нагрузка возникает на вычислении расстояний от точек до сегментов.
Оптимизации включают:
Упрощение часто используется как предварительный этап перед:
turf.length);turf.buffer);turf.booleanIntersects);Снижение количества вершин напрямую улучшает стабильность и скорость этих операций.