Turf.js предоставляет набор геопространственных операций над GeoJSON-геометриями, среди которых буферизация занимает ключевое место. Буферизация в геометрическом смысле означает построение новой области вокруг исходного объекта на заданном расстоянии. В стандартном сценарии это расширение полигона или линии, однако поддержка отрицательных значений дистанции переводит операцию в режим «сжатия» геометрии.
Операция буферизации реализуется через функцию
turf.buffer. Входными данными служит GeoJSON-объект (точка,
линия, полигон), а результатом — новый полигон, описывающий область на
заданном расстоянии от исходной геометрии.
Базовая сигнатура:
turf.buffer(geojson, distance, { units })
geojson — исходная геометрияdistance — расстояние буфераunits — единицы измерения (meters,
kilometers, degrees, miles и
др.)Геометрическая операция выполняется с использованием сферических вычислений, что позволяет учитывать кривизну Земли при работе с реальными координатами.
Отрицательный буфер задаётся передачей отрицательного значения
параметра distance:
import buffer from "@turf/buffer";
const polygon = {
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [
[
[30, 10],
[40, 10],
[40, 20],
[30, 20],
[30, 10]
]
]
}
};
const shrunken = buffer(polygon, -1, { units: "kilometers" });
Отрицательное значение интерпретируется как операция эрозии (geometric erosion): границы полигона смещаются внутрь на заданное расстояние.
При этом алгоритм фактически повторяет логику положительного буфера, но с инвертированным направлением смещения границ.
Применение отрицательного буфера приводит к ряду устойчивых геометрических эффектов:
Каждая грань полигона смещается внутрь параллельно самой себе. В результате площадь уменьшается нелинейно, особенно у фигур с острыми углами.
Острые углы становятся более округлыми, поскольку алгоритм строит дуги при пересечении смещённых границ.
Если расстояние отрицательного буфера превышает минимальную «толщину»
полигона, объект может полностью исчезнуть, возвращая null
или пустую геометрию.
Для MultiPolygon отдельные части могут исчезать
независимо друг от друга, если их локальная ширина недостаточна.
Внутри Turf.js буферизация основана на построении смещённых линий (offset curves) с последующим объединением результатов через операции объединения полигонов.
Процесс включает:
При отрицательном буфере направление нормалей к сегментам инвертируется, что приводит к смещению внутрь геометрии.
Отрицательный буфер используется для удаления краевых эффектов в пространственных данных:
const cleanPolygon = buffer(rawPolygon, -0.5, { units: "kilometers" });
Такой подход позволяет устранить «шум» по границам административных или природных объектов.
При работе с пересечениями геометрий часто требуется исключить пограничные области:
const innerZone = buffer(zone, -2, { units: "kilometers" });
Это уменьшает вероятность ложных пересечений из-за неточностей координат.
Отрицательная буферизация аналогична операции эрозии в растровой морфологии. Векторная реализация позволяет применять её к полигонам:
Вогнутые формы чувствительны к отрицательным буферам: внутренние области могут схлопываться раньше внешних границ.
При сильной эрозии возможно возникновение самопересечений, которые Turf.js пытается нормализовать через геометрические операции упрощения.
В полигонах с отверстиями (holes) внутренние кольца могут расширяться относительно внешнего контура при определённых конфигурациях отрицательного буфера, что приводит к исчезновению отверстий.
Корректность отрицательной буферизации зависит от выбранных единиц измерения:
meters и kilometers — наиболее точные для
реальных координатdegrees — используется в плоских координатных системах,
приводит к искажениям на больших масштабахmiles — эквивалент километровой логики, но с иной
шкалойПри глобальных данных (широта/долгота) важно учитывать, что геодезическая модель приводит к неравномерному влиянию отрицательного буфера в разных широтах.
Отрицательная буферизация является более чувствительной к ошибкам вычислений, чем положительная:
При последовательных операциях:
buffer(buffer(buffer(polygon, -1), -1), -1)
возможна быстрая деградация геометрии вплоть до исчезновения объекта.
Отрицательный буфер часто применяется перед вычислением пересечений для стабилизации результата:
const safeA = buffer(A, -0.2, { units: "kilometers" });
const safeB = buffer(B, -0.2, { units: "kilometers" });
const overlap = intersection(safeA, safeB);
Используется для создания внутренних областей перед вычитанием:
const inner = buffer(polygon, -1, { units: "kilometers" });
const result = difference(polygon, inner);
В сочетании с упрощением геометрии отрицательная буферизация позволяет контролировать количество вершин до и после трансформации.
Геометрическое поведение всегда определяется комбинацией сферической модели, алгоритма смещения границ и последующей нормализации полигонов.