Datos viales en tiempo real

Los datos viales en tiempo real proporcionan actualizaciones actuales sobre el estado de las rutas y los eventos para las rutas seleccionadas, lo que permite una supervisión dinámica y una respuesta rápida. Estos datos difieren de los que se recopilan periódicamente y están disponibles en BigQuery, y son adecuados para situaciones que requieren información oportuna.

Estos datos se transmiten de forma continua y comprenden la duración del viaje, que indica los tiempos de viaje en una ruta, y los intervalos de lectura de velocidad, que muestran la densidad de los tramos de ruta.

Para acceder a los datos viales en tiempo real, tu contrato debe incluir el paquete de Operaciones en tiempo real.

Crea una suscripción a Cloud Pub/Sub

Una vez que tu proyecto esté configurado para recibir datos en tiempo real, habrá un tema de Google Cloud Pub/Sub dedicado disponible para tu proyecto. En este tema de Pub/Sub, puedes encontrar los datos en tiempo real de todas las rutas que creaste.

En el siguiente ejemplo de código, se muestra el formato de la URL del tema.

projects/maps-platform-roads-management/topics/rmi-roadsinformation-PROJECT_NUMBER

Debes suscribirte al tema de Pub/Sub que se te proporciona para recibir mensajes de datos en tiempo real. Consulta Suscríbete a un tema para obtener una descripción general rápida sobre cómo suscribirte y consumir mensajes de un tema de Cloud Pub/Sub.

Esquema de mensajes de datos de tráfico en tiempo real

Cada mensaje de datos en tiempo real incorpora datos como los siguientes:

  • Detalles de la ruta, como travel_duration y speed_reading_intervals
  • Identificadores de ruta, como selected_route_id y display_name

Cada mensaje se publica según el siguiente formato de Protobuf.

syntax = "proto3";

// Contains the road information like travel duration and speed reading
// intervals for a selected route.
message RoadsInformation {
  message TravelDuration {
    // The duration of travel through the route based on current road conditions.
    float duration_in_seconds = 1;
    // The duration of travel through the route without taking road conditions into consideration.
    float static_duration_in_seconds = 2;
  }
  message Timestamp {
    // Represents seconds of UTC time since Unix epoch
    // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
    // 9999-12-31T23:59:59Z inclusive.
    int64 seconds = 1;

    // Non-negative fractions of a second at nanosecond resolution. Negative
    // second values with fractions must still have non-negative nanos values
    // that count forward in time. Must be from 0 to 999,999,999
    // inclusive.
    int32 nanos = 2;
  }
  // Represents the latitude and longitude of a coordinate
  // within speed reading interval.
  message LatLng {
    float latitude = 1;
    float longitude = 2;
  }
  message SpeedReadingInterval {
    // The coordinates on the polyline for the speed reading interval
    repeated LatLng interval_coordinates = 1;

    // Describes the categorized current speed of road conditions. Possible values are:
    // - "NORMAL": Road is flowing smoothly, no slowdown is detected.
    // - "SLOW": Slowdown detected, but no congestion formed.
    // - "TRAFFIC_JAM": Congestion detected.
    string speed = 2;
  }
  // Id for selected_route.
  string selected_route_id = 1;
  // User provided name for the route.
  string display_name = 2;
  // Intervals representing the road density across the route.
  repeated SpeedReadingInterval speed_reading_intervals = 3;
  // Travel time information.
  TravelDuration travel_duration = 4;
  // The time the road data was collected.
  Timestamp retrieval_time = 5;
  // Contains a geojson polyline representing the optimal route determined based
  // on user's input waypoints.
  string route_geometry = 6;
}

Transmite datos de rutas a BigQuery con Pub/Sub

Puedes configurar una suscripción a Pub/Sub para transmitir datos de rutas directamente a una tabla de BigQuery. Esto permite un almacenamiento de datos sólido y habilita análisis potentes sobre la información de la ruta proporcionada. Antes de configurar este tipo de suscripción, debes crear un conjunto de datos y una tabla adecuados en tu proyecto de BigQuery para escribir los datos.

Consulta Transmite datos a BigQuery para obtener instrucciones detalladas sobre cómo crear una suscripción a Pub/Sub que escriba en BigQuery.

Esquema de tabla de BigQuery

Los mensajes publicados en tu tema de Pub/Sub, que también se pueden escribir en tu tabla de BigQuery, cumplen con el siguiente esquema. Debes usar este esquema cuando crees tu tabla de BigQuery de destino para garantizar la compatibilidad.

  {
    "mode": "NULLABLE",
    "name": "selected_route_id",
    "type": "STRING",
    "description": "Id for selected_route."
  },
  {
    "mode": "NULLABLE",
    "name": "display_name",
    "type": "STRING",
    "description": "User provided name for the route."
  },
  {
    "fields": [
      {
        "mode": "NULLABLE",
        "name": "speed",
        "type": "STRING",
        "description": "Describes the categorized current speed of traffic. Possible values are: \"NORMAL\": Traffic is flowing smoothly, no slowdown is detected.  \"SLOW\": Slowdown detected, but no traffic jam formed. \"TRAFFIC_JAM\": Traffic jam detected."
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "latitude",
            "type": "NUMERIC"
          },
          {
            "mode": "NULLABLE",
            "name": "longitude",
            "type": "NUMERIC"
          }
        ],
        "mode": "REPEATED",
        "name": "interval_coordinates",
        "type": "RECORD",
        "description": "The geometry for this interval"
      }
    ],
    "mode": "REPEATED",
    "name": "speed_reading_intervals",
    "type": "RECORD",
    "description": "Intervals representing the traffic density across the route."
  },
  {
    "fields": [
      {
        "mode": "NULLABLE",
        "name": "duration_in_seconds",
        "type": "FLOAT",
        "description": "The duration of travel through the route based on current traffic conditions."
      },
      {
        "mode": "NULLABLE",
        "name": "static_duration_in_seconds",
        "type": "FLOAT",
        "description": "The duration of travel through the route without taking traffic conditions into consideration."
      }
    ],
    "mode": "NULLABLE",
    "name": "travel_duration",
    "type": "RECORD",
    "description": "Travel time information."
  },
  {
    "fields": [
      {
        "mode": "NULLABLE",
        "name": "seconds",
        "type": "INTEGER",
        "description": "Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive."
      },
      {
        "mode": "NULLABLE",
        "name": "nanos",
        "type": "INTEGER",
        "description": "Non-negative fractions of a second at nanosecond resolution. Negative second values with fractions must still have non-negative nanos values that count forward in time. Must be from 0 to 999,999,999 inclusive."
      }
    ],
    "mode": "NULLABLE",
    "name": "retrieval_time",
    "type": "RECORD",
    "description": "The time the traffic data was collected."
  },
  {
    "mode": "NULLABLE",
    "name": "route_geometry",
    "type": "STRING",
    "description": "Contains a geojson polyline representing the optimal route determined based on user's input waypoints"
  }