Квадратная сетка в геопространственных задачах представляет собой регулярное разбиение заданной области на равные квадратные ячейки. В Turf.js этот функционал реализуется через генерацию сетки полигонов на основе ограничивающего прямоугольника (bounding box). Такой подход используется для пространственного анализа плотности точек, агрегации данных, построения тепловых карт и дискретизации непрерывных геоданных.
Генерация квадратной сетки опирается на три ключевых параметра:
[minX, minY, maxX, maxY]В 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 — единицы измерения расстоянияРезультатом является набор полигонов, покрывающих весь прямоугольник.
Каждая ячейка сетки представлена 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 влияет на интерпретацию размера
ячейки:
kilometers — километрыmeters — метрыdegrees — градусыmiles — милиИспользование географических координат требует аккуратного выбора единиц, поскольку степень искажения зависит от проекции и широты.
const gridInMeters = squareGrid(bounds, 1000, {
units: "meters"
});
При построении сетки на больших территориях проявляется эффект геодезической проекции: квадраты в координатах WGS84 не являются идеальными квадратами на поверхности Земли. Turf.js компенсирует это за счёт геодезических вычислений расстояний, однако визуально искажения сохраняются.
На больших масштабах применяется:
Количество создаваемых полигонов растёт обратно пропорционально квадрату размера ячейки. При уменьшении шага в два раза количество ячеек увеличивается примерно в четыре раза.
Оптимизация достигается через:
maskКвадратная сетка часто используется совместно с:
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
}
};
});
Каждая ячейка строится последовательно вдоль осей координат:
cellSideТакой алгоритм обеспечивает регулярную топологическую структуру сетки без перекрытий и разрывов.
Регулярная дискретизация пространства используется для:
Квадратная сетка остаётся базовым инструментом при работе с GeoJSON-данными благодаря простоте структуры и предсказуемости геометрии.