Datos viales en tiempo real

Los datos viales en tiempo real proporcionan actualizaciones 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 del tráfico a lo largo de la 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 Pub/Sub para los intervalos de lectura de velocidad y duración del viaje

Se te proporcionarán temas de Google Cloud Pub/Sub exclusivos, a los que podrás suscribirte para recibir los datos en tiempo real de todas las rutas que creaste.

En la siguiente muestra de código, se muestra el formato del tema con codificación binaria:

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

También proporcionamos otro tema con codificación JSON (con el sufijo -json). Debes suscribirte al tema de Pub/Sub que se te proporcionó 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 intervalos de lectura de velocidad y duración del viaje

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

  • Detalles de la ruta, como duration_in_seconds, static_duration_in_seconds, speed_reading_offsets (intervalos de lectura de velocidad basados en el desplazamiento) y retrieval_timestamp.
  • 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 {
  // Legacy message. May stop being populated on or after November 9, 2026.
  // Use top-level duration_in_seconds and static_duration_in_seconds instead.
  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;
  }
  // Legacy message representing the latitude and longitude of a coordinate
  // within a coordinate-based speed reading interval.
  message LatLng {
    float latitude = 1;
    float longitude = 2;
  }
  // Legacy coordinate-based speed reading interval message. May stop being
  // populated on or after November 9, 2026. Use SpeedReadingOffset instead.
  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": Traffic jam detected. In this legacy field, heavy
    //   traffic jams (dark red) are also reported as "TRAFFIC_JAM";
    //   "TRAFFIC_JAM_HEAVY" is never used.
    string speed = 2;
  }
  // Offset-based speed reading interval along the route.
  message SpeedReadingOffset {
    // The distance offset from the start of the route in meters for the start
    // of the interval (inclusive).
    int32 start_offset = 1;

    // The distance offset from the start of the route in meters for the end of
    // the interval (exclusive; equals the start_offset of the subsequent
    // interval).
    int32 end_offset = 2;

    // Describes the categorized current speed of traffic, aligned with the
    // colors in the Google Maps traffic layer. Possible values are:
    // - "NORMAL" (green): Traffic is flowing smoothly, no slowdown is detected.
    // - "SLOW" (yellow): Slowdown detected, but no traffic jam formed.
    // - "TRAFFIC_JAM" (red): Traffic jam detected.
    // - "TRAFFIC_JAM_HEAVY" (dark red): Heavy traffic jam detected (available
    //   as of October 8, 2026).
    string speed = 3;
  }
  // Id for selected_route.
  string selected_route_id = 1;
  // User provided name for the route.
  string display_name = 2;
  // Legacy coordinate-based speed reading intervals. May stop being populated
  // on or after November 9, 2026. Use speed_reading_offsets instead.
  repeated SpeedReadingInterval speed_reading_intervals = 3;
  // Legacy travel time information. May stop being populated on or after
  // November 9, 2026. Use duration_in_seconds and static_duration_in_seconds
  // instead.
  TravelDuration travel_duration = 4;
  // Legacy timestamp when the road data was collected. May stop being populated
  // on or after November 9, 2026. Use retrieval_timestamp instead.
  Timestamp retrieval_time = 5;
  // Contains a geojson polyline representing the optimal route determined
  // based on user's input waypoints.
  string route_geometry = 6;
  // Road segment place IDs along the route. They follow topological order
  // and are always connected.
  repeated string road_segment_ids = 7;
  // Offset-based speed reading intervals representing traffic density across
  // the route; each interval is demarcated by the distance offset from the
  // start of the route.
  repeated SpeedReadingOffset speed_reading_offsets = 8;
  // The duration of travel through the route based on current traffic
  // conditions.
  float duration_in_seconds = 9;
  // The duration of travel through the route without taking traffic
  // conditions into consideration.
  float static_duration_in_seconds = 10;
  // The time the traffic data was collected, as an RFC 3339 UTC timestamp
  // string (for example, "2026-10-08T15:04:05+00:00").
  string retrieval_timestamp = 11;
}

Intervalos de lectura rápida basados en desfase y migración de campos

A partir del 8 de octubre de 2026, los intervalos de lectura de velocidad se proporcionan en el campo speed_reading_offsets basado en el desplazamiento, en el que cada intervalo está demarcado por su start_offset (inclusivo) y end_offset (exclusivo) en metros desde el inicio de la ruta, y se incluye la cuarta categoría de velocidad TRAFFIC_JAM_HEAVY. Para obtener detalles sobre las categorías de velocidad y los formatos de intervalos, consulta Intervalos de lectura rápida.

En la siguiente tabla, se asigna cada campo heredado de Pub/Sub (que puede dejar de completarse a partir del 9 de noviembre de 2026) a su reemplazo:

Campo heredado Campo de reemplazo Notas
speed_reading_intervals speed_reading_offsets Usa desplazamientos en metros (start_offset, end_offset) en lugar de coordenadas de polilínea y agrega la categoría de velocidad TRAFFIC_JAM_HEAVY.
travel_duration.duration_in_seconds duration_in_seconds Se compactó en un campo float de nivel superior.
travel_duration.static_duration_in_seconds static_duration_in_seconds Se compactó en un campo float de nivel superior.
retrieval_time retrieval_timestamp Se formatea como una cadena RFC 3339, que las suscripciones de BigQuery convierten automáticamente en TIMESTAMP.

Transmite datos de rutas a BigQuery con Pub/Sub

Puedes configurar una suscripción a Pub/Sub para transmitir datos viales 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.

Para obtener instrucciones detalladas sobre cómo crear una suscripción a Pub/Sub que escriba en BigQuery, consulta Transmite datos a BigQuery. Crea la suscripción a BigQuery en el tema codificado en JSON. Cuando configures la suscripción, selecciona Usar esquema de tabla y habilita Descartar campos desconocidos para que tu canalización de transferencia siga funcionando sin problemas cuando se agreguen campos nuevos. Para almacenar campos nuevos, como speed_reading_offsets, agrega las columnas correspondientes a tu tabla.

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 (groups red and dark red segments; does not include \"TRAFFIC_JAM_HEAVY\")."
      },
      {
        "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": "Legacy coordinate-based speed reading intervals. May stop being populated on or after November 9, 2026. Use speed_reading_offsets instead."
  },
  {
    "fields": [
      {
        "mode": "NULLABLE",
        "name": "duration_in_seconds",
        "type": "FLOAT",
        "description": "The duration of travel through the route based on\ncurrent traffic conditions."
      },
      {
        "mode": "NULLABLE",
        "name": "static_duration_in_seconds",
        "type": "FLOAT",
        "description": "The duration of travel through the route without\ntaking traffic conditions into consideration."
      }
    ],
    "mode": "NULLABLE",
    "name": "travel_duration",
    "type": "RECORD",
    "description": "Legacy travel time information. May stop being populated on or after November 9, 2026. Use top-level duration_in_seconds and static_duration_in_seconds instead."
  },
  {
    "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": "Legacy timestamp when the traffic data was collected. May stop being populated on or after November 9, 2026. Use retrieval_timestamp instead."
  },
  {
    "mode": "NULLABLE",
    "name": "route_geometry",
    "type": "STRING",
    "description": "Contains a geojson polyline representing the optimal route determined based on user's input waypoints"
  },
  {
    "mode": "REPEATED",
    "name": "road_segment_ids",
    "type": "STRING",
    "description": "Road segment place IDs along the route. They follow topological order and are always connected"
  },
  {
    "fields": [
      {
        "mode": "NULLABLE",
        "name": "start_offset",
        "type": "INTEGER",
        "description": "The distance offset from the start of the route in meters for the start of the interval (inclusive)."
      },
      {
        "mode": "NULLABLE",
        "name": "end_offset",
        "type": "INTEGER",
        "description": "The distance offset from the start of the route in meters for the end of the interval (exclusive; equals the start_offset of the subsequent interval)."
      },
      {
        "mode": "NULLABLE",
        "name": "speed",
        "type": "STRING",
        "description": "Describes the categorized current speed of traffic, aligned with the colors in the Google Maps traffic layer. Possible values are: \"NORMAL\" (green): Traffic is flowing smoothly, no slowdown is detected. \"SLOW\" (yellow): Slowdown detected, but no traffic jam formed. \"TRAFFIC_JAM\" (red): Traffic jam detected. \"TRAFFIC_JAM_HEAVY\" (dark red): Heavy traffic jam detected (available as of October 8, 2026)."
      }
    ],
    "mode": "REPEATED",
    "name": "speed_reading_offsets",
    "type": "RECORD",
    "description": "Offset-based speed reading intervals representing traffic density across the route; each interval is demarcated by the distance offset from the start of the route."
  },
  {
    "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": "retrieval_timestamp",
    "type": "TIMESTAMP",
    "description": "The time the traffic data was collected."
  }
]