Геометрические данные в формате GeoJSON часто содержат избыточную детализацию: большое количество точек, несущественные изгибы, шум GPS-трека или результат конвертации из высокоточных источников. Упрощение линий применяется для уменьшения числа координат при сохранении общей формы объекта. Это критично для визуализации, хранения, ускорения пространственных операций и передачи данных по сети.
В Turf.js основным инструментом упрощения является функция
turf.simplify, реализующая алгоритм Дугласа–Пекера и его
модификации.
Линия в GeoJSON представляется как LineString —
последовательность координат:
{
"type": "LineString",
"coordinates": [
[30.5, 50.5],
[30.51, 50.51],
[30.52, 50.52]
]
}
Задача упрощения — удалить часть точек, сохранив форму, определяемую отклонением от исходной линии.
Ключевой принцип:
Алгоритм работает рекурсивно:
Формально упрощение контролируется параметром допуска:
d
где
d — расстояние точки до упрощаемого сегментаε — заданный порог упрощенияturf.simplify(geojson, options)
Параметры:
geojson — объект GeoJSON (LineString, Polygon,
Feature)options.tolerance — допустимое отклонениеoptions.highQuality — использование более точного, но
медленного алгоритмаoptions.mutate — изменение исходного объектаimport { lineString, simplify } from "@turf/turf";
const line = lineString([
[30.50, 50.50],
[30.51, 50.51],
[30.52, 50.52],
[30.60, 50.60],
[30.80, 50.70]
]);
const simplified = simplify(line, {
tolerance: 0.01,
highQuality: false,
mutate: false
});
При малом tolerance изменения будут минимальными, при
увеличении — количество точек резко сокращается.
tolerance задаёт максимальное допустимое отклонение
точки от исходной линии.
Особенности:
Типичная ошибка — использование слишком большого значения, приводящего к искажению формы объектов.
Пример влияния:
0.001 — лёгкое сглаживание0.01 — заметное упрощение0.1 — радикальная потеря деталейАлгоритм Дугласа–Пекера имеет оптимизации, ускоряющие вычисления, но иногда дающие менее точный результат.
simplify(line, {
tolerance: 0.01,
highQuality: true
});
Различия:
false — быстрее, используется упрощённая проверка
расстоянийtrue — точные вычисления, выше нагрузкаПри обработке больших массивов координат разница становится заметной.
Turf.js поддерживает полигоны, где важно сохранять замкнутость контура.
import { polygon, simplify } from "@turf/turf";
const poly = polygon([[
[30, 50],
[31, 50],
[31, 51],
[30, 51],
[30, 50]
]]);
const result = simplify(poly, {
tolerance: 0.02,
highQuality: true
});
Особенности:
При работе в Turf.js координаты рассматриваются как сферические (WGS84). Это означает, что расстояния не являются евклидовыми в строгом смысле.
Упрощение опирается на приближённые геодезические вычисления, что важно учитывать при больших масштабах:
Упрощение может затрагивать геометрические свойства:
При этом Turf.js старается сохранять:
GPS-треки часто содержат шум:
Пример исходного трека:
const track = lineString([
[30.1000, 50.1000],
[30.1001, 50.1002],
[30.1002, 50.1001],
[30.2000, 50.2000]
]);
После упрощения:
const clean = simplify(track, {
tolerance: 0.005
});
Результат:
Сложность алгоритма Дугласа–Пекера: