При работе с геопространственными данными нередко возникает необходимость ограничить область отображения карты, запретить перемещение за пределы определённой территории, скрыть лишние данные или зафиксировать масштабирование. Такие механизмы особенно востребованы в корпоративных ГИС-системах, аналитических панелях, транспортных приложениях и специализированных картах, где пользователь должен работать только с заранее определённой областью.
В экосистеме Kepler.gl настройка границ и ограничений реализуется преимущественно через интеграцию с компонентами визуализации карты, состоянием приложения и возможностями используемого картографического движка. Поскольку Kepler.gl построен поверх Deck.gl и MapLibre/Mapbox GL, часть ограничений настраивается непосредственно через параметры карты.
Одной из наиболее распространённых задач является фиксация области, внутри которой разрешено перемещение карты.
Например, аналитическая система может содержать данные только по территории Казахстана. В таком случае перемещение карты к другим континентам не имеет практического смысла.
Для ограничения области используются координаты прямоугольника:
const bounds = [
[46.0, 40.0], // Юго-западный угол
[87.5, 55.5] // Северо-восточный угол
];
Формат:
[
[westLongitude, southLatitude],
[eastLongitude, northLatitude]
]
Такая структура определяет допустимую географическую область.
Если приложение использует Mapbox GL, ограничение карты может быть
задано через параметр maxBounds.
map.setMaxBounds([
[46.0, 40.0],
[87.5, 55.5]
]);
После применения:
Для интеграции с Kepler.gl обычно используется доступ к экземпляру карты через обёртки React-компонентов.
Во многих случаях требуется не только ограничить перемещение, но и установить начальное положение карты.
Конфигурация Kepler.gl хранит параметры вида в объекте
mapState.
Пример:
const config = {
version: "v1",
config: {
mapState: {
latitude: 48.0196,
longitude: 66.9237,
zoom: 4.5,
bearing: 0,
pitch: 0
}
}
};
Параметры:
| Свойство | Назначение |
|---|---|
| latitude | Центральная широта |
| longitude | Центральная долгота |
| zoom | Масштаб |
| bearing | Поворот карты |
| pitch | Наклон камеры |
Такая настройка позволяет гарантировать открытие карты в нужной области независимо от предыдущих действий пользователя.
Минимальный масштаб предотвращает чрезмерное отдаление карты.
Без такого ограничения пользователь может уменьшить масштаб настолько, что отображаемая территория станет неразличимой.
Пример:
const mapSettings = {
minZoom: 4
};
Логика работы:
Особенно полезно для локальных проектов:
Максимальный масштаб используется для запрета чрезмерного приближения.
Пример:
const mapSettings = {
maxZoom: 15
};
После установки:
Zoom 16 → запрещён
Zoom 17 → запрещён
Zoom 18 → запрещён
Подобное ограничение уменьшает нагрузку на рендеринг и предотвращает ситуации, когда пользователь приближается настолько, что геометрия данных теряет смысл.
Чаще всего ограничения задаются одновременно.
const mapSettings = {
minZoom: 4,
maxZoom: 12
};
Диапазон становится фиксированным:
4 ≤ zoom ≤ 12
Преимущества:
Kepler.gl поддерживает трёхмерный режим отображения.
Высокие значения наклона могут приводить к неудобному обзору.
Для контроля используется параметр pitch.
Пример фиксированного наклона:
mapState: {
pitch: 30
}
Для полного запрета изменения:
map.dragRotate.disable();
Либо:
map.touchZoomRotate.disableRotation();
Результат:
Поворот карты задаётся параметром bearing.
Пример:
mapState: {
bearing: 0
}
Для запрета пользовательского вращения:
map.dragRotate.disable();
Это особенно полезно для:
В подобных проектах север обычно должен всегда находиться сверху.
Границы могут относиться не только к карте, но и к данным.
Часто требуется показывать объекты исключительно внутри определённого региона.
Например:
const filteredData = dataset.filter(item => {
return (
item.longitude >= 46 &&
item.longitude <= 87 &&
item.latitude >= 40 &&
item.latitude <= 55
);
});
После фильтрации:
Для сложных границ прямоугольника недостаточно.
Например:
В таких случаях применяется библиотека Turf.js.
Полигон:
const polygon = {
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [[
[50, 40],
[70, 40],
[70, 55],
[50, 55],
[50, 40]
]]
}
};
Проверка попадания точки:
import booleanPointInPolygon
from "@turf/boolean-point-in-polygon";
const inside =
booleanPointInPolygon(point, polygon);
Полученное значение:
true
false
Используется при:
В больших проектах желательно запрещать загрузку файлов сверх определённого размера.
Пример проверки:
const MAX_SIZE = 50 * 1024 * 1024;
if (file.size > MAX_SIZE) {
throw new Error("Файл слишком большой");
}
Преимущества:
Миллионы точек могут существенно замедлять визуализацию.
Перед передачей данных в Kepler.gl часто выполняется предварительная проверка:
if (rows.length > 500000) {
throw new Error("Превышено допустимое количество записей");
}
Подобная стратегия позволяет контролировать производительность приложения.
Для временных наборов данных полезно ограничивать доступный период.
Пример:
const startDate =
new Date("2024-01-01");
const endDate =
new Date("2024-12-31");
Фильтрация:
const filtered = data.filter(item => {
const date = new Date(item.timestamp);
return (
date >= startDate &&
date <= endDate
);
});
Такой подход часто используется в:
Поскольку Kepler.gl активно использует Redux, ограничения могут вводиться на уровне действий.
Пример перехвата изменения состояния:
const restrictionMiddleware =
store => next => action => {
if (action.type === "MAP_MOVED") {
return;
}
return next(action);
};
Подход позволяет:
В корпоративных приложениях часто требуется разграничение прав.
Пример:
if (user.role !== "admin") {
hideLayerEditor();
}
Либо:
if (user.role === "viewer") {
disableDatasetUpload();
}
Типичная модель ролей:
| Роль | Возможности |
|---|---|
| Viewer | Просмотр |
| Analyst | Анализ и фильтрация |
| Editor | Редактирование данных |
| Admin | Полный доступ |
Подобные ограничения позволяют защитить данные от случайных изменений.
Некоторые слои могут быть скрыты в зависимости от условий.
Пример:
const visibleLayers =
layers.filter(layer => {
return layer.type !== "private";
});
Или:
layer.config.isVisible = false;
Механизм применяется для:
Kepler.gl допускает создание дополнительных обработчиков.
Пример контроля масштаба:
function onZoomChange(zoom) {
if (zoom > 12) {
return;
}
updateZoom(zoom);
}
Контроль координат:
function onMove(lng, lat) {
if (
lng < 46 ||
lng > 87 ||
lat < 40 ||
lat > 55
) {
return;
}
updatePosition(lng, lat);
}
Такой подход обеспечивает максимально гибкую систему ограничений.
Для производственной системы обычно используется комбинация нескольких механизмов одновременно:
const restrictions = {
minZoom: 4,
maxZoom: 12,
rotation: false,
pitch: false,
bounds: [
[46, 40],
[87, 55]
],
maxFileSize: 50 * 1024 * 1024,
maxRows: 500000
};
Комплексный подход обеспечивает:
Настройка границ и ограничений является важной частью архитектуры решений на основе Kepler.gl. Корректно настроенные ограничения позволяют управлять поведением карты, контролировать объём обрабатываемых данных, обеспечивать безопасность системы и поддерживать высокую производительность даже при работе с крупными геопространственными наборами данных.