Расчет центра масс

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

В Turf.js расчёт центра масс реализуется через turf.centerOfMass, который отличается от простого геометрического центра тем, что учитывает площадь и структуру полигона, включая вырезы и сложные контуры.

Геометрическая интерпретация центра масс

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

Ключевые особенности:

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

Математически для набора треугольников:

[ C = ]

где:

  • (A_i) — площадь i-го треугольника
  • (C_i) — его центр масс

Отличие центра масс от центроида в Turf.js

Turf.js предоставляет два близких метода:

  • turf.centroid — геометрический центр (среднее положение координат вершин)
  • turf.centerOfMass — физически корректный центр распределённой площади

Ключевое различие:

  • centroid игнорирует площадь и форму распределения
  • centerOfMass учитывает геометрию поверхности

На вытянутых или вогнутых полигонах различие может быть значительным.

Базовое использование turf.centerOfMass

import * as turf from "@turf/turf";

const polygon = turf.polygon([[
  [30, 10],
  [40, 40],
  [20, 40],
  [10, 20],
  [30, 10]
]]);

const center = turf.centerOfMass(polygon);

console.log(center.geometry.coordinates);

Результатом является GeoJSON Point с координатами центра масс.

Работа с MultiPolygon

Для составных объектов расчёт выполняется по всем частям одновременно с учётом площади каждой компоненты.

const multiPolygon = turf.multiPolygon([
  [[[0, 0], [4, 0], [4, 4], [0, 4], [0, 0]]],
  [[[6, 0], [10, 0], [10, 2], [6, 2], [6, 0]]]
]);

const center = turf.centerOfMass(multiPolygon);

Алгоритм агрегирует вклад каждой геометрии, нормируя по общей площади.

Влияние отверстий в полигонах

Полигоны с вырезами изменяют распределение массы, так как внутренние области исключаются из расчёта.

const polygonWithHole = turf.polygon([
  [
    [0, 0], [10, 0], [10, 10], [0, 10], [0, 0]
  ],
  [
    [3, 3], [7, 3], [7, 7], [3, 7], [3, 3]
  ]
]);

const center = turf.centerOfMass(polygonWithHole);

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

Внутренний алгоритм расчёта

Turf.js использует разбиение полигона на треугольники (triangulation). Далее применяется взвешенное усреднение.

Последовательность вычислений:

  1. Разбиение полигона на простые треугольники
  2. Вычисление площади каждого треугольника
  3. Нахождение центра каждого треугольника
  4. Умножение центра на площадь
  5. Суммирование результатов
  6. Деление на общую площадь

Особенность реализации заключается в корректной обработке:

  • самопересечений
  • дыр
  • многополигональных структур

Сравнение поведения на различных формах

Выпуклый многоугольник

Центр масс совпадает с центроидом, так как распределение симметрично.

Вогнутый многоугольник

Центр масс смещается в сторону более «тяжёлой» части фигуры.

Несимметричный MultiPolygon

Каждый компонент влияет пропорционально площади.

Использование свойств GeoJSON

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

const feature = turf.polygon(coordinates, {
  population: 12000
});

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

Комбинация с другими функциями Turf.js

Центр масс часто используется вместе с:

  • turf.bbox — для построения ограничивающего прямоугольника
  • turf.distance — для расчёта расстояний до других объектов
  • turf.nearestPoint — для поиска ближайших объектов
  • turf.center — альтернативный геометрический центр

Пример совместного использования:

const center = turf.centerOfMass(polygon);
const bbox = turf.bbox(polygon);

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

При работе с большим количеством вершин вычисление центра масс становится затратным, так как:

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

Оптимизации:

  • упрощение геометрии через turf.simplify
  • предварительное уменьшение количества вершин
  • разбиение данных на кластеры

Практическое значение в пространственном анализе

Центр масс используется в задачах:

  • размещение инфраструктуры относительно геометрических границ
  • вычисление «баланса» территорий
  • анализ распределения земельных участков
  • генерация точек привязки для картографических символов
  • построение маршрутов от геометрического ядра объекта