Создание квадратной сетки

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

Генерация квадратной сетки опирается на три ключевых параметра:

  • границы области в формате bounding box [minX, minY, maxX, maxY]
  • размер ячейки (cell side)
  • единицы измерения расстояния

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

import { bbox } from "@turf/bbox";
import { squareGrid } from "@turf/square-grid";
import { featureCollection, point } from "@turf/helpers";

const points = featureCollection([
  point([37.62, 55.75]),
  point([37.61, 55.76]),
  point([37.63, 55.74])
]);

const bounds = bbox(points);

Функция bbox возвращает минимальный прямоугольник, полностью охватывающий все геометрии коллекции.

Генерация квадратной сетки

Основная функция для создания сетки — squareGrid. Она формирует FeatureCollection полигонов, каждый из которых представляет квадратную ячейку.

import { squareGrid } from "@turf/square-grid";

const grid = squareGrid(bounds, 1, {
  units: "kilometers"
});

В данном случае:

  • bounds — область построения сетки
  • 1 — размер стороны квадрата
  • units — единицы измерения расстояния

Результатом является набор полигонов, покрывающих весь прямоугольник.

Структура результата squareGrid

Каждая ячейка сетки представлена GeoJSON-полигоном:

{
  "type": "Feature",
  "geometry": {
    "type": "Polygon",
    "coordinates": [
      [
        [minX, minY],
        [maxX, minY],
        [maxX, maxY],
        [minX, maxY],
        [minX, minY]
      ]
    ]
  },
  "properties": {}
}

Сетка агрегируется в FeatureCollection, что позволяет выполнять пространственные операции над каждой ячейкой.

Управление плотностью сетки

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

const fineGrid = squareGrid(bounds, 0.2, {
  units: "kilometers"
});

const coarseGrid = squareGrid(bounds, 5, {
  units: "kilometers"
});

Мелкая сетка используется для анализа локальных закономерностей, крупная — для обобщённых региональных оценок.

Использование пользовательских геометрий как маски

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

import { polygon } from "@turf/helpers";
import { squareGrid } from "@turf/square-grid";

const mask = polygon([[
  [37.50, 55.70],
  [37.70, 55.70],
  [37.70, 55.80],
  [37.50, 55.80],
  [37.50, 55.70]
]]);

const grid = squareGrid(bounds, 1, {
  units: "kilometers",
  mask
});

В результате остаются только те ячейки, которые пересекаются с полигоном маски.

Привязка данных к ячейкам сетки

После создания сетки часто выполняется пространственное присоединение точек к соответствующим ячейкам. Это позволяет агрегировать значения внутри каждого квадрата.

import { booleanPointInPolygon } from "@turf/boolean-point-in-polygon";

const enriched = grid.features.map(cell => {
  const count = points.features.filter(pt =>
    booleanPointInPolygon(pt, cell)
  ).length;

  return {
    ...cell,
    properties: {
      count
    }
  };
});

Каждая ячейка получает дополнительное свойство, отражающее количество точек внутри неё.

Практическая структура данных сетки

После обогащения сетка приобретает аналитический смысл:

  • geometry — геометрия квадрата
  • properties.count — число объектов внутри
  • дополнительные метрики (плотность, среднее значение, вес)

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

Географическая интерпретация параметра units

Параметр units влияет на интерпретацию размера ячейки:

  • kilometers — километры
  • meters — метры
  • degrees — градусы
  • miles — мили

Использование географических координат требует аккуратного выбора единиц, поскольку степень искажения зависит от проекции и широты.

const gridInMeters = squareGrid(bounds, 1000, {
  units: "meters"
});

Особенности работы на глобальных масштабах

При построении сетки на больших территориях проявляется эффект геодезической проекции: квадраты в координатах WGS84 не являются идеальными квадратами на поверхности Земли. Turf.js компенсирует это за счёт геодезических вычислений расстояний, однако визуально искажения сохраняются.

На больших масштабах применяется:

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

Производительность при большом количестве ячеек

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

Оптимизация достигается через:

  • ограничение области через mask
  • предварительную фильтрацию bounding box
  • агрегацию данных до построения сетки

Комбинирование с другими функциями Turf.js

Квадратная сетка часто используется совместно с:

  • pointsWithinPolygon для выборки точек
  • distance для вычисления метрик в ячейках
  • collect для агрегации свойств объектов

Пример комбинированной обработки:

import { squareGrid } from "@turf/square-grid";
import { pointsWithinPolygon } from "@turf/points-within-polygon";

const grid = squareGrid(bounds, 1, { units: "kilometers" });

const enriched = grid.features.map(cell => {
  const pts = pointsWithinPolygon(points, cell);

  return {
    ...cell,
    properties: {
      total: pts.features.length
    }
  };
});

Геометрическая логика построения ячеек

Каждая ячейка строится последовательно вдоль осей координат:

  • движение по оси X с шагом cellSide
  • после достижения границы — переход на следующую строку по оси Y
  • формирование замкнутого полигона из четырёх вершин

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

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

Регулярная дискретизация пространства используется для:

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

Квадратная сетка остаётся базовым инструментом при работе с GeoJSON-данными благодаря простоте структуры и предсказуемости геометрии.