Треугольная сетка

Треугольная сетка используется в геопространственных вычислениях как способ равномерного покрытия поверхности набором равносторонних или почти равносторонних треугольников. В контексте анализа пространственных данных она служит альтернативой квадратной и гексагональной сетке, обеспечивая более устойчивое распределение соседних ячеек и более равномерную аппроксимацию криволинейных областей.

В Turf.js треугольная сетка реализуется через генератор регулярной триангуляции, позволяющий разбиение заданного bounding box на множество ячеек одинакового размера. Основная идея заключается в построении повторяющегося паттерна из равносторонних треугольников, которые полностью покрывают область без перекрытий и зазоров.

Треугольная сетка строится на основе регулярной триангуляции плоскости, где каждая вершина соединена с соседними таким образом, что образуются равносторонние треугольники.

Ключевые свойства:

  • каждая внутренняя вершина имеет степень 6;
  • каждая ячейка имеет одинаковую площадь;
  • соседство определяется шестью направлениями;
  • структура эквивалентна двум наложенным сдвинутым квадратным сеткам.

Плотность покрытия выше, чем у квадратной сетки при одинаковом размере стороны, что делает структуру более точной для аппроксимации поверхностей.

Модуль triangleGrid в Turf.js

В Turf.js генерация треугольной сетки выполняется функцией triangleGrid.

Функция создает набор GeoJSON-полигонов, представляющих треугольные ячейки внутри заданного прямоугольного bounding box.

Основная задача — разбиение области на регулярные треугольники с заданным шагом.

Сигнатура функции

triangleGrid(bbox, cellSide, options)

bbox

Массив вида:

[minX, minY, maxX, maxY]

Определяет прямоугольную область, в пределах которой строится сетка.

cellSide

Числовое значение, определяющее длину стороны треугольника. Единицы зависят от параметра options.units.

options

Объект конфигурации:

  • units — единицы измерения (kilometers, meters, miles, degrees)
  • properties — дополнительные свойства, добавляемые к каждой ячейке
  • mask — геометрия, ограничивающая область генерации

Принцип построения сетки

Треугольная сетка в Turf.js формируется через комбинацию смещённых координатных рядов.

Алгоритм можно описать следующим образом:

  1. Определяется шаг сетки по оси X, равный длине основания треугольника.

  2. По оси Y используется высота равностороннего треугольника:

    • ( h = a )
  3. Каждая вторая строка смещается на половину шага по X.

  4. Для каждой пары соседних точек формируются два треугольника.

Такая структура обеспечивает плотное и непрерывное покрытие плоскости.

Геометрические зависимости

Для равностороннего треугольника:

  • сторона: a
  • высота: [ h = a]
  • площадь: [ S = a^2]

Эти зависимости используются при расчёте координат узлов сетки.

Формирование GeoJSON-геометрий

Каждый треугольник в Turf.js представлен объектом GeoJSON типа Polygon.

Структура ячейки:

{
  type: "Feature",
  properties: {},
  geometry: {
    type: "Polygon",
    coordinates: [...]
  }
}

Координаты задаются в порядке обхода вершин по или против часовой стрелки, что обеспечивает корректное отображение в GIS-системах.

Пример построения треугольной сетки

import { triangleGrid } from "@turf/turf";

const bbox = [30, 50, 32, 52];
const cellSide = 10;
const options = { units: "kilometers" };

const grid = triangleGrid(bbox, cellSide, options);

console.log(grid);

Результатом является FeatureCollection, содержащий множество треугольных полигонов.

Внутренняя логика генерации координат

Генерация начинается с нижнего левого угла bounding box.

Для каждой строки:

  • вычисляется базовая координата Y;
  • определяется смещение X;
  • строится набор точек;
  • каждые три последовательные точки формируют треугольник.

Чередование направлений треугольников:

  • чётные ряды: ориентация вверх
  • нечётные ряды: ориентация вниз

Это позволяет избежать разрывов в сетке.

Масштабирование и единицы измерения

Параметр units определяет, как интерпретируется cellSide.

Поддерживаемые режимы:

  • meters — наиболее точный для локальных вычислений
  • kilometers — стандартный для региональных карт
  • miles — используется в навигационных системах
  • degrees — географические координаты без проекции

При использовании degrees важно учитывать искажения на высоких широтах.

Ограничение области генерации

Параметр mask позволяет ограничить сетку произвольной геометрией.

Если mask задан:

  • треугольники проверяются на пересечение
  • ячейки вне области отбрасываются
  • частично пересекающиеся полигоны могут быть обрезаны

Это особенно важно при анализе административных границ.

Производительность генерации

Сложность алгоритма линейно зависит от площади bounding box и обратна квадрату cellSide.

Основные факторы нагрузки:

  • плотность сетки
  • размер области
  • наличие mask-операций

При уменьшении cellSide в 2 раза количество ячеек увеличивается примерно в 4 раза.

Использование в пространственном анализе

Треугольная сетка применяется для:

  • интерполяции данных (температура, загрязнение)
  • моделирования поверхностей
  • анализа плотности событий
  • построения heatmap на геоданных
  • разбиения зон влияния

Особенно полезна в задачах, где важна равномерная связность соседних ячеек.

Сравнение с другими типами сеток

Квадратная сетка

  • проще в вычислении
  • хуже аппроксимация диагоналей
  • 4 соседа

Гексагональная сетка

  • 6 соседей
  • высокая равномерность
  • сложнее в построении

Треугольная сетка

  • максимальная плотность соединений
  • 6 соседей на вершину
  • хорошая устойчивость к направленным искажениям

Особенности координатной привязки

В Turf.js координаты треугольников привязываются к сетке без геодезической коррекции формы ячеек. Это означает:

  • в проекциях с искажениями форма может слегка деформироваться
  • на больших масштабах рекомендуется использовать проецированные координаты
  • для Web Mercator поведение предсказуемо в пределах городских масштабов

Типичные ошибки при использовании

  • выбор слишком малого cellSide, приводящий к экспоненциальному росту количества ячеек
  • использование degrees вместо meters/kilometers
  • игнорирование маски при работе с административными границами
  • попытка интерпретации сетки как точной геодезической модели

Связь с пространственными индексами

Треугольная сетка может использоваться как основа для пространственного индексирования:

  • каждая ячейка выступает бакетом
  • точки индексируются по принадлежности к треугольнику
  • ускоряется поиск соседних объектов

Такая структура особенно эффективна при потоковой обработке геоданных.

Практика работы с атрибутами ячеек

В Turf.js каждая ячейка может получать пользовательские свойства:

const options = {
  units: "kilometers",
  properties: {
    type: "analysis-cell",
    source: "sensor-grid"
  }
};

Это позволяет использовать сетку в аналитических пайплайнах без дополнительной постобработки.

Использование в визуализации

Треугольная сетка часто используется в WebGL и SVG-визуализациях:

  • упрощает триангуляцию поверхностей
  • подходит для шейдерной обработки
  • используется в terrain rendering
  • позволяет эффективно интерполировать значения в вершинах

Каждый треугольник естественным образом подходит для GPU-рендеринга, так как графические пайплайны оптимизированы под треугольники как базовый примитив.