Вычисление центроида

Центроид геометрического объекта в пространстве координат WGS84 представляет собой точку, которая может интерпретироваться как «центр масс» фигуры при равномерном распределении площади или вершин. В контексте геопространственных вычислений эта точка используется для упрощённого представления сложных геометрий, визуализации, кластеризации, анализа распределения объектов и построения пространственных индексов.

В библиотеке Turf.js вычисление центроида реализуется через функции centroid, center, а также дополнительные инструменты, связанные с агрегацией и геометрической нормализацией. Несмотря на внешнюю схожесть, эти функции решают разные задачи и дают разные результаты в зависимости от структуры входных данных.

Центроид полигона — это точка, координаты которой представляют собой усреднённое положение всех точек фигуры с учётом её геометрии. В простейшем случае для равномерной двумерной фигуры можно рассматривать центроид как:

  • среднее арифметическое координат всех вершин (для грубой аппроксимации);
  • точку, минимизирующую сумму квадратов расстояний до всех точек фигуры;
  • центр масс при равномерной плотности.

Для сложных полигонов с отверстиями и самопересечениями вычисление становится более строгим: используется формула площадного интегрирования (аналог формулы «площади Гаусса»).

Особенности геодезической системы координат

Turf.js работает в системе WGS84, где координаты представлены широтой и долготой. Это создаёт важное ограничение:

  • координаты не лежат в декартовой плоскости;
  • расстояния и площади искажены кривизной Земли;
  • прямое усреднение координат даёт приближённый результат.

Поэтому Turf.js применяет сферические приближения или проекционные преобразования внутри алгоритмов центроида.

Основные функции для вычисления центроида

centroid

Функция centroid вычисляет геометрический центр объекта с учётом его формы.

import centroid from '@turf/centroid';

const polygon = {
  type: "Feature",
  geometry: {
    type: "Polygon",
    coordinates: [[
      [30.0, 10.0],
      [40.0, 40.0],
      [20.0, 40.0],
      [10.0, 20.0],
      [30.0, 10.0]
    ]]
  }
};

const result = centroid(polygon);

console.log(result.geometry.coordinates);

Функция корректно обрабатывает:

  • Polygon
  • MultiPolygon
  • LineString
  • MultiLineString
  • FeatureCollection

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

center

Функция center вычисляет геометрический центр ограничивающего прямоугольника (bounding box), а не истинный центроид.

import center from '@turf/center';

const feature = {
  type: "Feature",
  geometry: {
    type: "Polygon",
    coordinates: [[
      [0, 0],
      [10, 0],
      [10, 10],
      [0, 10],
      [0, 0]
    ]]
  }
};

const result = center(feature);
console.log(result.geometry.coordinates);

Различие принципиально:

  • centroid учитывает форму объекта;
  • center учитывает только крайние координаты.

Алгоритм вычисления центроида в Turf.js

Внутренний алгоритм основан на декомпозиции геометрии на простые многоугольники и вычислении взвешенного центра масс.

Для полигона используется классическая формула:

[ C_x = (x_i + x_{i+1})(x_i y_{i+1} - x_{i+1} y_i)]

[ C_y = (y_i + y_{i+1})(x_i y_{i+1} - x_{i+1} y_i)]

где (A) — площадь многоугольника.

В случае MultiPolygon:

  • вычисляется центроид каждого полигона;
  • результаты взвешиваются по площади;
  • итоговый центр агрегируется.

Центроид линий и точечных наборов

Для LineString центроид вычисляется как среднее взвешенное по длине сегментов.

Для набора точек используется простое усреднение координат:

[ C_x = x_i, C_y = y_i]

При этом:

  • порядок точек не влияет на результат;
  • выбросы сильно смещают центр;
  • плотность распределения не учитывается.

Поведение для FeatureCollection

При передаче коллекции объектов применяется агрегация:

  • каждый Feature преобразуется в геометрию;
  • вычисляется индивидуальный центроид;
  • затем применяется взвешивание по площади или длине (в зависимости от типа);
  • результат объединяется в одну точку.

Пример:

import centroid from '@turf/centroid';

const collection = {
  type: "FeatureCollection",
  features: [
    {
      type: "Feature",
      geometry: {
        type: "Polygon",
        coordinates: [[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]]
      }
    },
    {
      type: "Feature",
      geometry: {
        type: "Polygon",
        coordinates: [[[5, 5], [7, 5], [7, 7], [5, 7], [5, 5]]]
      }
    }
  ]
};

const result = centroid(collection);

Итоговая точка будет расположена ближе к объекту с большей площадью.

Погрешности и ограничения

При вычислении центроида в географических координатах возникают следующие особенности:

  1. Искажение площади

    • на высоких широтах полигоны «сжимаются»;
    • центроид может смещаться относительно визуального центра.
  2. Анти-пересечение границ

    • полигоны через 180-й меридиан требуют нормализации;
    • без неё результат может оказаться некорректным.
  3. Самопересекающиеся полигоны

    • могут давать неожиданные центроиды;
    • алгоритм интерпретирует их как сложные фигуры с отрицательными областями.

Практические сценарии использования

Маркеры на карте

Центроид используется для размещения подписи объекта:

const labelPoint = centroid(cityPolygon);

Кластеризация

При группировке объектов центроид служит центром кластера:

  • упрощает визуализацию;
  • уменьшает количество точек;
  • позволяет строить heatmap-подобные представления.

Геокодирование регионов

Для административных границ:

  • страны;
  • регионы;
  • муниципалитеты;

центроид применяется как «представительная точка».

Различие centroid и center

Функция Основа вычисления Результат
centroid геометрия фигуры истинный центр массы
center bounding box центр ограничивающего прямоугольника

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

  • отсутствии сложной геометрии;
  • необходимости быстрой оценки;
  • работе с упрощёнными данными.

centroid применяется при:

  • аналитике пространственных данных;
  • точной геометрической интерпретации;
  • статистическом анализе распределений.

Обработка сложных геометрий

Для MultiPolygon с вложенными областями алгоритм учитывает:

  • внешние контуры;
  • внутренние отверстия;
  • вложенные острова.

Отрицательные области (holes) уменьшают итоговую площадь и влияют на смещение центра.

Производительность вычислений

Время вычисления центроида зависит от:

  • количества вершин;
  • числа геометрий в коллекции;
  • сложности полигонов.

Оптимизации Turf.js включают:

  • линейную сложность O(n) по вершинам;
  • предварительное упрощение геометрии;
  • кэширование промежуточных расчётов в некоторых операциях цепочек.

Частые ошибки при использовании

  • использование center вместо centroid при аналитике;
  • игнорирование MultiPolygon-структур;
  • попытка интерпретировать результат как «географический центр страны» без учёта проекций;
  • работа с невалидными GeoJSON-структурами.

Центроид и пространственная статистика

В аналитике центроид используется как:

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

В задачах машинного обучения на геоданных центроид часто выступает как:

  • feature reduction;
  • embedding геометрических объектов в вектор признаков;
  • входной параметр кластеризации (k-means в географическом пространстве).