Линейная интерполяция

Линейная интерполяция представляет собой метод вычисления промежуточного значения между двумя известными точками на основе коэффициента прогресса ( t ), где ( t ). В общем виде для одномерного случая формула записывается как:

[ P(t) = (1 - t) A + t B]

где:

  • ( A ) — начальное значение,
  • ( B ) — конечное значение,
  • ( t ) — коэффициент интерполяции.

При ( 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: общая концепция

Библиотека 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/interpolate подходов

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 — вычисление точки по направлению и расстоянию.

Такая комбинация позволяет строить динамические модели перемещения объектов в пространстве с учётом геометрии и расстояний.