Визуализация геоданных часто содержит десятки слоёв, множество категорий объектов, временные данные, различные наборы источников и дополнительные элементы интерфейса. Без механизмов управления отображением карта быстро становится перегруженной, теряет читаемость и усложняет анализ данных.
В библиотеке Kepler.gl управление видимостью позволяет:
Под видимостью понимается не только физическое отображение слоя на карте, но и участие данных в рендеринге, интерактивности, фильтрации и визуальном анализе.
Основным элементом визуализации в Kepler.gl является слой (Layer).
Каждый слой имеет свойство:
isVisible
Оно определяет, отображается слой на карте или нет.
Пример конфигурации:
{
id: 'cities',
type: 'point',
config: {
dataId: 'cities_dataset',
label: 'Cities',
isVisible: true
}
}
Если изменить значение на false, слой перестанет
отображаться:
{
config: {
isVisible: false
}
}
При этом данные остаются загруженными в приложение и могут быть снова показаны без повторного импорта.
Стандартный интерфейс Kepler.gl содержит панель управления слоями.
Для каждого слоя доступны:
При нажатии на иконку видимости происходит изменение параметра:
isVisible
Внутреннее состояние Redux обновляется автоматически, после чего запускается повторный рендер карты.
Kepler.gl построен на Redux, поэтому состояние отображения можно изменять программно.
Пример изменения видимости слоя:
dispatch({
type: 'LAYER_VISIBILITY_CHANGE',
payload: {
layerId: 'cities',
isVisible: false
}
});
На практике чаще используются готовые экшены библиотеки.
Например:
import {toggleLayerVisibility} from '@kepler.gl/actions';
dispatch(
toggleLayerVisibility('cities')
);
После выполнения экшена слой либо скрывается, либо отображается.
Состояние слоя можно получить из Redux Store.
Пример:
const state = store.getState();
const layers =
state.keplerGl.map.layers;
Поиск конкретного слоя:
const layer =
layers.find(
layer => layer.id === 'cities'
);
console.log(layer.config.isVisible);
Результат:
true
или
false
Это особенно полезно при создании собственных элементов управления интерфейсом.
В крупных проектах может потребоваться скрытие сразу нескольких слоёв.
Пример:
layers.forEach(layer => {
dispatch(
updateLayerConfig(
layer,
{
isVisible: false
}
)
);
});
После выполнения кода карта очищается от всех отображаемых слоёв.
Показать только один слой:
layers.forEach(layer => {
dispatch(
updateLayerConfig(
layer,
{
isVisible:
layer.id === 'roads'
}
)
);
});
Видимым останется только слой дорог.
Распространённым сценарием является работа с тематическими категориями.
Например:
Создаётся панель переключения:
const themes = {
transport: [
'roads',
'railways',
'airports'
],
geography: [
'rivers',
'lakes',
'borders'
]
};
При выборе темы:
function showTheme(theme) {
layers.forEach(layer => {
dispatch(
updateLayerConfig(
layer,
{
isVisible:
themes[theme]
.includes(layer.id)
}
)
);
});
}
Карта становится значительно удобнее для анализа конкретной предметной области.
Один слой связан с определённым набором данных через параметр:
dataId
Например:
{
dataId: 'earthquakes'
}
Если набор данных удаляется:
dispatch(
removeDataset('earthquakes')
);
Все связанные слои автоматически становятся недоступными для отображения.
Таким образом видимость слоя зависит не только от параметра
isVisible, но и от существования связанного источника
данных.
Иногда требуется скрывать не слой полностью, а только часть объектов.
Для этого используются фильтры.
Например, отображение городов только с населением более миллиона жителей.
Конфигурация фильтра:
{
dataId: 'cities',
name: 'population',
type: 'range',
value: [1000000, 50000000]
}
После применения фильтра:
Фильтры часто связываются с элементами управления.
Пример:
slider.addEventListener(
'input',
event => {
const minPopulation =
Number(event.target.value);
updateFilter(
minPopulation
);
}
);
Пользователь фактически управляет видимостью объектов внутри слоя без изменения самого слоя.
Kepler.gl предоставляет встроенную поддержку временных данных.
Если набор содержит поле даты:
timestamp
можно создать временной фильтр.
Пример:
{
type: 'timeRange',
name: 'timestamp'
}
При перемещении временного ползунка отображаются только записи, попадающие в выбранный интервал.
Такой подход широко используется для:
В режиме Time Playback объекты автоматически появляются и исчезают по мере продвижения временной шкалы.
Схематически процесс выглядит следующим образом:
08:00 -> отображаются объекты A
09:00 -> отображаются A и B
10:00 -> отображаются B и C
11:00 -> отображается C
При этом параметр isVisible слоя не меняется.
Меняется только состав отображаемых записей.
Для слоёв типа:
Hexagon
Grid
H3
GeoJSON
можно включать или отключать трёхмерную визуализацию.
Например:
{
visConfig: {
enable3d: true
}
}
или
{
visConfig: {
enable3d: false
}
}
Отключение трёхмерности может существенно уменьшить нагрузку на графический процессор.
Многие слои поддерживают текстовые подписи.
Пример настройки:
{
textLabel: [
{
field: {
name: 'city_name'
}
}
]
}
Для временного скрытия подписей используется пустая конфигурация:
{
textLabel: []
}
Это полезно при высокой плотности объектов.
Легенда помогает интерпретировать визуальные стили карты.
В зависимости от конфигурации приложения её можно:
Пример пользовательской настройки:
{
mapControls: {
legend: {
show: false
}
}
}
Сама карта продолжает отображаться без изменений.
Tooltip отображается при наведении курсора.
Настройка:
interactionConfig: {
tooltip: {
enabled: true
}
}
Отключение:
interactionConfig: {
tooltip: {
enabled: false
}
}
В этом случае объекты остаются видимыми, однако дополнительная информация не показывается.
В GeoJSON-слоях можно отдельно контролировать отображение контуров.
Пример:
visConfig: {
stroked: true
}
или
visConfig: {
stroked: false
}
Если контур отключён, остаётся только заливка полигона.
Отображение заливки также можно включать и выключать.
Пример:
visConfig: {
filled: true
}
или
visConfig: {
filled: false
}
Комбинации настроек позволяют создавать различные режимы визуализации:
| Контур | Заливка | Результат |
|---|---|---|
| Да | Да | Полигон |
| Да | Нет | Только границы |
| Нет | Да | Сплошная область |
| Нет | Нет | Объект фактически скрыт |
Часто видимость зависит от масштаба карты.
Например:
map.on('zoom', () => {
const zoom = map.getZoom();
dispatch(
updateLayerConfig(
roadsLayer,
{
isVisible: zoom > 8
}
)
);
});
Результат:
Такой подход уменьшает визуальный шум и улучшает производительность.
В сложных аналитических системах создаются предустановленные режимы отображения.
Например:
const presets = {
traffic: [
'roads',
'accidents'
],
weather: [
'temperature',
'wind'
],
population: [
'cities',
'density'
]
};
При выборе режима:
applyPreset('traffic');
видимость множества слоёв изменяется одним действием.
Конфигурация карты может экспортироваться в JSON.
Пример:
const config =
keplerGlSchema.save(
state.keplerGl.map
);
В экспортируемом объекте сохраняются:
После загрузки конфигурации карта восстанавливается в том же состоянии.
Наиболее эффективным способом повышения производительности является уменьшение количества одновременно отображаемых объектов.
Практические методы:
При работе с сотнями тысяч и миллионами объектов грамотное управление видимостью становится одним из ключевых инструментов оптимизации приложений на базе Kepler.gl.