Грузовая маршрутизация

Грузовая маршрутизация (Truck Routing) в HERE Maps API предназначена для построения маршрутов с учётом ограничений, характерных для грузового транспорта. В отличие от стандартной автомобильной навигации, такие маршруты учитывают:

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

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


Архитектура маршрутизации в HERE

Для построения грузовых маршрутов используется сервис Routing API v8.

Запросы отправляются на сервер HERE, где производится анализ дорожной сети и рассчитывается оптимальный маршрут с учётом заданных характеристик транспорта.

Общая схема выглядит следующим образом:

  1. Определяются начальная и конечная точки.
  2. Указываются параметры грузовика.
  3. Передаются дополнительные ограничения.
  4. Routing API вычисляет допустимый путь.
  5. Полученный маршрут отображается на карте.

Подключение платформы HERE

Создание объекта платформы начинается с инициализации API-ключа.

const platform = new H.service.Platform({
    apikey: "YOUR_API_KEY"
});

Создание экземпляра Routing Service:

const router = platform.getRoutingService(null, 8);

Объект router используется для отправки запросов к Routing API v8.


Базовая грузовая маршрутизация

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

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    return: "polyline,summary"
};

Важнейшим параметром является:

transportMode: "truck"

Он сообщает системе, что расчёт должен выполняться для грузового транспорта.

Отправка запроса:

router.calculateRoute(
    routingParameters,
    onSuccess,
    onError
);

Обработка результата:

function onSuccess(result) {
    console.log(result);
}

Добавление характеристик грузовика

Наиболее важная часть грузовой маршрутизации — описание транспортного средства.

HERE позволяет задавать множество параметров.

Полная масса

truck[grossWeight]=18000

Значение указывается в килограммах.

Пример:

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    "truck[grossWeight]": 18000,
    return: "polyline"
};

Система автоматически исключит дороги, на которых действуют ограничения по массе.


Высота транспортного средства

truck[height]=4

Высота указывается в метрах.

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    "truck[height]": 4
};

Если на пути встретится тоннель высотой 3.8 метра, маршрут будет перестроен.


Ширина грузовика

truck[width]=2.6

Пример:

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    "truck[width]": 2.6
};

Учитываются узкие улицы и дорожные ограничения.


Длина транспортного средства

truck[length]=12

Пример:

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    "truck[length]": 12
};

Маршрут будет учитывать ограничения для длинномерного транспорта.


Количество осей

truck[shippedHazardousGoods]

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

Пример:

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    "truck[axleCount]": 4
};

Работа с опасными грузами

HERE поддерживает маршрутизацию для перевозки опасных материалов.

Пример:

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    "truck[shippedHazardousGoods]": "flammable"
};

Некоторые допустимые категории:

explosive
gas
flammable
combustible
organic
poison
radioactive
corrosive
poisonousInhalation
harmfulToWater

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


Ограничения тоннелей

Для перевозки опасных веществ особое значение имеют категории тоннелей.

Пример:

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    tunnelCategory: "B"
};

Допустимые значения:

A
B
C
D
E

Категории соответствуют европейским нормам ADR.

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


Исключение платных дорог

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

Для этого используются специальные параметры исключений.

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    avoid: {
        features: ["tollRoad"]
    }
};

Также можно исключать:

avoid: {
    features: [
        "ferry",
        "tunnel",
        "dirtRoad",
        "controlledAccessHighway"
    ]
}

Оптимизация по времени

По умолчанию сервис стремится построить наиболее быстрый маршрут.

const routingParameters = {
    transportMode: "truck",
    routingMode: "fast",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297"
};

Режимы:

fast
short

Fast

Поиск маршрута с минимальным временем движения.

routingMode: "fast"

Short

Поиск кратчайшего пути.

routingMode: "short"
routingMode: "short"

Такой маршрут не всегда является самым быстрым.


Использование промежуточных точек

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

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    via: [
        "50.2546,28.6587",
        "49.4229,26.9871"
    ],
    destination: "49.8397,24.0297"
};

Промежуточные точки помогают моделировать реальные логистические маршруты.


Получение подробной информации о маршруте

Для анализа перевозки часто требуется расширенная информация.

const routingParameters = {
    transportMode: "truck",
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297",
    return: "summary,polyline,actions,instructions"
};

Описание параметров:

Параметр Назначение
summary сводная информация
polyline геометрия маршрута
actions список манёвров
instructions текстовые инструкции

Получение расстояния и времени

После расчёта маршрута можно получить статистику.

function onSuccess(result) {

    const section = result.routes[0].sections[0];

    console.log(
        section.summary.length
    );

    console.log(
        section.summary.duration
    );
}

Пример результата:

{
    length: 532481,
    duration: 23456
}

Где:

  • length — расстояние в метрах;
  • duration — время в секундах.

Декодирование полилинии

HERE возвращает геометрию маршрута в сжатом формате Polyline.

const lineString =
    H.geo.LineString.fromFlexiblePolyline(
        section.polyline
    );

Создание объекта линии:

const routeLine = new H.map.Polyline(
    lineString,
    {
        style: {
            lineWidth: 5
        }
    }
);

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

map.addObject(routeLine);

Отображение грузового маршрута

Полный пример визуализации.

function showRoute(result) {

    const route =
        result.routes[0];

    route.sections.forEach(section => {

        const linestring =
            H.geo.LineString
                .fromFlexiblePolyline(
                    section.polyline
                );

        const polyline =
            new H.map.Polyline(
                linestring,
                {
                    style: {
                        lineWidth: 6
                    }
                }
            );

        map.addObject(polyline);
    });
}

Анализ манёвров

Каждый участок маршрута содержит действия водителя.

section.actions.forEach(action => {

    console.log(
        action.instruction
    );

});

Пример:

Поверните направо
Через 300 метров держитесь левее
Съезд на автомагистраль

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


Работа с несколькими маршрутами

Сервис способен возвращать альтернативные варианты.

const routingParameters = {
    transportMode: "truck",
    alternatives: 3,
    origin: "50.4501,30.5234",
    destination: "49.8397,24.0297"
};

В ответе будет несколько допустимых маршрутов.

result.routes.forEach(route => {

    console.log(route);

});

Это позволяет сравнивать:

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

Расчёт стоимости перевозки

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

const distanceKm =
    section.summary.length / 1000;

const fuelCost =
    distanceKm * 0.35;

console.log(fuelCost);

Более реалистичная модель может учитывать:

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

Комбинирование ограничений

На практике параметры обычно используются совместно.

const routingParameters = {
    transportMode: "truck",

    origin: "50.4501,30.5234",

    destination: "49.8397,24.0297",

    "truck[grossWeight]": 26000,

    "truck[height]": 4.2,

    "truck[width]": 2.6,

    "truck[length]": 14,

    "truck[axleCount]": 5,

    "truck[shippedHazardousGoods]":
        "flammable",

    routingMode: "fast",

    return:
        "summary,polyline,actions"
};

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