Инциденты и дорожные события

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

В экосистеме HERE данные о дорожных событиях предоставляются через специализированные сервисы Traffic API, которые позволяют получать актуальную информацию о дорожной ситуации, отображать инциденты на карте и учитывать их при построении маршрутов.


Роль дорожных событий в картографических приложениях

Система дорожных событий решает несколько задач одновременно:

  • информирование пользователей о проблемах на дороге;
  • отображение текущих ограничений движения;
  • предупреждение о задержках;
  • оптимизация маршрутов;
  • анализ транспортной ситуации в реальном времени;
  • построение логистических сценариев.

Типичный сценарий работы выглядит следующим образом:

  1. Клиент запрашивает информацию о дорожной ситуации.
  2. HERE Traffic API возвращает список активных событий.
  3. События отображаются на карте.
  4. При выборе объекта показываются подробности.
  5. Маршрутизатор учитывает ограничения при расчёте пути.

Типы дорожных событий

HERE классифицирует дорожные события по нескольким категориям.

Аварии

Наиболее распространённый тип инцидентов.

Примеры:

  • столкновение автомобилей;
  • опрокидывание транспортного средства;
  • ДТП с перекрытием полос;
  • массовая авария.

Подобные события обычно содержат:

  • уровень серьёзности;
  • затронутые полосы движения;
  • направление движения;
  • ожидаемое время устранения.

Дорожные работы

События данной категории описывают:

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

В ответе сервиса могут присутствовать данные:

  • дата начала работ;
  • дата окончания;
  • степень влияния на движение;
  • закрытые полосы.

Перекрытия дорог

Временное или постоянное ограничение движения.

Причинами могут быть:

  • аварии;
  • ремонт;
  • массовые мероприятия;
  • чрезвычайные ситуации.

Часто такие события оказывают максимальное влияние на маршрутизацию.


Пробки и заторы

Информация формируется на основе:

  • телеметрии транспортных средств;
  • GPS-треков;
  • сенсорных данных;
  • исторической статистики.

Система позволяет определить:

  • скорость потока;
  • длину затора;
  • предполагаемую задержку;
  • уровень загруженности.

Погодные события

Некоторые регионы поддерживают отображение погодных ограничений.

Примеры:

  • сильный снегопад;
  • гололёд;
  • наводнение;
  • туман;
  • песчаная буря.

Специальные события

Отдельную группу составляют:

  • спортивные мероприятия;
  • концерты;
  • демонстрации;
  • праздничные шествия.

Подобные события могут приводить к временному изменению схем движения.


Получение данных через Traffic API

Для доступа к дорожным инцидентам используется REST API HERE.

Пример запроса:

const bbox = "52.4,13.2,52.6,13.5";

const url =
  `https://data.traffic.hereapi.com/v7/incidents?` +
  `in=bbox:${bbox}&apiKey=${apiKey}`;

fetch(url)
  .then(response => response.json())
  .then(data => {
    console.log(data);
  });

В параметре bbox указывается прямоугольная область поиска.

Формат:

south,west,north,east

Например:

52.4,13.2,52.6,13.5

Структура ответа

Типичный ответ содержит массив инцидентов.

Упрощённый пример:

{
  "results": [
    {
      "id": "12345",
      "type": "ACCIDENT",
      "criticality": "major",
      "description": {
        "value": "Accident on highway"
      }
    }
  ]
}

Ключевые поля:

Поле Описание
id идентификатор события
type тип события
criticality уровень серьёзности
description текстовое описание
location географические координаты
startTime время начала
endTime предполагаемое завершение

Загрузка инцидентов для текущей области карты

Часто требуется получать данные только для видимой части карты.

Получение границ:

const bounds = map.getViewModel()
  .getLookAtData()
  .bounds;

Формирование запроса:

const bbox =
  `${bounds.getBottom()},` +
  `${bounds.getLeft()},` +
  `${bounds.getTop()},` +
  `${bounds.getRight()}`;

Запрос:

async function loadIncidents() {
  const response = await fetch(
    `https://data.traffic.hereapi.com/v7/incidents` +
    `?in=bbox:${bbox}` +
    `&apiKey=${apiKey}`
  );

  return await response.json();
}

Такой подход существенно уменьшает объём передаваемых данных.


Отображение инцидентов на карте

После получения данных события можно преобразовать в маркеры.

function createIncidentMarker(lat, lng) {
  return new H.map.Marker({
    lat,
    lng
  });
}

Добавление объектов:

incidents.results.forEach(item => {

  const position = item.location.shape.links[0].points[0];

  const marker = createIncidentMarker(
    position.lat,
    position.lng
  );

  map.addObject(marker);

});

Создание пользовательских иконок

Стандартные маркеры редко подходят для транспортных приложений.

Создание собственной иконки:

const icon = new H.map.Icon(`
<svg width="32" height="32">
  <circle
    cx="16"
    cy="16"
    r="12"
    fill="red"
  />
</svg>
`);

Использование:

const marker = new H.map.Marker(
  position,
  { icon }
);

Разные значки для разных типов событий

Часто каждому типу назначается собственная визуализация.

function getIcon(type) {

  switch(type) {

    case "ACCIDENT":
      return accidentIcon;

    case "ROAD_CLOSED":
      return closedRoadIcon;

    case "CONSTRUCTION":
      return constructionIcon;

    default:
      return defaultIcon;
  }

}

Создание маркера:

const marker = new H.map.Marker(
  coords,
  {
    icon: getIcon(item.type)
  }
);

Всплывающие окна с подробной информацией

При выборе события полезно отображать дополнительные сведения.

Создание окна:

const bubble = new H.ui.InfoBubble(
  marker.getGeometry(),
  {
    content: description
  }
);

ui.addBubble(bubble);

Назначение обработчика:

marker.addEventListener("tap", () => {

  const bubble =
    new H.ui.InfoBubble(
      marker.getGeometry(),
      {
        content: item.description.value
      }
    );

  ui.addBubble(bubble);

});

Фильтрация дорожных событий

В крупных городах количество инцидентов может исчисляться сотнями.

Фильтрация по типу:

const accidents =
  incidents.results.filter(
    item => item.type === "ACCIDENT"
  );

Фильтрация по серьёзности:

const majorEvents =
  incidents.results.filter(
    item => item.criticality === "major"
  );

Отображение только важных событий

Практический подход:

const visibleIncidents =
  incidents.results.filter(item => {

    return (
      item.criticality === "major" ||
      item.criticality === "critical"
    );

  });

Это уменьшает визуальный шум на карте.


Кластеризация дорожных событий

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

Подготовка данных:

const dataPoints =
  incidents.results.map(item =>
    new H.clustering.DataPoint(
      item.lat,
      item.lng
    )
  );

Создание провайдера:

const provider =
  new H.clustering.Provider(
    dataPoints
  );

Слой:

const layer =
  new H.map.layer.ObjectLayer(
    provider
  );

map.addLayer(layer);

Кластеризация улучшает производительность и повышает читаемость карты.


Автоматическое обновление данных

Дорожная ситуация постоянно изменяется.

Обновление каждые 60 секунд:

setInterval(async () => {

  const incidents =
    await loadIncidents();

  updateMap(incidents);

}, 60000);

Перед повторной отрисовкой старые объекты обычно удаляются.

group.removeAll();

После этого добавляются новые маркеры.


Использование групп объектов

Удобно хранить инциденты внутри одной коллекции.

Создание группы:

const incidentGroup =
  new H.map.Group();

map.addObject(
  incidentGroup
);

Добавление маркеров:

incidentGroup.addObject(
  marker
);

Очистка:

incidentGroup.removeAll();

Построение маршрутов с учётом дорожной обстановки

Информация об инцидентах тесно связана с сервисом маршрутизации.

При расчёте маршрута HERE может учитывать:

  • пробки;
  • перекрытия;
  • ремонт дорог;
  • ограничения движения.

Пример параметра:

router.calculateRoute({
  transportMode: "car",
  origin: start,
  destination: finish,
  return: "summary,polyline",
  routingMode: "fast"
});

Если дорога перекрыта, алгоритм автоматически подберёт объездной путь.


Анализ задержек на маршруте

Маршрутизатор может возвращать данные о времени движения.

Пример:

route.sections[0].summary.duration

Дополнительно может присутствовать:

route.sections[0].summary.baseDuration

Разница между ними показывает влияние текущей дорожной ситуации.

const delay =
  duration - baseDuration;

Отображение затронутых участков дороги

Многие события содержат геометрию.

Например:

item.location.shape

Из неё формируется линия:

const lineString =
  new H.geo.LineString();

Добавление точек:

points.forEach(point => {

  lineString.pushPoint({
    lat: point.lat,
    lng: point.lng
  });

});

Создание полилинии:

const polyline =
  new H.map.Polyline(
    lineString
  );

Добавление на карту:

map.addObject(polyline);

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


Цветовая индикация серьёзности событий

Распространённая схема визуализации:

Уровень Цвет
minor зелёный
low жёлтый
major оранжевый
critical красный

Функция выбора цвета:

function getSeverityColor(level) {

  const colors = {
    minor: "#00aa00",
    low: "#f7d000",
    major: "#ff7b00",
    critical: "#ff0000"
  };

  return colors[level];
}

Использование цветовой кодировки позволяет быстро оценивать ситуацию на карте.


Обработка жизненного цикла событий

Каждый инцидент проходит несколько стадий:

  1. Появление.
  2. Подтверждение.
  3. Обновление информации.
  4. Устранение.
  5. Удаление из системы.

При периодическом обновлении необходимо:

  • добавлять новые события;
  • обновлять существующие;
  • удалять завершённые инциденты.

Для этого обычно создаётся словарь:

const incidentsMap =
  new Map();

Ключом выступает идентификатор события:

incidentsMap.set(
  incident.id,
  marker
);

Подобный механизм обеспечивает эффективную синхронизацию карты с актуальными данными Traffic API и позволяет создавать масштабируемые транспортные приложения, системы мониторинга дорожной обстановки, логистические платформы и навигационные решения реального времени на базе HERE Maps JavaScript API.