Применение функций к каждому элементу

Работа с геопространственными данными в Turf.js строится вокруг GeoJSON-структур, которые могут содержать различные типы объектов: точки, линии, полигоны и их коллекции. Для обработки таких структур на уровне отдельных элементов библиотека предоставляет набор функций итерации, позволяющих последовательно применять операции к каждому объекту, координате или набору свойств без необходимости вручную разбирать структуру GeoJSON.

Ключевой принцип таких функций заключается в абстрагировании внутренней структуры данных. Вместо того чтобы напрямую обходить вложенные массивы координат, используется единый интерфейс обхода, который обеспечивает предсказуемость и безопасность трансформаций.


Обход всех геообъектов коллекции

featureEach

Функция featureEach предназначена для последовательного обхода всех объектов Feature внутри FeatureCollection. Она не зависит от типа геометрии и рассматривает каждый элемент как отдельную сущность.

Сигнатура:

turf.featureEach(geojson, callback)

Поведение:

  • перебирает все элементы FeatureCollection
  • передаёт в callback каждый feature и его индекс
  • позволяет прекращать итерацию досрочно через false

Пример логики обработки:

turf.featureEach(collection, (feature, index) => {
    console.log(feature.geometry.type, index);
});

Особенности:

  • игнорирует вложенность геометрий внутри Feature
  • не модифицирует данные по умолчанию
  • применяется для фильтрации, анализа и накопления статистики

Итерация по координатам

coordEach

Функция coordEach предоставляет доступ к каждой координате внутри GeoJSON независимо от уровня вложенности структуры.

Сигнатура:

turf.coordEach(geojson, callback)

Callback получает:

  • координату [lng, lat]
  • индекс текущей координаты
  • индекс feature
  • индекс multi-геометрии (если применимо)

Пример обработки:

turf.coordEach(geojson, (coord) => {
    console.log(coord[0], coord[1]);
});

Использование:

  • нормализация координат
  • вычисление экстремумов (min/max)
  • преобразование систем координат
  • сбор статистики по всем точкам

Важная особенность заключается в том, что функция обходит даже вложенные структуры MultiPolygon и GeometryCollection, обеспечивая полный доступ ко всем координатам без ручного рекурсивного обхода.


Обход геометрий

geomEach

Функция geomEach работает на уровне геометрий, а не отдельных координат или Feature.

Сигнатура:

turf.geomEach(geojson, callback)

Callback получает:

  • geometry объекта
  • индекс feature
  • индекс geometry внутри коллекции (если применимо)

Пример:

turf.geomEach(geojson, (geometry) => {
    console.log(geometry.type);
});

Применение:

  • анализ типов геометрий в наборе данных
  • маршрутизация логики обработки по типу geometry
  • оптимизация вычислений на уровне структур

Особенность заключается в том, что геометрия рассматривается как атомарная единица, даже если она содержит сложную вложенность координат.


Итерация по свойствам объектов

propEach

Функция propEach позволяет работать исключительно с атрибутами properties каждого Feature.

Сигнатура:

turf.propEach(geojson, callback)

Callback получает:

  • объект properties
  • индекс feature

Пример:

turf.propEach(collection, (props) => {
    console.log(props.name);
});

Использование:

  • агрегация данных по атрибутам
  • фильтрация по бизнес-параметрам
  • построение статистических моделей

Особенность заключается в полном игнорировании геометрии, что делает функцию полезной для аналитических задач, где пространственная составляющая не важна.


Принцип единого обхода данных

Все перечисленные функции реализуют общий паттерн обхода GeoJSON, который можно описать как декомпозицию структуры на три уровня:

  • FeatureCollection → featureEach
  • Geometry → geomEach
  • Coordinates → coordEach
  • Properties → propEach

Такое разделение позволяет изолировать разные аспекты геоданных и применять к ним независимую логику.


Прерывание итерации

Во всех функциях обхода поддерживается возможность досрочного завершения цикла. Если callback возвращает false, дальнейшая обработка прекращается.

Пример:

turf.featureEach(collection, (feature) => {
    if (feature.properties.id === 10) return false;
});

Применение:

  • поиск первого совпадения
  • оптимизация производительности
  • обработка потоковых данных

Комбинирование итерационных функций

На практике функции обхода часто используются совместно. Например, сначала выполняется проход по Feature, затем внутри каждого Feature анализируются координаты.

Пример логической композиции:

turf.featureEach(collection, (feature) => {
    turf.coordEach(feature, (coord) => {
        // обработка каждой точки внутри feature
    });
});

Такой подход позволяет строить многоуровневые алгоритмы обработки геоданных без прямого доступа к внутренней структуре GeoJSON.


Изменение данных в процессе обхода

Хотя функции Turf.js не предназначены напрямую для мутации входных объектов, свойства и координаты могут быть изменены внутри callback.

Пример трансформации координат:

turf.coordEach(geojson, (coord) => {
    coord[0] = coord[0] + 0.001;
    coord[1] = coord[1] + 0.001;
});

Особенность:

  • изменения происходят in-place
  • структура GeoJSON сохраняется
  • требуется осторожность при работе с общими ссылками на объекты

Производительность итерационных операций

Итерационные функции Turf.js оптимизированы для работы с большими наборами геоданных. Основные особенности производительности:

  • линейная сложность O(n)
  • минимизация промежуточных структур
  • отсутствие рекурсивных вызовов в пользовательском коде
  • единый проход по памяти

Наиболее затратной операцией обычно является coordEach, так как количество координат в полигонах может быть значительно выше числа Feature.


Использование в аналитических задачах

Итерационные функции применяются как базовый слой для более сложных операций:

  • расчет центроидов через агрегацию координат
  • вычисление bounding box через min/max координат
  • классификация объектов по свойствам
  • фильтрация пространственных данных
  • подготовка данных для кластеризации

Их роль заключается в предоставлении универсального механизма доступа к данным без зависимости от конкретной геометрической модели.