Гексагональная сетка в геопространственных приложениях используется для дискретизации поверхности на равные по площади ячейки с шестиугольной геометрией. В Turf.js этот инструмент реализован через функцию, которая строит регулярную сетку из шестиугольников внутри заданного ограничивающего прямоугольника (bounding box). Такой подход часто применяется в аналитике плотности событий, агрегации точек, построении heatmap-подобных структур и оптимизации пространственных запросов.
Гексагональная сетка представляет собой регулярное разбиение плоскости, в котором каждая ячейка имеет форму правильного шестиугольника. В отличие от квадратной сетки, шестиугольники обладают рядом геометрических преимуществ:
В Turf.js генерация такой структуры выполняется с учётом заданного масштаба ячейки и географических единиц измерения.
Функция построения гексагональной сетки имеет следующий базовый вид:
turf.hexGrid(bbox, cellSide, options)
bbox Ограничивающий прямоугольник, задаваемый массивом:
[minX, minY, maxX, maxY]
Координаты обычно представлены в системе WGS84 (долгота/широта), если не используется проекция.
cellSide Размер стороны гексагона. Это ключевой параметр, определяющий плотность сетки. Чем меньше значение, тем более детализированной становится сетка.
options Объект дополнительных настроек:
units — единицы измерения (kilometers,
miles, meters, degrees);properties — свойства, которые будут добавлены ко всем
ячейкам;mask — полигон, ограничивающий область генерации
сетки.Гексагональная сетка строится на основе геометрических зависимостей между стороной шестиугольника и радиусом описанной окружности.
Для правильного шестиугольника:
√3 * a;2a,
где a — длина стороны.Turf.js абстрагирует эти вычисления, позволяя задавать только
cellSide, а пересчёт в географические координаты
выполняется внутри библиотеки с учётом выбранных единиц измерения.
Генерация гексагональной сетки в Turf.js выполняется поэтапно:
Нормализация входного bbox Координаты приводятся к внутреннему представлению, учитывающему возможные пересечения антимеридиана.
Вычисление шагов сетки Определяется горизонтальный и вертикальный шаг между центрами шестиугольников. При этом используется шахматное смещение строк.
Итерация по координатной плоскости Пространство покрывается сеткой точек-центров, где каждая вторая строка смещается на половину ширины ячейки.
Построение геометрии шестиугольника Для каждой точки-центра формируется полигон из шести вершин.
Обрезка по границам bbox или mask Если указан
mask, выполняется пересечение каждого шестиугольника с
полигоном маски.
Формирование FeatureCollection Результат возвращается в формате GeoJSON.
import * as turf from "@turf/turf";
const bbox = [30.0, 50.0, 32.0, 52.0];
const hexGrid = turf.hexGrid(bbox, 10, {
units: "kilometers"
});
console.log(hexGrid);
В результате получается объект FeatureCollection,
содержащий множество полигонов-шестиугольников, покрывающих заданную
область.
Каждая ячейка сетки может содержать дополнительные метаданные. Это важно для аналитических задач, где каждая зона должна хранить агрегированную информацию.
const grid = turf.hexGrid(bbox, 5, {
units: "kilometers",
properties: {
region: "analysis-zone",
type: "hex-cell"
}
});
Все созданные полигоны будут иметь одинаковый набор свойств, что удобно для последующей обработки.
Параметр mask позволяет ограничить генерацию сетки
сложным полигоном. Это особенно полезно при работе с административными
границами, береговыми линиями или произвольными областями интереса.
const mask = turf.polygon([[
[30.5, 50.5],
[31.5, 50.5],
[31.5, 51.5],
[30.5, 51.5],
[30.5, 50.5]
]]);
const grid = turf.hexGrid(bbox, 8, {
units: "kilometers",
mask
});
В этом случае результирующие шестиугольники будут обрезаны по границам маски, и в итоговую коллекцию попадут только пересекающиеся области.
Параметр cellSide определяет разрешение сетки. При
уменьшении значения:
При увеличении значения:
Практически важно подбирать значение с учётом масштаба данных и задачи анализа.
Turf.js также поддерживает квадратную сетку через аналогичную функцию. Однако гексагональная структура имеет ряд отличий:
Эти свойства делают гексагональную сетку предпочтительной в задачах пространственного анализа высокой плотности.
Гексагональная сетка часто используется как промежуточный слой между сырыми геоданными и аналитическими моделями.
Типовые сценарии:
В каждом случае шестиугольники выступают как контейнеры для статистики: количества точек, суммарного веса, средней величины и других метрик.
После генерации сетки типичным шагом является сопоставление точек с ячейками:
const points = turf.featureCollection([
turf.point([30.1, 50.1]),
turf.point([30.3, 50.2]),
turf.point([31.0, 50.5])
]);
const grid = turf.hexGrid(bbox, 10, {
units: "kilometers"
});
grid.features.forEach(cell => {
let count = 0;
points.features.forEach(pt => {
if (turf.booleanPointInPolygon(pt, cell)) {
count++;
}
});
cell.properties.count = count;
});
Каждая ячейка получает дополнительное поле count,
отражающее плотность точек внутри неё.
Параметр units критически влияет на интерпретацию
cellSide. Turf.js поддерживает несколько систем:
kilometers — наиболее распространённый вариант;miles — для англоязычных систем измерения;meters — для высокоточной локальной аналитики;degrees — для грубых географических расчетов без
проекции.При выборе единиц важно учитывать масштаб области. Для больших территорий использование километров обеспечивает более стабильные результаты.
При генерации крупных сеток важно учитывать вычислительную сложность.
Количество ячеек растёт обратно пропорционально квадрату
cellSide.
Практические рекомендации:
Ключевой элемент алгоритма — шахматное смещение. Каждая вторая строка гексагонов сдвигается на половину ширины ячейки. Это обеспечивает плотное заполнение без зазоров.
Такое смещение приводит к следующей структуре:
При использовании mask важно учитывать, что Turf.js
выполняет геометрическое пересечение полигонов. Это означает:
Это может влиять на статистику, если не учитывать нормализацию по площади.
После генерации часто выполняются дополнительные операции:
Turf.js предоставляет набор функций, которые позволяют выполнять эти операции без перехода к внешним геоинформационным системам.
Гексагональная сетка часто является промежуточным представлением в ETL-процессах геоданных. Схема обычно выглядит так:
Такой подход обеспечивает унификацию данных и упрощает дальнейшую обработку в BI-системах или картографических приложениях.