Отображение данных дорожного движения на карте (пакет SDK для Android)

На карте могут отображаться данные дорожного движения двух типов: плотность потока и происшествия. В этом руководстве описано, как отображать оба этих типа данных дорожного движения. Данные по происшествиям представляются в виде точек и линий, которые обозначают строительные работы, закрытие дорог, аварии и другие события подобного рода. Данные по плотности потока отражают характеристики скорости движения на автомобильной дороге.

Примечание.

Прекращение использования пакета SDK для Android для Azure Карты

Пакет SDK для машинного кода Azure для Android Карты теперь устарел и будет прекращен 3.31.25. Чтобы избежать сбоев в работе служб, перейдите в веб-пакет SDK для Azure Карты на 3.31.25. Дополнительные сведения см. в руководстве по миграции пакета SDK для Android Карты Azure.

Необходимые компоненты

Обязательно выполните действия, описанные в кратком руководстве по созданию приложения Android. Блоки кода, приведенные в этой статье, можно поместить в обработчик событий onReady для карт.

Отображение данных дорожного движения на карте

В Azure Maps доступны два типа данных трафика:

  • Данные по происшествиям — это данные в виде точек и линий, которые обозначают, помимо прочего, строительные работы, закрытие дорог и аварии.

  • Данные по потоку — метрики потока уличного движения. Данные по потоку уличного движения часто используются для раскрашивания дорог. Цвет зависит от того, насколько скорость движения потока меньше максимальной разрешенной скорости, или от другой метрики. В параметр дорожного движения flow карты можно передавать четыре значения.

    Перечисление потока Description
    TrafficFlow.NONE На карте не отображаются данные о дорожном движении
    TrafficFlow.RELATIVE Отображаются данные о дорожном движении, соответствующие движению без помех
    TrafficFlow.RELATIVE_DELAY Отображаются участки, скорость движения на которых меньше средней ожидаемой задержки
    TrafficFlow.ABSOLUTE Отображается абсолютная скорость всех транспортных средств на дороге

Ниже приведен код для отображения данных дорожного движения на карте.

//Show traffic on the map using the traffic options.
map.setTraffic(
    incidents(true),
    flow(TrafficFlow.RELATIVE)
);
map.setTraffic(
    incidents(true),
    flow(TrafficFlow.RELATIVE)
)

На следующем снимке экрана показано отображение на карте информации о дорожном движении, созданное с помощью приведенного выше кода.

Карта с отображением информации о дорожном движении в реальном времени

Получение сведений о ДТП

Сведения о дорожно-транспортных происшествиях доступны в свойствах компонента, который отображает происшествия на карте. Чтобы добавить на карту ДТП, используется служба векторных фрагментов карты Azure Maps для дорожно-транспортных происшествий. Формат и данные для этих векторных фрагментов задокументированы здесь. Следующий код добавляет на карту событие щелчка, получает компонент ДТП, для которого регистрируется этот щелчок, и отображает всплывающее сообщение с информацией о нем.

//Show traffic information on the map.
map.setTraffic(
    incidents(true),
    flow(TrafficFlow.RELATIVE)
);

//Add a click event to the map.
map.events.add((OnFeatureClick) (features) -> {

    if (features != null && features.size() > 0) {
        Feature incident = features.get(0);

        //Ensure that the clicked feature is an traffic incident feature.
        if (incident.properties() != null && incident.hasProperty("incidentType")) {

            StringBuilder sb = new StringBuilder();
            String incidentType = incident.getStringProperty("incidentType");

            if (incidentType != null) {
                sb.append(incidentType);
            }

            if (sb.length() > 0) {
                sb.append("\n");
            }

            //If the road is closed, find out where it is closed from.
            if ("Road Closed".equals(incidentType)) {
                String from = incident.getStringProperty("from");

                if (from != null) {
                    sb.append(from);
                }
            } else {
                //Get the description of the traffic incident.
                String description = incident.getStringProperty("description");

                if (description != null) {
                    sb.append(description);
                }
            }

            String message = sb.toString();

            if (message.length() > 0) {
                Toast.makeText(this, message, Toast.LENGTH_LONG).show();
            }
        }
    }
});
//Show traffic information on the map.
map.setTraffic(
    incidents(true),
    flow(TrafficFlow.RELATIVE)
)

//Add a click event to the map.
map.events.add(OnFeatureClick { features: List<Feature>? ->
    if (features != null && features.size > 0) {
        val incident = features[0]

        //Ensure that the clicked feature is an traffic incident feature.
        if (incident.properties() != null && incident.hasProperty("incidentType")) {
            val sb = StringBuilder()
            val incidentType = incident.getStringProperty("incidentType")

            if (incidentType != null) {
                sb.append(incidentType)
            }

            if (sb.length > 0) {
                sb.append("\n")
            }

            //If the road is closed, find out where it is closed from.
            if ("Road Closed" == incidentType) {
                val from = incident.getStringProperty("from")
                if (from != null) {
                    sb.append(from)
                }
            } else { //Get the description of the traffic incident.
                val description = incident.getStringProperty("description")
                if (description != null) {
                    sb.append(description)
                }
            }

            val message = sb.toString()
            if (message.length > 0) {
                Toast.makeText(this, message, Toast.LENGTH_LONG).show()
            }
        }
    }
})

На следующем снимке экрана представлена информация о дорожном движении в реальном времени, отображаемая на карте с помощью приведенного выше кода, где всплывающее сообщение содержит сведения о дорожном происшествии.

На карте отображается информация о дорожном движении в реальном времени и всплывающее сообщение со сведениями о ДТП.

Фильтр данных о дорожно-транспортных происшествиях

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

В следующей таблице показаны все категории дорожно-транспортных происшествий, которые можно использовать в параметре incidentCategoryFilter.

Перечисление категорий «Строковое значение» Description
IncidentCategory.UNKNOWN "unknown" Инцидент, который либо не соответствует ни одной из определенных категорий, либо еще не классифицирован.
IncidentCategory.ACCIDENT "accident" Дорожно-транспортное происшествие.
IncidentCategory.FOG "fog" Туман, который сокращает видимость, может уменьшить поток дорожного движения и, возможно, увеличить риск аварии.
IncidentCategory.DANGEROUS_CONDITIONS "dangerousConditions" Опасная ситуация на дороге, например объект на дороге.
IncidentCategory.RAIN "rain" Ливень, который может сократить видимость, усложнить условия движения и, возможно, увеличить риск аварии.
IncidentCategory.ICE "ice" Гололед, который может затруднить движение или создать опасную ситуацию на дороге.
IncidentCategory.JAM "jam" Транспортный затор, который может замедлить дорожное движение.
IncidentCategory.LANE_CLOSED "laneClosed" Дорожная полоса закрыта.
IncidentCategory.ROAD_CLOSED "roadClosed" Дорога закрыта.
IncidentCategory.ROAD_WORKS "roadWorks" В этой области проходят дорожные работы или строительство.
IncidentCategory.WIND "wind" Сильная ветреность, которая может затруднить движение транспортных средств с крупной боковой проекцией или высоким центром тяжести.
IncidentCategory.FLOODING "flooding" Затопление дороги.
IncidentCategory.DETOUR "detour" Дорожное движение осуществляется в объезд.
IncidentCategory.CLUSTER "cluster" Кластер дорожно-транспортных происшествий различных категорий. Увеличение масштаба карты приводит к разрыву кластера в отдельных инцидентах.
IncidentCategory.BROKEN_DOWN_VEHICLE "brokenDownVehicle" Разбитый автомобиль на дороге или обочине.

В следующей таблице показаны все величины дорожно-транспортных происшествий, которые можно использовать в параметре incidentMagnitudeFilter.

Перечисление величин «Строковое значение» Description
IncidentMagnitude.UNKNOWN "unknown" Происшествие, величина которого еще не классифицирована.
IncidentMagnitude.MINOR "minor" Незначительная проблема дорожного движения, которая часто используется только для информирования и оказывает минимальное влияние на поток автотранспорта.
IncidentMagnitude.MODERATE "moderate" Проблема дорожного движения средней тяжести, которая некоторым образом влияет на поток автотранспорта.
IncidentMagnitude.MAJOR "major" Серьезная проблема дорожного движения, которая оказывает значительное влияние на поток автотранспорта.

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

map.setTraffic(
    incidents(true),
    incidentMagnitudeFilter(new String[] { IncidentMagnitude.MODERATE }),
    incidentCategoryFilter(new String[] { IncidentCategory.DANGEROUS_CONDITIONS, IncidentCategory.JAM })              
);
map.setTraffic(
    incidents(true),
    incidentMagnitudeFilter(*arrayOf(IncidentMagnitude.MODERATE)),
    incidentCategoryFilter(
        *arrayOf(
            IncidentCategory.DANGEROUS_CONDITIONS,
            IncidentCategory.JAM
        )
    )
)

На следующем снимке экрана показана карта умеренных транспортных заторов и происшествий с опасными условиями.

Карта умеренных транспортных заторов и происшествий с опасными условиями.

Примечание.

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

Следующие шаги

Изучите следующие руководства, где описаны процессы добавления других данных на карту: