Heatmap-слой в MapLibre GL JS строится на основе пространственных
точечных данных. Основным форматом выступает GeoJSON с типом
FeatureCollection, где каждая точка содержит координаты и,
при необходимости, дополнительные числовые атрибуты, влияющие на
интенсивность отображения.
Типовая структура источника данных:
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
properties: {
magnitude: 1.2
},
geometry: {
type: 'Point',
coordinates: [71.4304, 51.1281]
}
},
{
type: 'Feature',
properties: {
magnitude: 2.5
},
geometry: {
type: 'Point',
coordinates: [71.4450, 51.1400]
}
}
]
}
});
Ключевое значение имеет плотность точек и наличие числового признака, используемого для взвешивания влияния каждой точки на итоговую визуализацию.
Heatmap-слой добавляется через map.addLayer с типом
heatmap. Он не рисует отдельные геометрические примитивы, а
формирует непрерывное распределение плотности на основе ближайших
точек.
Базовая конфигурация:
map.addLayer({
id: 'heatmap-layer',
type: 'heatmap',
source: 'points',
paint: {
'heatmap-weight': 1,
'heatmap-intensity': 1,
'heatmap-radius': 20,
'heatmap-opacity': 0.8
}
});
На этом уровне формируется простая тепловая карта, где каждая точка имеет одинаковый вклад.
heatmap-weight управляет вкладом каждой точки в итоговую
плотность. Значение может быть константой или выражением, основанным на
свойствах объекта.
Пример с использованием свойства magnitude:
'heatmap-weight': [
'interpolate',
['linear'],
['get', 'magnitude'],
0, 0,
6, 1
]
Принцип работы:
Параметр управляет общей «силой свечения» слоя. Особенно важен при масштабировании карты, поскольку плотность точек визуально уменьшается при увеличении масштаба.
'heatmap-intensity': [
'interpolate',
['linear'],
['zoom'],
0, 1,
9, 3
]
Особенности:
Радиус определяет область, в пределах которой точка влияет на соседние пиксели.
'heatmap-radius': [
'interpolate',
['linear'],
['zoom'],
0, 2,
9, 30
]
Практическое поведение:
Контроль видимости heatmap-слоя часто используется для плавного перехода к точечному представлению данных на высоких зумах.
'heatmap-opacity': [
'interpolate',
['linear'],
['zoom'],
7, 1,
10, 0
]
Такой подход позволяет:
Цветовое представление задаётся через интерполяцию плотности. Значение нормализуется в диапазоне от 0 до 1.
'heatmap-color': [
'interpolate',
['linear'],
['heatmap-density'],
0, 'rgba(33,102,172,0)',
0.2, 'rgb(103,169,207)',
0.4, 'rgb(209,229,240)',
0.6, 'rgb(253,219,199)',
0.8, 'rgb(239,138,98)',
1, 'rgb(178,24,43)'
]
Принцип формирования:
Heatmap в MapLibre GL JS чувствителен к масштабу карты. Для корректного поведения параметры часто связываются с уровнем zoom.
Типичная стратегия:
Пример комплексной настройки:
'heatmap-radius': [
'interpolate',
['linear'],
['zoom'],
0, 10,
12, 40
],
'heatmap-intensity': [
'interpolate',
['linear'],
['zoom'],
0, 1,
12, 4
],
'heatmap-opacity': [
'interpolate',
['linear'],
['zoom'],
10, 1,
14, 0
]
Практически всегда heatmap используется совместно с circle-слоем, который отображает отдельные точки при высоком приближении.
map.addLayer({
id: 'point-layer',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 4,
'circle-color': 'rgba(0, 0, 0, 0.7)',
'circle-stroke-width': 1,
'circle-stroke-color': '#fff',
'circle-opacity': [
'interpolate',
['linear'],
['zoom'],
7, 0,
10, 1
]
}
});
Логика взаимодействия слоёв:
При работе с большими наборами данных heatmap требует внимания к производительности рендеринга.
Ключевые подходы:
Большие массивы точек могут замедлять отрисовку. Применяется серверная агрегация или тайловые источники.
Вместо GeoJSON используется vector source:
map.addSource('tiles', {
type: 'vector',
url: 'mapbox://...'
});
Минимизация вычисляемых выражений в paint снижает
нагрузку на GPU.
Хотя heatmap и clustering решают разные задачи, кластеризация может снижать плотность данных до рендеринга:
map.addSource('points', {
type: 'geojson',
data: geojsonData,
cluster: true,
clusterRadius: 40
});
heatmap-density — внутренний нормализованный параметр,
отражающий локальную концентрацию точек.
Он не задаётся вручную, а вычисляется движком на основе:
Используется исключительно в стилях цвета:
['heatmap-density']
Heatmap применяется к разным категориям пространственных данных:
Для каждого типа данных важна корректная нормализация значений веса, иначе визуализация становится искажённой.
Распространённые проблемы возникают из-за неправильной конфигурации слоёв:
heatmap-weightHeatmap может динамически изменяться через setFilter,
что позволяет ограничивать отображаемые точки:
map.setFilter('heatmap-layer', [
'>=',
['get', 'magnitude'],
2
]);
Такой подход используется для:
Финальное качество heatmap определяется балансом трёх параметров:
Их совместная настройка позволяет управлять:
Комбинированная настройка часто выполняется через
interpolate и step выражения для обеспечения
плавного поведения при масштабировании карты.