Работа с цифровыми моделями рельефа

Работа с цифровыми моделями рельефа (ЦМР) в геоинформационных задачах опирается на представление поверхности земли в виде дискретного набора значений высоты, привязанных к координатам. В веб-картографии Turf.js используется как инструмент пространственного анализа, позволяющий строить приближённые модели рельефа на основе точечных измерений, выполнять интерполяцию, формировать сетки и извлекать производные геометрические структуры.

Цифровая модель рельефа в контексте Turf.js чаще всего представляется через набор GeoJSON-точек с атрибутом высоты (z или свойство elevation, height, alt). Дальнейшая обработка сводится к преобразованию этих точек в непрерывную поверхность с помощью триангуляции и интерполяции.


Представление высотных данных

Исходные данные для построения модели рельефа обычно имеют следующий вид:

const points = {
  type: "FeatureCollection",
  features: [
    {
      type: "Feature",
      properties: { elevation: 120 },
      geometry: {
        type: "Point",
        coordinates: [71.4304, 51.1282]
      }
    },
    {
      type: "Feature",
      properties: { elevation: 135 },
      geometry: {
        type: "Point",
        coordinates: [71.4500, 51.1300]
      }
    }
  ]
};

Ключевым требованием для дальнейшей обработки является наличие числового поля высоты. Turf.js не хранит «рельеф» как отдельную сущность — он оперирует геометрией и свойствами объектов.


Построение триангуляционной модели (TIN)

Основным способом аппроксимации поверхности является триангуляция Делоне. В Turf.js это реализуется через модуль tin, который преобразует набор точек в набор треугольников.

import tin from "@turf/tin";

const triangles = tin(points, "elevation");

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

Каждый треугольник имеет структуру:

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

TIN-модель применяется для:

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

Интерполяция значений высоты

Для перехода от дискретных точек к непрерывной сетке используется интерполяция. В Turf.js это реализуется через interpolate.

import interpolate from "@turf/interpolate";

const grid = interpolate(points, "elevation", {
  gridType: "points",
  resolution: 100,
  property: "elevation"
});

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

Основные параметры:

  • gridType — тип сетки (points или square)
  • resolution — плотность сетки
  • property — поле, содержащее высоту

Генерация регулярной сетки

Перед интерполяцией или совместно с ней часто создаётся базовая сетка:

import pointGrid from "@turf/point-grid";

const bbox = [71.3, 51.1, 71.6, 51.2];

const grid = pointGrid(bbox, 0.01, {
  units: "degrees"
});

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


Построение изолиний

Изолинии (линии равных высот) являются одной из ключевых форм визуализации рельефа. В Turf.js используется isolines.

import isolines from "@turf/isolines";

const lines = isolines(grid, "elevation", {
  breaks: [100, 110, 120, 130, 140]
});

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

Изолинии применяются для:

  • карт высот
  • анализа склонов
  • инженерных расчётов
  • генерации контурных карт

Построение изополигонов (зон высот)

В отличие от изолиний, изополигоны представляют области, ограниченные диапазонами высот.

import isobands from "@turf/isobands";

const bands = isobands(grid, "elevation", {
  breaks: [100, 110, 120, 130, 140]
});

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

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

{
  type: "Feature",
  properties: {
    min: 110,
    max: 120
  },
  geometry: {
    type: "Polygon",
    coordinates: [...]
  }
}

Анализ уклонов на основе TIN

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

Алгоритм включает:

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

Пример вспомогательной функции:

function slope(a, b) {
  const dz = b.properties.elevation - a.properties.elevation;
  const dx = turf.distance(a, b, { units: "meters" });
  return dz / dx;
}

Агрегация высотных данных

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

  • collect — сбор значений в полигоне
  • within — выбор точек внутри области
  • bboxClip — обрезка по границам

Пример отбора точек внутри области:

import within from "@turf/within";

const selected = within(points, polygon);

Сравнение моделей: регулярная сетка и TIN

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

Регулярная сетка:

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

TIN:

  • адаптивная структура
  • высокая точность при нерегулярных данных
  • эффективна для сложного рельефа

В Turf.js оба подхода часто комбинируются: TIN используется для первичной аппроксимации, сетка — для визуализации и интерполяции.


Работа с плотностью точек

Качество цифровой модели напрямую зависит от плотности исходных измерений. Turf.js позволяет оценивать распределение точек через сетки и кластеризацию.

Создание вспомогательной сетки:

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

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

Далее можно анализировать количество точек в каждой ячейке:

import pointsWithinPolygon from "@turf/points-within-polygon";

Преобразование модели в визуальные структуры

Цифровая модель рельефа, полученная через Turf.js, часто преобразуется в:

  • GeoJSON для Mapbox GL
  • тайлы для WebGL визуализации
  • контурные слои

Пример подготовки данных:

const terrainLayer = {
  type: "FeatureCollection",
  features: isobands
};

Интерполяционные особенности и ограничения

Методы Turf.js работают в предположении локальной непрерывности поверхности. Это означает:

  • отсутствие резких разрывов
  • сглаживание экстремумов
  • зависимость результата от плотности входных точек

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


Комбинирование операций в единую модель

Полноценная обработка рельефа обычно включает последовательность операций:

  1. Сбор высотных точек
  2. Создание TIN-модели
  3. Генерация сетки
  4. Интерполяция значений
  5. Построение изолиний или изополигонов
  6. Анализ уклонов и производных характеристик

Каждый этап опирается на GeoJSON-структуры и функциональные модули Turf.js, что позволяет выстраивать модульные геоинформационные пайплайны без специализированных ГИС-серверов.