Выпуклая оболочка (convex hull) множества точек на плоскости — это наименьший выпуклый многоугольник, который содержит все исходные точки. Геометрически она может быть представлена как «резиновая оболочка», натянутая вокруг набора точек: после отпускания она принимает форму выпуклого контура, охватывающего крайние элементы множества.
Для любого конечного множества точек результатом построения выпуклой оболочки всегда является выпуклый многоугольник, вершины которого являются подмножеством исходных точек.
Выпуклость означает, что для любых двух точек внутри области отрезок, соединяющий их, целиком лежит внутри этой области.
Основные свойства выпуклой оболочки:
В геоинформационных системах выпуклая оболочка часто используется для грубой аппроксимации территории, кластеров точек или границ распределения объектов.
Построение выпуклой оболочки — классическая задача вычислительной геометрии. Наиболее распространённые алгоритмы:
Сложность оптимальных решений обычно составляет
O(n log n) из-за необходимости сортировки.
В библиотеке Turf.js построение выпуклой оболочки реализуется через
функцию turf.convex, работающую с GeoJSON-структурами.
Функция принимает набор геометрий и возвращает полигон, представляющий выпуклую оболочку.
Основная сигнатура:
turf.convex(featureCollection, options)
Входные данные для turf.convex должны соответствовать
спецификации GeoJSON.
Пример структуры:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [10.0, 50.0]
},
"properties": {}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [12.0, 52.0]
},
"properties": {}
}
]
}
Координаты интерпретируются как [longitude, latitude],
что критично для корректных географических вычислений.
import * as turf from "@turf/turf";
const points = turf.featureCollection([
turf.point([0, 0]),
turf.point([2, 0]),
turf.point([1, 2]),
turf.point([1, 1]),
turf.point([0.5, 0.5])
]);
const hull = turf.convex(points);
console.log(JSON.stringify(hull, null, 2));
Результатом будет GeoJSON Polygon, охватывающий крайние точки множества.
Результат выпуклой оболочки зависит не от количества точек, а от их геометрического распределения:
Функция turf.convex поддерживает дополнительные
параметры:
turf.convex(points, {
concavity: 2
});
Хотя базовая реализация ориентирована на выпуклую оболочку, параметры могут использоваться в расширенных версиях или кастомных сборках, влияя на поведение алгоритма обработки геометрии.
В стандартной версии Turf.js основной параметр — входной набор точек.
При работе с выпуклой оболочкой возникают граничные ситуации:
Если все точки лежат на одной прямой, результатом будет линия, а не полигональная оболочка.
Повторяющиеся точки автоматически игнорируются в процессе вычислений или не влияют на форму результата, но могут увеличивать время обработки.
Основные характеристики производительности
turf.convex:
O(n log n)O(n)На практике производительность зависит от:
При работе с большими наборами данных (десятки тысяч точек) рекомендуется предварительная фильтрация или кластеризация.
Выпуклая оболочка в Turf.js применяется для:
В задачах пространственного анализа она часто используется как первый шаг перед более точными методами, такими как concave hull или кластеризация DBSCAN.
Выпуклая оболочка имеет ряд ограничений:
Несмотря на это, вычислительная простота делает её удобной для предварительного анализа и визуализации.
В экосистеме Turf.js выпуклая оболочка часто используется вместе с:
turf.buffer — расширение границ после построения
оболочкиturf.dissolve — объединение геометрий перед вычислением
оболочкиturf.center — определение центра массы точек внутри
оболочкиturf.bbox — вычисление ограничивающего
прямоугольникаЭти операции позволяют формировать комплексные геопространственные пайплайны обработки данных.