Метод обратных взвешенных расстояний (Inverse Distance Weighting, IDW) относится к детерминированным методам пространственной интерполяции и применяется для восстановления значений непрерывной поверхности по набору дискретных измерений. Основной принцип заключается в том, что влияние исходных точек на вычисляемое значение уменьшается с увеличением расстояния.
Формально значение в произвольной точке пространства вычисляется как взвешенное среднее:
Z(x_0)=
где:
Вес обычно задаётся как:
w_i=
где:
Рост параметра (p) усиливает влияние ближайших точек и делает поверхность более локально изменчивой, тогда как малые значения создают более сглаженный результат.
В контексте Turf.js данные представляются в формате GeoJSON.
Интерполяция выполняется по набору объектов типа
Feature<Point>, каждый из которых содержит координаты
и числовое значение в свойствах.
Структура исходного набора:
const points = {
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [71.44598, 51.16939]
},
properties: {
value: 12
}
},
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [71.44907, 51.16052]
},
properties: {
value: 18
}
}
]
};
Ключевым элементом является числовое поле в properties,
которое участвует в интерполяции.
В Turf.js метод IDW реализуется через модуль интерполяции, который генерирует регулярную сетку значений на основе входных точек.
Типичный вызов:
import { interpolate } from "@turf/interpolate";
const options = {
gridType: "points",
property: "value",
units: "kilometers",
weight: 2
};
const interpolated = interpolate(points, 1, options);
Параметры:
points — набор исходных данных GeoJSON,1 — размер ячейки сетки,gridType — тип выходной структуры (points
или square),property — поле, участвующее в интерполяции,units — единицы измерения расстояний,weight — степень влияния расстояния (p) в формуле
IDW.Процесс вычисления интерполяции разбивается на несколько этапов:
Псевдологика:
for (each gridPoint) {
let numerator = 0;
let denominator = 0;
for (each sourcePoint) {
const d = distance(gridPoint, sourcePoint);
const w = 1 / Math.pow(d, p);
numerator += w * sourcePoint.value;
denominator += w;
}
gridPoint.value = numerator / denominator;
}
Особый случай возникает при совпадении координат целевой и исходной точки. При (d = 0) значение интерполяции определяется напрямую значением исходной точки, что исключает деление на ноль и обеспечивает точное воспроизведение данных.
Параметр weight управляет степенью локальности
модели:
Изменение параметра напрямую влияет на структуру изолиний при визуализации результатов.
Turf.js использует геодезические расстояния, учитывающие кривизну
Земли. Параметр units определяет масштаб вычислений:
Выбор единиц влияет на плотность сетки и численную устойчивость интерполяции. При мелком масштабе предпочтительны километры, при глобальных задачах — более крупные единицы.
При генерации поверхности важным параметром является
cellSize. Он задаёт шаг дискретизации:
const interpolated = interpolate(points, 0.5, {
property: "value",
weight: 2,
units: "kilometers"
});
Уменьшение размера ячейки увеличивает детализацию, но приводит к росту вычислительной нагрузки пропорционально площади покрытия.
При плотных наборах точек возможно возникновение артефактов интерполяции. Для стабилизации применяются:
Ограничение радиуса влияния реализуется через предварительный spatial filtering:
const filtered = points.features.filter(f => {
return f.properties.value !== null;
});
Метод применяется не только для высотных моделей, но и для:
Каждая задача сводится к интерполяции скалярного поля по пространственным координатам.
На границах bounding box наблюдается снижение точности из-за отсутствия соседних точек за пределами области наблюдения. Для компенсации используются:
Алгоритм IDW имеет сложность:
где:
Оптимизация достигается через пространственные индексы (k-d tree, R-tree), уменьшающие количество расстояний, подлежащих вычислению.
При интеграции Turf.js в GIS-слой важно учитывать:
Результирующий GeoJSON часто преобразуется в raster tiles для отображения в веб-картах.