Валидация входных данных

Входные данные в Kepler.gl формируют основу всего конвейера визуализации и напрямую определяют корректность отображения слоёв, производительность рендеринга и стабильность взаимодействия с картой. Архитектура библиотеки предполагает работу с большими массивами геопространственных данных, где любая неконсистентность приводит к каскадным ошибкам на уровнях трансформации, агрегации и отрисовки.

Kepler.gl опирается на унифицированное представление данных, где каждая запись интерпретируется как объект с набором полей. Основные форматы включают:

  • CSV (табличные данные с координатами или геокодами)
  • GeoJSON (объектные геометрии)
  • JSON с пользовательской структурой
  • H3 индексы (при использовании пространственной индексации)

Ключевым требованием выступает наличие валидной геометрической или координатной информации. Без неё слой либо не инициализируется, либо исключается из визуализации.

Проверка схемы данных

Валидация схемы выполняется на уровне соответствия ожидаемым типам:

  • числовые поля координат должны быть типом number
  • временные метки должны быть интерпретируемы как timestamp или ISO-строка
  • категориальные поля должны быть строковыми значениями
  • геометрические поля GeoJSON обязаны соответствовать спецификации RFC 7946

Типичная схема для точечных данных:

{
  "lat": 55.751244,
  "lng": 37.618423,
  "timestamp": 1698765432000,
  "category": "sensor"
}

Ошибки схемы часто проявляются в виде:

  • NaN в координатах
  • строк вместо чисел
  • отсутствующих ключей в части записей

Валидация координат

Географические координаты проходят многоуровневую проверку:

  • широта: диапазон от -90 до 90
  • долгота: диапазон от -180 до 180
  • отсутствие null, undefined, NaN

Дополнительная проверка учитывает географическую адекватность данных. Например, массовое скопление точек вне суши может сигнализировать о смещении порядка координат (lat/lng swap).

Пример защитной проверки:

function isValidCoordinate(lat, lng) {
  return (
    typeof lat === 'number' &&
    typeof lng === 'number' &&
    lat >= -90 && lat <= 90 &&
    lng >= -180 && lng <= 180 &&
    !Number.isNaN(lat) &&
    !Number.isNaN(lng)
  );
}

Валидация временных полей

Временные данные критичны для временных слоёв (trip layer, arc layer, time filter). Основные требования:

  • единый формат времени в наборе данных
  • отсутствие смешанных типов (timestamp + ISO string одновременно)
  • корректная конвертация в Date

Типичные ошибки:

  • строки, не соответствующие ISO 8601
  • секунды вместо миллисекунд
  • локальное время без временной зоны

Нормализация времени:

function normalizeTime(value) {
  const date = new Date(value);
  const timestamp = date.getTime();

  if (Number.isNaN(timestamp)) return null;
  return timestamp;
}

Проверка геометрии GeoJSON

GeoJSON требует строгой структуры объектов:

  • обязательное поле type
  • корректные координатные массивы
  • замкнутые полигоны (для Polygon)
  • отсутствие самопересечений (для корректной визуализации)

Проблемные случаи:

  • пустые coordinates: []
  • некорректная вложенность массивов
  • перепутанный порядок координат [lng, lat] vs [lat, lng]

Минимальная проверка типа геометрии:

function validateGeoJSONFeature(feature) {
  if (!feature || feature.type !== 'Feature') return false;
  if (!feature.geometry) return false;

  const { geometry } = feature;

  if (!geometry.type || !geometry.coordinates) return false;

  return Array.isArray(geometry.coordinates);
}

Очистка и нормализация данных

Перед передачей в Kepler.gl данные проходят этап нормализации, включающий:

  • удаление строк с критическими дефектами
  • приведение числовых значений к типу number
  • унификацию названий полей
  • заполнение пропусков значениями null вместо undefined

Стратегии очистки зависят от объёма данных. При больших датасетах предпочтение отдается ленивой фильтрации без глубокого копирования массива.

Валидация под слои Kepler.gl

Разные слои предъявляют различные требования:

Point Layer

  • обязательны координаты
  • допустимы дополнительные атрибуты (цвет, размер)

Arc Layer

  • требуется пара координат (source/target)
  • обязательна валидность обеих точек

Heatmap Layer

  • допускается агрегация по плотности
  • координаты должны быть распределены равномерно по диапазону

Hexagon Layer

  • поддержка агрегируемых значений
  • предпочтительны плотные выборки точек

Ошибки в данных слоя приводят к частичному отсутствию рендера или деградации производительности.

Проверка консистентности полей

Консистентность подразумевает одинаковую структуру записей по всему массиву:

  • одинаковые ключи
  • одинаковые типы значений
  • отсутствие динамических схем внутри массива

Проблемный пример:

[
  { "lat": 10, "lng": 20 },
  { "lat": "10.5", "lng": 21.1 }
]

Такая неоднородность приводит к ошибкам агрегации и невозможности построения слоёв.

Обработка пропусков и null-значений

Kepler.gl частично игнорирует null, но критические поля не допускают пустых значений:

  • координаты: обязательны
  • временные поля: обязательны для temporal layers
  • агрегируемые числовые поля: допустимы null при условии фильтрации

Стратегии обработки:

  • удаление записей
  • замена на средние значения (для аналитических слоёв)
  • интерполяция временных рядов

Производительность и предварительная валидация

Валидация больших массивов данных требует оптимизации:

  • использование итераторов вместо копирования массивов
  • предварительная фильтрация по ключевым полям
  • отказ от глубоких проверок для некритичных атрибутов

Оптимизированная схема проверки:

function fastValidate(dataset) {
  for (let i = 0; i < dataset.length; i++) {
    const d = dataset[i];
    if (d.lat == null || d.lng == null) continue;
    if (!isValidCoordinate(d.lat, d.lng)) return false;
  }
  return true;
}

Ошибки интеграции с Kepler.gl state

Валидация данных тесно связана с состоянием приложения:

  • несоответствие данных и config.layers
  • отсутствие ссылок на поля в конфигурации
  • несовпадение типов между dataset и layer props

Типичный сбой возникает при изменении структуры данных без обновления конфигурации слоя, что приводит к silent failure — слой отображается пустым без явной ошибки.

Валидация при динамической загрузке данных

При потоковой или асинхронной загрузке добавляется дополнительный уровень контроля:

  • проверка чанков данных
  • дедупликация записей
  • контроль последовательности временных данных

Особое внимание уделяется частичному обновлению dataset, когда новые данные дополняют существующие без полной перезагрузки слоя.

Защита от структурных аномалий

Структурные аномалии включают:

  • циклические ссылки в объектах
  • чрезмерно вложенные структуры
  • смешивание геометрий разных типов в одном слое

Рекомендуется жёсткое разделение dataset по типам геометрии и назначению, поскольку Kepler.gl ожидает предсказуемую структуру входа для каждого слоя.