Изолинии представляют собой линии равного значения некоторой непрерывной величины в пространстве: температуры, давления, высоты, плотности событий. В цифровой геоинформационной обработке изолинии не существуют в исходных данных напрямую — они вычисляются на основе дискретных измерений, распределённых по координатной сетке или набору точек.
В контексте Turf.js изолинии строятся путём преобразования набора точек с числовыми значениями в регулярную сетку, после чего применяется алгоритм интерполяции и извлечения контуров. Основная задача — восстановить непрерывную поверхность из дискретных наблюдений и выделить линии одинаковых значений.
Turf.js работает с GeoJSON-структурами, поэтому исходный набор данных
обычно представлен в виде FeatureCollection<Point>,
где каждая точка содержит числовое значение в свойствах:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [30.5, 50.5]
},
"properties": {
"value": 12.7
}
}
Ключевым моментом является наличие числового поля, по которому будет строиться поверхность. Без него построение изолиний невозможно.
При подготовке данных учитываются следующие факторы:
Чем плотнее исходные данные, тем стабильнее результат интерполяции.
Перед генерацией изолиний точечные данные преобразуются в сетку
(grid). Turf.js предоставляет инструменты для создания сеток, такие как
squareGrid или pointGrid.
import * as turf from "@turf/turf";
const bbox = [30, 50, 31, 51];
const grid = turf.pointGrid(bbox, 0.1, {
units: "degrees"
});
Каждая ячейка сетки получает значение, интерполированное на основе ближайших точек. Это превращает набор разрозненных наблюдений в непрерывное поле.
Для заполнения сетки используется интерполяция. Turf.js применяет методы пространственного анализа, такие как IDW (Inverse Distance Weighting), где значение в точке определяется как взвешенное среднее соседних значений:
Z(x_0)=
где:
Чем больше (p), тем сильнее влияние ближайших точек.
Результатом интерполяции является набор полигональных ячеек или растровое поле значений, пригодное для построения изолиний.
Turf.js использует подход, аналогичный алгоритму marching squares. Он анализирует каждую ячейку сетки (квадрат), определяя, как линия уровня проходит через неё.
Каждая ячейка содержит четыре значения (в углах), и сравнение их с пороговым уровнем позволяет определить конфигурацию пересечения.
Основные шаги:
Основная функция для генерации изолиний в Turf.js —
turf.isolines.
import * as turf from "@turf/turf";
const points = turf.featureCollection([
turf.point([30.1, 50.1], { value: 10 }),
turf.point([30.5, 50.2], { value: 20 }),
turf.point([30.8, 50.6], { value: 30 }),
turf.point([30.3, 50.9], { value: 15 })
]);
const breaks = [10, 15, 20, 25, 30];
const isolines = turf.isolines(points, breaks, {
zProperty: "value"
});
Параметры функции:
points — набор точек с числовым атрибутом;breaks — уровни изолиний;zProperty — имя поля со значением;Результатом является FeatureCollection<LineString>
или Polygon, представляющий изолинии или зоны между
ними.
Вместо линий могут строиться зоны — полигоны между уровнями. Это используется для визуализации температурных или плотностных карт.
Каждая зона определяется как область:
Такая структура часто применяется в климатических моделях и анализе плотности событий.
Точность изолиний напрямую зависит от параметров сетки. В Turf.js это выражается через размер ячейки:
const grid = turf.pointGrid(bbox, 0.05, {
units: "degrees"
});
Меньший шаг:
Больший шаг:
Turf.js работает в WGS84 (EPSG:4326), где координаты представлены в градусах. Это накладывает ограничения:
При необходимости повышения точности выполняется предварительная проекция данных в метрическую систему, а затем обратное преобразование.
При построении изолиний критично учитывать шумы в данных. Один выброс способен исказить контур.
Методы стабилизации:
Сглаживание особенно важно перед применением marching squares, так как резкие скачки создают разрывы линий.
import * as turf from "@turf/turf";
const points = turf.featureCollection([
turf.point([30.1, 50.1], { value: 12 }),
turf.point([30.4, 50.3], { value: 18 }),
turf.point([30.7, 50.6], { value: 25 }),
turf.point([30.9, 50.8], { value: 30 })
]);
const bbox = turf.bbox(points);
const grid = turf.pointGrid(bbox, 0.1, {
units: "degrees"
});
const interpolated = turf.interpolate(points, grid, {
gridType: "points",
property: "value",
units: "degrees"
});
const isolines = turf.isolines(interpolated, [10, 15, 20, 25, 30], {
zProperty: "value"
});
Этот конвейер включает:
Изолинии часто используются как альтернатива растровым поверхностям. Они позволяют:
В веб-картографии изолинии часто комбинируются с градиентной заливкой, создавая гибридные модели визуализации.
Каждая линия изолинии соответствует фиксированному значению функции. Плотность линий указывает на градиент изменения:
Такая интерпретация применяется в анализе рельефа, погодных моделей и пространственной статистике.