Линейная интерполяция представляет собой метод вычисления промежуточного значения между двумя известными точками на основе коэффициента прогресса ( t ), где ( t ). В общем виде для одномерного случая формула записывается как:
[ P(t) = (1 - t) A + t B]
где:
При ( t = 0 ) результат совпадает с ( A ), при ( t = 1 ) — с ( B ), а при промежуточных значениях получается линейное смешение.
В геоинформационных системах эта формула применяется к координатам, что позволяет вычислять промежуточные точки на линии или траектории.
При работе с геоданными простое применение формулы к широте и долготе не всегда корректно из-за сферической природы Земли. Тем не менее существует два основных подхода:
Используется для небольших расстояний и предполагает, что поверхность Земли плоская:
[ lat(t) = (1 - t) lat_1 + t lat_2] [ lng(t) = (1 - t) lng_1 + t lng_2]
Этот метод прост, но даёт заметные искажения на больших расстояниях.
Учитывает кривизну Земли и выполняется вдоль большого круга (great circle). Именно этот подход применяется в большинстве функций Turf.js.
Библиотека Turf.js ориентирована на геопространственные вычисления и реализует интерполяцию через работу с GeoJSON-объектами.
Основная идея заключается не в прямом усреднении координат, а в вычислении точки на геодезической линии между объектами.
Типичные сущности:
Point — точкаLineString — линияFeatureCollection — набор объектовЛинейная интерполяция используется в задачах:
Одним из ключевых инструментов Turf.js является работа с расстояниями вдоль линии.
Функция turf.along позволяет вычислить точку на линии на
заданном расстоянии от начала.
import { lineString, along } from "@turf/turf";
const line = lineString([
[30.5, 50.5],
[31.0, 51.0],
[31.5, 51.5]
]);
const distance = 50; // километры
const point = along(line, distance, { units: "kilometers" });
Здесь происходит фактическая интерполяция вдоль геометрии линии, а не прямое линейное смешивание координат.
Для получения набора равномерных точек используется подход разбиения линии на сегменты.
Логика заключается в вычислении точек с равным шагом по длине линии.
import { lineString, lineSliceAlong, length } from "@turf/turf";
const line = lineString([
[30.0, 50.0],
[30.5, 50.2],
[31.0, 50.4]
]);
const total = length(line, { units: "kilometers" });
const steps = 10;
const points = [];
for (let i = 0; i <= steps; i++) {
const segment = (total * i) / steps;
const pt = lineSliceAlong(line, segment, segment, { units: "kilometers" });
points.push(pt);
}
Хотя lineSliceAlong возвращает отрезок, его можно
использовать для извлечения координат промежуточных точек.
Когда задача ограничивается двумя координатами, применяется геометрическое смешивание.
function interpolatePoint(a, b, t) {
return [
a[0] + (b[0] - a[0]) * t,
a[1] + (b[1] - a[1]) * t
];
}
const A = [30.0, 50.0];
const B = [31.0, 51.0];
const mid = interpolatePoint(A, B, 0.5);
Этот метод не учитывает кривизну Земли, но полезен для локальных задач, например UI-анимаций.
Turf.js предоставляет набор модулей, где интерполяция встроена в операции анализа линий и расстояний:
turf.along — точка на линии по расстояниюturf.lineDistance / length — длина
линииturf.lineSlice — вырезание сегмента линииturf.nearestPointOnLine — проекция точки на линиюКомбинация этих функций позволяет реализовать различные интерполяционные стратегии без ручного расчёта координат.
При больших расстояниях линейная интерполяция в декартовой системе приводит к существенным ошибкам.
Turf.js решает это через сферические вычисления:
Это особенно важно для:
Линейная интерполяция используется для построения плавного движения объекта по маршруту.
import { lineString, along, length } from "@turf/turf";
const route = lineString([
[30.0, 50.0],
[30.5, 50.3],
[31.0, 50.6]
]);
const totalDistance = length(route, { units: "kilometers" });
function getPosition(progress) {
return along(route, totalDistance * progress, {
units: "kilometers"
});
}
Здесь progress изменяется от 0 до 1, формируя
интерполяцию положения объекта во времени.
GeoJSON-объекты могут содержать свойства, которые также подлежат интерполяции.
Пример:
const A = { elevation: 100 };
const B = { elevation: 300 };
function interpolateProperty(a, b, t) {
return a + (b - a) * t;
}
В Turf.js геометрия и свойства обрабатываются отдельно:
Игнорирование кривизны Земли приводит к искажению траекторий.
Интерполяция по координатам не гарантирует равномерного движения по расстоянию.
При работе с самопересекающимися линиями требуется учитывать сегментацию, иначе интерполяция может давать неожиданные результаты.
Линейная интерполяция часто используется совместно с другими функциями Turf.js:
buffer — создание зоны вокруг интерполированной
точки,distance — контроль шага интерполяции,bearing — определение направления движения,destination — вычисление точки по направлению и
расстоянию.Такая комбинация позволяет строить динамические модели перемещения объектов в пространстве с учётом геометрии и расстояний.