Mostrar dados de tráfego no mapa (SDK do Android)

Os dados de fluxo e os dados de incidentes são os dois tipos de dados de tráfego que podem ser exibidos no mapa. Este guia mostra como exibir os dois tipos de dados de tráfego. Os dados de incidentes consistem em dados baseados em linha e ponto para itens como obras, fechamentos de estrada e acidentes. Os dados de fluxo mostram métricas sobre o fluxo de tráfego em trânsito.

Observação

Desativação do SDK do Android do Azure Mapas

O SDK Nativo do Azure Mapas para Android já foi preterido e será desativado em 31/03/25. Para evitar interrupções de serviço, migre para o SDK da Web do Azure Mapas até 31/03/25. Para obter mais informações, confira O guia de migração do SDK do Android do Azure Mapas.

Pré-requisitos

Conclua as etapas no documento Início Rápido: Criar um aplicativo Android. Os blocos de código neste artigo podem ser inseridos no manipulador de eventos onReady dos mapas.

Mostrar tráfego no mapa

Há dois tipos de dados de tráfego disponíveis no Azure Mapas:

  • Dados de incidentes – consistem em dados baseados em ponto e em linha para coisas como obras, fechamentos de estrada e acidentes.

  • Dados de fluxo – fornecem métricas sobre o fluxo do tráfego nas estradas. Os dados de fluxo de tráfego são frequentemente usados para colorir as estradas. As cores são baseadas no quanto o tráfego está diminuindo o fluxo, em relação ao limite de velocidade ou a outra métrica. Há quatro valores que podem ser passados para a opção flow de tráfego do mapa.

    Enumeração de fluxo Descrição
    TrafficFlow.NONE Não exibe dados de tráfego no mapa
    TrafficFlow.RELATIVE Mostra os dados de tráfego relativos à velocidade de fluxo livre da estrada
    TrafficFlow.RELATIVE_DELAY Exibe áreas em que o trânsito está mais lento do que o atraso médio esperado
    TrafficFlow.ABSOLUTE Mostra a velocidade absoluta de todos os veículos na estrada

O código a seguir mostra como exibir dados de tráfego no mapa.

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

A captura de tela a seguir mostra o código acima que renderiza as informações de tráfego em tempo real no mapa.

Mapa mostrando informações de tráfego em tempo real

Obter detalhes do incidente de tráfego

Os detalhes sobre um incidente de tráfego estão disponíveis nas propriedades do recurso usadas para exibir o incidente no mapa. Os incidentes de tráfego são adicionados ao mapa usando o serviço de bloco de vetor de incidente de tráfego dos Azure Mapas. O formato dos dados nesses blocos de vetor se documentados aqui. O código a seguir adiciona um evento de clique ao mapa e recupera o recurso de incidente de tráfego que foi clicado e exibe uma mensagem de notificação do sistema com alguns dos detalhes.

//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()
            }
        }
    }
})

A captura de tela a seguir mostra o código acima que renderiza informações de tráfego em tempo real no mapa com uma mensagem de notificação do sistema exibindo detalhes do incidente.

Mapa que mostra informações de tráfego em tempo real com uma mensagem de notificação do sistema exibindo detalhes do incidente

Filtrar incidentes de tráfego

Em um dia típico na maioria das principais cidades, pode haver um grande número de incidentes de tráfego. No entanto, dependendo do cenário, recomendamos filtrar e exibir um subconjunto desses incidentes. Quando você definir as opções de tráfego, haverá opções incidentCategoryFilter e incidentMagnitudeFilter que usam uma matriz de categorias de incidentes, enumeradores de magnitude ou valores de cadeia de caracteres.

A tabela a seguir mostra todas as categorias de incidentes de tráfego que podem ser usadas na opção incidentCategoryFilter.

Enumeração de categoria Valor da cadeia de caracteres Descrição
IncidentCategory.UNKNOWN "unknown" Um incidente que não se ajusta a nenhuma das categorias definidas ou ainda não foi classificado.
IncidentCategory.ACCIDENT "accident" Acidente de tráfego.
IncidentCategory.FOG "fog" Neblina que reduz a visibilidade, provavelmente reduzindo o fluxo de tráfego e, possivelmente, aumentando o risco de um acidente.
IncidentCategory.DANGEROUS_CONDITIONS "dangerousConditions" Situação perigosa na estrada, como um objeto na estrada.
IncidentCategory.RAIN "rain" Chuva forte que pode reduzir a visibilidade, dificultando as condições de condução e, possivelmente, aumentando o risco de um acidente.
IncidentCategory.ICE "ice" Condições de estrada com gelo que podem tornar a condução difícil ou perigosa.
IncidentCategory.JAM "jam" Congestionamento resultando em um tráfego com movimentação mais lenta.
IncidentCategory.LANE_CLOSED "laneClosed" Uma pista da estrada está fechada.
IncidentCategory.ROAD_CLOSED "roadClosed" Uma estrada está fechada.
IncidentCategory.ROAD_WORKS "roadWorks" Obras/construção na estrada nessa área.
IncidentCategory.WIND "wind" Ventos fortes que podem dificultar a condução de veículos com um grande perfil lateral ou um alto centro de gravidade.
IncidentCategory.FLOODING "flooding" Inundação na estrada.
IncidentCategory.DETOUR "detour" Tráfego direcionado para um desvio.
IncidentCategory.CLUSTER "cluster" Um cluster de incidentes de tráfego de diferentes categorias. A ampliação do mapa resulta na separação do cluster em incidentes individuais.
IncidentCategory.BROKEN_DOWN_VEHICLE "brokenDownVehicle" Veículo quebrado ou ao lado da estrada.

A tabela a seguir mostra todas as magnitudes de incidentes de tráfego que podem ser usadas na opção incidentMagnitudeFilter.

Enumeração de magnitude Valor da cadeia de caracteres Descrição
IncidentMagnitude.UNKNOWN "unknown" Um incidente cuja magnitude ainda não foi classificada.
IncidentMagnitude.MINOR "minor" Um problema secundário de tráfego que geralmente é destinado apenas a informações e tem impacto mínimo sobre o fluxo de tráfego.
IncidentMagnitude.MODERATE "moderate" Um problema moderado de tráfego que tem algum impacto sobre o fluxo de tráfego.
IncidentMagnitude.MAJOR "major" Um problema crítico de tráfego que tem um impacto significativo no fluxo de tráfego.

O código a seguir filtra os incidentes de tráfego de maneira que apenas os congestionamentos de tráfego moderados e os incidentes com condições perigosas sejam exibidos no mapa.

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
        )
    )
)

A captura de tela a seguir mostra um mapa de congestionamentos de tráfego moderados e incidentes com condições perigosas.

Mapa de congestionamentos de tráfego moderados e incidentes com condições perigosas.

Observação

Alguns incidentes de tráfego podem ter várias categorias atribuídas. Se um incidente tiver uma categoria que corresponda a qualquer opção transmitida para incidentCategoryFilter, ele será exibido. A categoria primária do incidente pode ser diferente das categorias especificadas no filtro e, portanto, exibir outro ícone.

Próximas etapas

Exiba os guias a seguir para saber como adicionar mais dados ao mapa: