В геоинформационных вычислениях центр масс представляет собой точку, в которой можно считать сосредоточенной «массу» геометрического объекта при равномерном распределении плотности. В контексте GeoJSON и библиотек пространственного анализа он используется для анализа формы, поиска оптимальных точек размещения объектов и построения упрощённых представлений геометрии.
В Turf.js расчёт центра масс реализуется через
turf.centerOfMass, который отличается от простого
геометрического центра тем, что учитывает площадь и структуру полигона,
включая вырезы и сложные контуры.
Для простых фигур центр масс совпадает с центроидом, но для сложных многоугольников различие становится существенным.
Ключевые особенности:
Математически для набора треугольников:
[ C = ]
где:
Turf.js предоставляет два близких метода:
turf.centroid — геометрический центр (среднее положение
координат вершин)turf.centerOfMass — физически корректный центр
распределённой площадиКлючевое различие:
На вытянутых или вогнутых полигонах различие может быть значительным.
turf.centerOfMassimport * 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 с координатами центра масс.
Для составных объектов расчёт выполняется по всем частям одновременно с учётом площади каждой компоненты.
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). Далее применяется взвешенное усреднение.
Последовательность вычислений:
Особенность реализации заключается в корректной обработке:
Центр масс совпадает с центроидом, так как распределение симметрично.
Центр масс смещается в сторону более «тяжёлой» части фигуры.
Каждый компонент влияет пропорционально площади.
Некоторые геометрии содержат свойства, которые могут использоваться в пользовательских вычислениях поверх центра масс.
const feature = turf.polygon(coordinates, {
population: 12000
});
Хотя centerOfMass не учитывает свойства напрямую,
результаты часто комбинируются с атрибутивными данными для
аналитики.
Центр масс часто используется вместе с:
turf.bbox — для построения ограничивающего
прямоугольникаturf.distance — для расчёта расстояний до других
объектовturf.nearestPoint — для поиска ближайших объектовturf.center — альтернативный геометрический центрПример совместного использования:
const center = turf.centerOfMass(polygon);
const bbox = turf.bbox(polygon);
При работе с большим количеством вершин вычисление центра масс становится затратным, так как:
Оптимизации:
turf.simplifyЦентр масс используется в задачах: