Буферизация геометрий в Turf.js реализуется через операцию расширения
пространственного объекта на заданное расстояние с формированием новой
геометрии. Для полигонов результатом становится новый полигон,
охватывающий исходную область с равномерным смещением границ наружу или
внутрь (при отрицательных значениях дистанции). Основной инструмент —
turf.buffer, который работает с любыми GeoJSON-объектами,
включая полигоны, мультиполигоны и линии, но именно для полигональных
структур эффект буферизации наиболее нагляден и часто используется в
геоаналитике.
Буфер представляет собой множественное смещение всех ребер полигона на заданное расстояние с последующим построением огибающей кривой. В плоской модели координат это сводится к операции параллельного смещения границ, однако в географических координатах (WGS84) применяется сферическая геометрия, что делает результат более корректным при больших масштабах.
Ключевая особенность Turf.js заключается в использовании геодезических вычислений: расстояние интерпретируется не как абстрактные единицы на плоскости, а как реальные метры, километры или мили, в зависимости от параметров вызова.
Функция буферизации вызывается через модуль @turf/turf
или отдельный пакет @turf/buffer:
import buffer from "@turf/buffer";
const buffered = buffer(geojson, distance, { units: "kilometers" });
Параметры:
geojson — исходная геометрия (Polygon, MultiPolygon,
LineString, Point)distance — расстояние буфера (число)options.units — единицы измерения расстоянияПоддерживаемые единицы:
Использование градусов приводит к плоскостной интерпретации, что допустимо только в локальных задачах без учета кривизны Земли.
import buffer from "@turf/buffer";
const polygon = {
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [[
[30.0, 50.0],
[30.5, 50.0],
[30.5, 50.5],
[30.0, 50.5],
[30.0, 50.0]
]]
}
};
const expanded = buffer(polygon, 5, { units: "kilometers" });
Результирующий объект сохраняет структуру Feature Polygon, но координаты образуют новую границу, отстоящую от исходной на 5 километров.
Передача отрицательного значения дистанции приводит к «сжатию» полигона:
const shrunken = buffer(polygon, -2, { units: "kilometers" });
При достаточно большом отрицательном значении возможна деградация геометрии вплоть до исчезновения объекта, если внутренние области полигона полностью перекрываются.
Turf.js использует два подхода к вычислению буфера:
Геодезический буфер (по умолчанию) Основан на сферической модели Земли. Обеспечивает корректность на больших расстояниях и при работе в глобальных координатах.
Плоский буфер Используется при
units: "degrees". Все операции выполняются в декартовой
системе координат без учета кривизны.
Различие становится критичным при масштабах более нескольких десятков километров, особенно в высоких широтах.
Буферизация полигона зависит от его топологии:
Пример полигона с отверстием:
const polygonWithHole = {
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [
[
[0, 0],
[10, 0],
[10, 10],
[0, 10],
[0, 0]
],
[
[3, 3],
[7, 3],
[7, 7],
[3, 7],
[3, 3]
]
]
}
};
Буферизация расширяет внешний контур и внутренний «вырез», сохраняя структуру отверстия.
При вычислении буфера могут возникать геометрические артефакты:
Turf.js использует внутренние алгоритмы сглаживания и построения оффсетов, однако сложные полигоны с большим числом вершин могут приводить к нестабильной геометрии.
Параметр steps определяет количество сегментов при
аппроксимации окружностей:
const smoothBuffer = buffer(polygon, 5, {
units: "kilometers",
steps: 64
});
Чем выше значение steps, тем более гладкой становится
граница буфера, особенно заметно при малых полигонах и больших
расстояниях. Низкие значения приводят к угловатым, многоугольным
контурам.
Буферизация является вычислительно затратной операцией, особенно при:
stepsВнутренние вычисления включают тригонометрические функции и построение смещенных сегментов, поэтому обработка больших наборов данных требует предварительной оптимизации геометрии.
Практическое ускорение достигается через:
stepsMultiPolygon обрабатывается как набор независимых полигонов, каждый из которых получает собственный буфер:
const multi = {
type: "Feature",
geometry: {
type: "MultiPolygon",
coordinates: [
[[[0,0],[2,0],[2,2],[0,2],[0,0]]],
[[[5,5],[7,5],[7,7],[5,7],[5,5]]]
]
}
};
const result = buffer(multi, 1, { units: "kilometers" });
Если буферы пересекаются, итоговая геометрия может быть объединена в единый полигон.
Буферы полигонов применяются в задачах пространственного анализа:
Буфер позволяет трансформировать дискретные геометрии в непрерывные
зоны влияния, что критично для последующего анализа пересечений через
turf.intersect и turf.union.
Буферизация часто используется как промежуточный шаг в цепочках пространственных операций:
Пример цепочки:
import buffer from "@turf/buffer";
import intersect from "@turf/intersect";
const zone = buffer(polygon, 10, { units: "kilometers" });
const overlap = intersect(zone, anotherPolygon);
Turf.js предполагает использование WGS84 (EPSG:4326). При подаче данных в других системах координат результат буферизации становится некорректным без предварительной репроекции.
Особенно критично это для локальных систем координат, где единицы измерения не соответствуют градусам.
На практике часто возникают следующие проблемы:
steps, приводящее к деградации
производительности