В контексте Mapbox GL JS радиус влияния точки не является встроенным геометрическим объектом в чистом виде — он формируется на уровне визуализации, данных или пространственных запросов.
Радиус может трактоваться в трёх основных измерениях:
Каждый из этих подходов опирается на разные механизмы работы движка WebGL и источников данных GeoJSON.
На уровне стилей радиус часто задаётся через свойства слоёв типа
circle и heatmap.
Для слоя circle ключевым параметром выступает:
map.addLayer({
id: 'points',
type: 'circle',
source: 'points-source',
paint: {
'circle-radius': 10,
'circle-color': '#ff0000'
}
});
Фиксированное значение радиуса в пикселях создаёт стабильное визуальное восприятие точки, однако не учитывает масштаб карты.
Для адаптивного поведения используется интерполяция по зуму:
'circle-radius': [
'interpolate',
['linear'],
['zoom'],
5, 2,
10, 8,
15, 20
]
Такой подход позволяет формировать визуальный радиус влияния, который увеличивается при приближении карты.
Heatmap в Mapbox GL JS моделирует плотность точек как непрерывное поле влияния.
Ключевые параметры:
heatmap-radius — радиус влияния точкиheatmap-intensity — сила влиянияheatmap-weight — вес отдельной точкиПример конфигурации:
map.addLayer({
id: 'heatmap-layer',
type: 'heatmap',
source: 'points-source',
paint: {
'heatmap-radius': 30,
'heatmap-intensity': 1,
'heatmap-opacity': 0.8
}
});
Радиус здесь интерпретируется как область размытия влияния точки, где каждая точка создаёт гауссово распределение плотности.
Для задач анализа данных требуется радиус в реальных единицах измерения. Mapbox GL JS работает в координатах WGS84 (долгота/широта), поэтому прямое вычисление расстояний требует геодезических формул.
Используется формула гаверсинуса или специализированные библиотеки, такие как Turf.js.
Пример фильтрации точек в радиусе 5 км:
import * as turf from '@turf/turf';
const center = turf.point([76.9457, 43.2551]);
const radius = 5;
const options = { units: 'kilometers' };
const buffered = turf.buffer(center, radius, options);
Далее результат используется для фильтрации GeoJSON:
const pointsWithin = turf.pointsWithinPolygon(points, buffered);
Такой подход формирует строгую геометрическую область влияния точки.
В Mapbox GL JS существует разрыв между экранными и географическими координатами. Один и тот же радиус в пикселях соответствует разным расстояниям в метрах в зависимости от зума и широты.
Для преобразования используется:
map.project(lngLat) — перевод в экранные
координатыmap.unproject(point) — обратное преобразованиеПример вычисления географического радиуса из пикселей:
const center = map.project([76.9457, 43.2551]);
const edge = { x: center.x + 50, y: center.y };
const lngLatEdge = map.unproject(edge);
Далее расстояние между точками вычисляется как географическая дистанция.
Mapbox GL JS предоставляет методы выборки объектов в пределах экрана:
map.queryRenderedFeatures(point, {
layers: ['points']
});
Однако этот метод работает в пределах пиксельного радиуса, который задаётся вручную:
const bbox = [
[x - r, y - r],
[x + r, y + r]
];
map.queryRenderedFeatures(bbox, {
layers: ['points']
});
Таким образом формируется квадратная зона влияния, которая часто аппроксимирует круговой радиус.
При использовании проекции Web Mercator возникают искажения:
Это приводит к необходимости разделения логики:
Mapbox GL JS поддерживает выражения, позволяющие динамически изменять радиус:
'circle-radius': [
'interpolate',
['linear'],
['get', 'value'],
0, 2,
100, 20
]
Таким образом каждая точка получает индивидуальную зону влияния в зависимости от атрибутов данных.
При большом количестве точек радиусы начинают перекрываться, формируя:
Кластеризация активируется на уровне источника данных:
const source = {
type: 'geojson',
data: points,
cluster: true,
clusterRadius: 50
};
clusterRadius определяет расстояние в пикселях, в
пределах которого точки объединяются.
Адаптация радиуса к зуму позволяет сохранять смысловую консистентность:
'heatmap-radius': [
'interpolate',
['exponential', 2],
['zoom'],
0, 2,
10, 20,
15, 40
]
Такой подход компенсирует увеличение детализации при приближении карты.
Обобщённая модель радиуса влияния в Mapbox GL JS включает три слоя:
Каждый слой оперирует собственной системой координат и единиц измерения, что формирует многомерную модель влияния точек в веб-картографии.