Экспозиция склона (aspect) — направление максимального уклона поверхности в конкретной точке рельефа. В терминах геометрии поверхности это угол, указывающий, куда «смотрит» склон относительно сторон света. В геоинформационных системах экспозиция используется для анализа инсоляции, микроклимата, водооттока и устойчивости грунтов.
При работе с геоданными в JavaScript с использованием Turf.js экспозиция не вычисляется одной встроенной функцией, поскольку библиотека ориентирована на векторную геометрию. Расчёт выполняется через анализ локальной окрестности точек высотной модели (DEM), представленной в виде регулярной сетки или набора точек с атрибутом высоты.
Для вычисления экспозиции используется дискретная модель поверхности:
squareGrid)elevationПример генерации сетки:
import * as turf from "@turf/turf";
const bbox = [30, 50, 31, 51];
const cellSize = 0.5;
const grid = turf.squareGrid(bbox, cellSize, { units: "kilometers" });
Далее каждой точке сетки присваивается высота:
grid.features.forEach((cell, i) => {
cell.properties.elevation = Math.random() * 1000;
});
Экспозиция определяется через локальный градиент поверхности. Для этого требуется минимальная окрестность — обычно 3×3 узла сетки.
Пусть имеется центральная точка:
z5 — центральная высота
И соседние:
z1 z2 z3
z4 z5 z6
z7 z8 z9
Смысл вычисления — оценить изменение высоты по осям X и Y.
Частные производные аппроксимируются конечными разностями:
[ ]
[ ]
где h — шаг сетки.
В JavaScript это может быть реализовано на основе индексов массива сетки или матрицы высот.
Экспозиция выражается углом направления градиента:
[ aspect = (, -)]
Результат переводится в градусы и нормализуется:
При преобразовании Turf-сетки в матрицу:
function getElevation(grid, cols, rows) {
const matrix = [];
for (let y = 0; y < rows; y++) {
const row = [];
for (let x = 0; x < cols; x++) {
const index = y * cols + x;
row.push(grid.features[index].properties.elevation);
}
matrix.push(row);
}
return matrix;
}
function calculateAspect(z, x, y, h) {
const dzdx =
((z[y - 1][x + 1] + 2 * z[y][x + 1] + z[y + 1][x + 1]) -
(z[y - 1][x - 1] + 2 * z[y][x - 1] + z[y + 1][x - 1])) /
(8 * h);
const dzdy =
((z[y + 1][x - 1] + 2 * z[y + 1][x] + z[y + 1][x + 1]) -
(z[y - 1][x - 1] + 2 * z[y - 1][x] + z[y - 1][x + 1])) /
(8 * h);
let aspect = Math.atan2(dzdy, -dzdx) * (180 / Math.PI);
if (aspect < 0) aspect = 360 + aspect;
return aspect;
}
Хотя Turf.js не выполняет дифференциальный анализ напрямую, он полезен для подготовки пространственной структуры:
squareGrid)distance)bearing)Пример вычисления расстояния между узлами:
const a = turf.point([30, 50]);
const b = turf.point([30.5, 50]);
const dist = turf.distance(a, b, { units: "kilometers" });
Шаг сетки h может быть получен динамически через
реальные координаты.
После получения угла важно привести его к географической системе координат:
function normalizeAspect(angle) {
return (angle + 360) % 360;
}
Для прикладного анализа экспозиция часто дискретизируется:
function classifyAspect(a) {
if (a >= 315 || a < 45) return "north";
if (a < 135) return "east";
if (a < 225) return "south";
return "west";
}
В реальных сценариях данные поступают из:
Turf.js используется как слой обработки после первичной растрации в векторную структуру.
Процесс:
При больших сетках важно учитывать производительность:
featuresОптимизированная структура хранения:
const index = (x, y) => y * cols + x;
Экспозиция тесно связана с:
В комбинации с Turf.js можно строить комплексные модели:
slope — интенсивность изменения высотыaspect — направление измененияflow accumulation — накопление стока (внешние
алгоритмы)Полученные значения экспозиции используются для:
Экспозиция, вычисленная через Turf.js-структуры, представляет собой численное приближение, зависящее от плотности сетки и качества исходной высотной модели.