Работа с цифровыми моделями рельефа (ЦМР) в геоинформационных задачах опирается на представление поверхности земли в виде дискретного набора значений высоты, привязанных к координатам. В веб-картографии 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 не хранит «рельеф» как отдельную сущность — он оперирует геометрией и свойствами объектов.
Основным способом аппроксимации поверхности является триангуляция
Делоне. В 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: [...]
}
}
После построения триангуляции возможно вычисление уклонов поверхности. 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:
В 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, часто преобразуется в:
Пример подготовки данных:
const terrainLayer = {
type: "FeatureCollection",
features: isobands
};
Методы Turf.js работают в предположении локальной непрерывности поверхности. Это означает:
При больших перепадах высот или редких данных интерполяция может давать значительные погрешности.
Полноценная обработка рельефа обычно включает последовательность операций:
Каждый этап опирается на GeoJSON-структуры и функциональные модули Turf.js, что позволяет выстраивать модульные геоинформационные пайплайны без специализированных ГИС-серверов.