В системах визуализации пространственных данных вес точки используется как числовой показатель значимости объекта, влияющий на его вклад в итоговое представление слоя. В Mapbox GL JS механизм веса применяется в нескольких контекстах: тепловые карты, кластеризация, динамическое стилизование символов и вычисление плотности распределения данных.
Вес точки представляет собой числовое значение ( w_i ), связанное с геометрическим объектом. При агрегации множества точек в пределах пиксельной области или кластера итоговая характеристика вычисляется как взвешенная сумма:
[ W = _{i=1}^{n} w_i]
При необходимости нормализации используется деление на суммарный вес:
[ W_{norm} = ]
В контексте визуализации это позволяет управлять интенсивностью отображения данных без изменения геометрической структуры источника.
В Mapbox GL JS тепловые карты используют свойство
heatmap-weight, которое определяет вклад каждой точки в
итоговую интенсивность пикселя.
Базовая логика заключается в следующем:
Пример:
map.addLayer({
id: 'heatmap-layer',
type: 'heatmap',
source: 'points',
paint: {
'heatmap-weight': [
'interpolate',
['linear'],
['get', 'weight'],
0, 0,
6, 1
]
}
});
Здесь атрибут weight из данных управляет вкладом каждой
точки. Низкие значения практически не влияют на плотность, высокие —
усиливают локальную интенсивность.
Практическая проблема при работе с весами — неоднородность входных данных. Если значения сильно варьируются, визуализация становится непропорциональной.
Используются следующие стратегии:
[ w’ = ]
Применяется при равномерных распределениях.
[ w’ = (1 + w)]
Используется при наличии выбросов и экспоненциальных распределений.
Разбиение диапазона на фиксированные интервалы, например:
В Mapbox GL JS такие преобразования часто выполняются через expression API.
Вес может быть заранее встроен в GeoJSON-объекты:
const geojson = {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
properties: {
weight: 2
},
geometry: {
type: 'Point',
coordinates: [71.4304, 51.1281]
}
}
]
};
В таком случае слой получает уже подготовленные значения, что снижает вычислительную нагрузку на рендеринг.
Одной из ключевых возможностей является изменение веса точки в зависимости от масштаба карты.
В Mapbox GL JS это реализуется через выражения:
'heatmap-weight': [
'interpolate',
['linear'],
['zoom'],
0, 0.2,
10, 1,
15, 2
]
Такой подход позволяет:
При включённой кластеризации точки объединяются в группы, где вес кластера вычисляется как сумма весов входящих объектов.
Типовая логика:
[ W_{cluster} = _{i=1}^{n} w_i]
Mapbox GL JS автоматически добавляет свойства:
point_count — количество точек;cluster — признак принадлежности к кластеру;cluster_id — идентификатор группы.Пример стилизации кластера по весу:
'circle-radius': [
'step',
['get', 'point_count'],
10,
10, 15,
50, 25
]
Хотя здесь используется количество точек, вместо него может
применяться агрегированный вес через clusterProperties.
Более гибкий механизм позволяет вычислять суммарные или средние значения прямо в процессе кластеризации:
clusterProperties: {
totalWeight: ['+', ['get', 'weight']]
}
Это позволяет:
Пример использования:
'circle-color': [
'interpolate',
['linear'],
['get', 'totalWeight'],
0, '#2DC4B2',
100, '#3BB3C3',
500, '#F1F075',
1000, '#F28CB1'
]
Вес точки может напрямую влиять на несколько параметров отображения:
circle-radius);circle-opacity);circle-color);heatmap-radius,
heatmap-intensity).Пример:
'circle-radius': [
'interpolate',
['linear'],
['get', 'weight'],
0, 3,
10, 20
],
'circle-opacity': [
'interpolate',
['linear'],
['get', 'weight'],
0, 0.3,
10, 1
]
Такой подход превращает вес в универсальный управляющий параметр визуального поведения объекта.
В реальных системах вес редко является одиночной величиной. Обычно он формируется как композиция факторов:
[ w = a + b + c]
где:
Такой подход позволяет строить адаптивные модели отображения данных без изменения геометрии источника.
При проектировании визуализаций в Mapbox GL JS часто возникают типовые проблемы:
Корректная настройка весов требует согласования диапазонов данных, логики агрегации и визуальных ограничений слоя.