В визуализации данных в Mapbox GL JS параметр радиуса является ключевым инструментом управления масштабом и выразительностью отображаемых объектов. Он используется в различных слоях и типах визуализации, включая точечные данные, тепловые карты и кластеры.
Основное применение радиуса в Mapbox GL JS связано с типом слоя
circle. Свойство circle-radius определяет
размер окружности в пикселях, которые будут отрисованы для каждой
точки.
map.addLayer({
id: 'cities',
type: 'circle',
source: 'cities-source',
paint: {
'circle-radius': 6,
'circle-color': '#3b82f6'
}
});
Радиус задаётся в экранных пикселях, а не в метрах или географических единицах, что делает поведение зависимым от масштаба карты.
Одной из ключевых особенностей является возможность привязки радиуса к уровню зума:
'circle-radius': [
'interpolate',
['linear'],
['zoom'],
5, 2,
10, 6,
15, 12
]
Такой подход позволяет:
Радиус может зависеть от атрибутов GeoJSON:
'circle-radius': [
'step',
['get', 'population'],
3,
100000,
6,
1000000,
12
]
Это позволяет визуализировать величину явления напрямую через размер объекта.
В слоях типа heatmap параметр
heatmap-radius определяет влияние каждой точки на
окружающее пространство.
map.addLayer({
id: 'heat',
type: 'heatmap',
source: 'points',
paint: {
'heatmap-radius': 20,
'heatmap-opacity': 0.8
}
});
Увеличение радиуса делает карту более сглаженной, уменьшение — более детализированной и «шумной».
При работе с GeoJSONSource радиус играет важную роль в
алгоритме кластеризации.
map.addSource('earthquakes', {
type: 'geojson',
data: 'earthquakes.geojson',
cluster: true,
clusterRadius: 50
});
clusterRadius определяет максимальное расстояние между
точками (в пикселях), при котором они объединяются в кластер.
Дополнительный параметр, ограничивающий уровень зума, на котором кластеризация активна:
clusterMaxZoom: 14
После достижения этого уровня данные перестают группироваться.
В контексте работы с радиусами и визуализацией важную роль играют ограничения производительности и архитектурные лимиты библиотеки.
Mapbox GL JS не имеет явного универсального параметра
limit для всех API, однако ограничения проявляются
через:
При чрезмерном количестве объектов может наблюдаться:
При запросах к отрисованным объектам используется метод
queryRenderedFeatures, который возвращает все попавшие в
область видимости элементы.
const features = map.queryRenderedFeatures({
layers: ['cities']
});
Хотя явный параметр limit не является основным
механизмом API, ограничения проявляются через:
Для уменьшения нагрузки применяется:
Радиус часто используется как логическая метрика поиска близости.
const center = map.getCenter();
const bbox = [
center.lng - 0.05,
center.lat - 0.05,
center.lng + 0.05,
center.lat + 0.05
];
const features = map.queryRenderedFeatures({
layers: ['points'],
filter: ['==', 'type', 'restaurant']
});
Хотя прямого радиусного фильтра в core API нет, радиус имитируется через:
turf.circle,
turf.buffer)Для точных операций используется библиотека геопространственных вычислений.
import * as turf from '@turf/turf';
const center = turf.point([30.5, 50.5]);
const radius = 5;
const options = { steps: 64, units: 'kilometers' };
const circle = turf.circle(center, radius, options);
Этот подход позволяет:
Радиус используется не только как геометрический параметр, но и как инструмент построения визуальной иерархии.
Использование больших радиусов в сочетании с высокой плотностью данных может приводить к деградации производительности.
interpolateRadius тесно связан с масштабированием сцены.
Радиус используется для формирования интуитивного восприятия расстояний и плотности:
При этом важно учитывать, что пиксельный радиус не соответствует реальному расстоянию без учёта масштаба карты, что требует дополнительной интерпретации при проектировании интерфейса.