Определение ближайших объектов в геопространственных данных сводится
к вычислению расстояний между геометриями и выбору минимального
значения. В контексте GeoJSON каждый объект представляется как
Feature, содержащий геометрию (Point,
LineString, Polygon) и дополнительные
свойства.
Базовая задача формулируется так: для заданной точки или объекта найти другой объект из набора, расстояние до которого минимально.
В Turf.js этот процесс реализуется через комбинацию функций работы с расстояниями и коллекциями объектов.
Ключевой операцией является вычисление расстояния между двумя географическими координатами.
В Turf.js используется функция turf.distance, которая
рассчитывает расстояние по поверхности Земли (геодезическое расстояние),
обычно в километрах или милях.
import distance from '@turf/distance';
const from = [55.751244, 37.618423]; // Москва
const to = [59.934280, 30.335099]; // Санкт-Петербург
const dist = distance(from, to, { units: 'kilometers' });
Для поиска ближайшего объекта к заданной точке используется перебор всех кандидатов с вычислением расстояния.
import distance from '@turf/distance';
function findNearestPoint(target, points) {
let nearest = null;
let minDistance = Infinity;
for (const point of points.features) {
const d = distance(target, point, { units: 'kilometers' });
if (d < minDistance) {
minDistance = d;
nearest = point;
}
}
return nearest;
}
nearestPoint в Turf.jsВ библиотеке предусмотрена специализированная функция для поиска
ближайшей точки — nearestPoint.
import nearestPoint from '@turf/nearest-point';
import { point, featureCollection } from '@turf/helpers';
const target = point([30.0, 50.0]);
const points = featureCollection([
point([30.1, 50.1]),
point([29.8, 49.9]),
point([30.5, 50.2])
]);
const result = nearestPoint(target, points);
FeatureПри работе с линейными объектами применяется
nearestPointOnLine. Эта функция определяет ближайшую точку
на линии, а не среди дискретных точек.
import nearestPointOnLine from '@turf/nearest-point-on-line';
import { lineString, point } from '@turf/helpers';
const line = lineString([
[0, 0],
[10, 10],
[20, 0]
]);
const pt = point([12, 5]);
const snapped = nearestPointOnLine(line, pt);
Расширение задачи — нахождение нескольких ближайших объектов (K nearest neighbors).
В Turf.js отсутствует универсальная встроенная функция KNN, поэтому
используется комбинация distance и сортировки.
import distance from '@turf/distance';
function kNearest(target, points, k = 3) {
return points.features
.map(feature => {
const d = distance(target, feature, { units: 'kilometers' });
return { feature, distance: d };
})
.sort((a, b) => a.distance - b.distance)
.slice(0, k);
}
При увеличении объема данных линейный перебор становится неэффективным. Используются пространственные структуры.
Типичный подход:
Хотя Turf.js не является полноценной GIS-базой с индексами, он часто используется вместе с внешними структурами.
Ускорение достигается предварительным отбором объектов в ограниченном радиусе.
import distance from '@turf/distance';
function nearestWithinRadius(target, points, radiusKm) {
let nearest = null;
let min = Infinity;
for (const p of points.features) {
const d = distance(target, p, { units: 'kilometers' });
if (d <= radiusKm && d < min) {
min = d;
nearest = p;
}
}
return nearest;
}
Прямое расстояние между координатами.
Использование nearestPointOnLine.
Часто используется расстояние до границы полигона или проверка принадлежности:
booleanPointInPolygon для проверки попадания
внутрьdistance до ближайшей границы при внешнем
положенииВ реальных задачах поиск ближайшего объекта часто комбинируется с фильтрацией по атрибутам.
import distance from '@turf/distance';
function nearestByProperty(target, points, predicate) {
let nearest = null;
let min = Infinity;
for (const f of points.features) {
if (!predicate(f)) continue;
const d = distance(target, f, { units: 'kilometers' });
if (d < min) {
min = d;
nearest = f;
}
}
return nearest;
}
Применение:
Все операции поиска ближайших объектов предполагают работу с коллекциями:
import { featureCollection, point } from '@turf/helpers';
Структура:
FeatureCollectionfeaturesТиповой процесс определения ближайшего объекта включает этапы:
При равенстве расстояний алгоритмы обычно:
if (d === min) {
// дополнительная логика при равенстве
}
Turf.js работает с координатами в формате WGS84:
[lng, lat]Нарушение порядка координат приводит к некорректным результатам расстояний и выбору ближайших объектов.
nearestPoint