Определение экспозиции склонов

Экспозиция склона (aspect) — направление максимального уклона поверхности в конкретной точке рельефа. В терминах геометрии поверхности это угол, указывающий, куда «смотрит» склон относительно сторон света. В геоинформационных системах экспозиция используется для анализа инсоляции, микроклимата, водооттока и устойчивости грунтов.

При работе с геоданными в JavaScript с использованием Turf.js экспозиция не вычисляется одной встроенной функцией, поскольку библиотека ориентирована на векторную геометрию. Расчёт выполняется через анализ локальной окрестности точек высотной модели (DEM), представленной в виде регулярной сетки или набора точек с атрибутом высоты.


Представление поверхности в Turf.js

Для вычисления экспозиции используется дискретная модель поверхности:

  • регулярная сетка точек (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 = (, -)]

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

  • 0° — север
  • 90° — восток
  • 180° — юг
  • 270° — запад

Реализация на основе массива высот

При преобразовании 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 для геометрической привязки

Хотя 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 может быть получен динамически через реальные координаты.


Нормализация направления

После получения угла важно привести его к географической системе координат:

  • отрицательные значения корректируются
  • результат приводится к диапазону 0–360°
function normalizeAspect(angle) {
  return (angle + 360) % 360;
}

Классификация экспозиции

Для прикладного анализа экспозиция часто дискретизируется:

  • 0–45°: северо-восточная
  • 45–135°: восточная
  • 135–225°: южная
  • 225–315°: западная
  • 315–360°: северная
function classifyAspect(a) {
  if (a >= 315 || a < 45) return "north";
  if (a < 135) return "east";
  if (a < 225) return "south";
  return "west";
}

Интеграция с реальными DEM-данными

В реальных сценариях данные поступают из:

  • GeoTIFF (через внешние парсеры)
  • LiDAR облаков точек
  • спутниковых моделей высот

Turf.js используется как слой обработки после первичной растрации в векторную структуру.

Процесс:

  1. Растер → сетка точек
  2. Присвоение высот
  3. Построение локальных окрестностей
  4. Расчёт градиентов
  5. Вычисление экспозиции

Оптимизация вычислений

При больших сетках важно учитывать производительность:

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

Оптимизированная структура хранения:

const index = (x, y) => y * cols + x;

Связь экспозиции с другими морфометрическими параметрами

Экспозиция тесно связана с:

  • уклоном (slope)
  • кривизной поверхности
  • направлением стока воды

В комбинации с Turf.js можно строить комплексные модели:

  • slope — интенсивность изменения высоты
  • aspect — направление изменения
  • flow accumulation — накопление стока (внешние алгоритмы)

Практическая интерпретация результатов

Полученные значения экспозиции используются для:

  • оценки солнечной инсоляции склонов
  • моделирования растительности
  • анализа снежного покрова
  • инженерного проектирования дорог и сооружений

Экспозиция, вычисленная через Turf.js-структуры, представляет собой численное приближение, зависящее от плотности сетки и качества исходной высотной модели.