Straßendaten in Echtzeit

Echtzeit-Straßendaten liefern aktuelle Informationen zu Straßenbedingungen und Ereignissen für die ausgewählten Routen und unterstützen so die dynamische Überwachung und schnelle Reaktion. Diese Daten unterscheiden sich von den regelmäßig erfassten Daten, die in BigQuery verfügbar sind, und eignen sich für Szenarien, in denen zeitnahe Informationen erforderlich sind.

Diese Daten werden kontinuierlich gestreamt und umfassen: die Reisedauer, die die Reisezeiten auf einer Route angibt, und die Intervalle für die Geschwindigkeitsmessung, die die Dichte der Straßenabschnitte zeigen.

Damit Sie auf Echtzeit-Straßendaten zugreifen können, muss Ihr Vertrag das Paket „Real-Time Operations“ enthalten.

Pub/Sub-Abo für Reisedauer und Intervalle für Geschwindigkeitsmessung erstellen

Sie erhalten dedizierte Google Cloud Pub/Sub-Themen, in denen Sie die Echtzeitdaten für alle erstellten Routen abonnieren können.

Das folgende Codebeispiel zeigt das Format des Themas mit binärer Codierung:

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

Wir bieten auch ein weiteres Thema mit JSON-Codierung an (mit dem Suffix -json). Sie müssen das Ihnen zur Verfügung gestellte Pub/Sub-Thema abonnieren, um Echtzeitdaten-Nachrichten zu erhalten. Unter Thema abonnieren finden Sie eine kurze Übersicht dazu, wie Sie Nachrichten aus einem Cloud Pub/Sub-Thema abonnieren und verwenden.

Schema für Reisedauer und Intervalle für Geschwindigkeitsmessung

Jede Echtzeitdaten-Nachricht enthält Daten wie:

  • Straßendetails wie travel_duration und speed_reading_intervals.
  • Routen-IDs wie selected_route_id und display_name.

Jede Nachricht wird im folgenden Protobuf-Format veröffentlicht.

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;
}

Routendaten mit Pub/Sub zu BigQuery streamen

Sie können ein Pub/Sub-Abo so konfigurieren, dass Straßendaten direkt in eine BigQuery-Tabelle gestreamt werden. Das ermöglicht eine robuste Datenspeicherung und leistungsstarke Analysen der bereitgestellten Routeninformationen. Bevor Sie diese Art von Abo einrichten, müssen Sie in Ihrem BigQuery-Projekt ein geeignetes Dataset und eine geeignete Tabelle erstellen, in die die Daten geschrieben werden.

Eine detaillierte Anleitung zum Erstellen eines Pub/Sub-Abos, das Daten in BigQuery schreibt, finden Sie unter Daten zu BigQuery streamen.

Schema der BigQuery-Tabelle

Die Nachrichten, die in Ihrem Pub/Sub-Thema veröffentlicht werden und auch in Ihre BigQuery-Tabelle geschrieben werden können, entsprechen dem folgenden Schema. Sie sollten dieses Schema verwenden, wenn Sie Ihre Ziel-BigQuery-Tabelle erstellen, um die Kompatibilität zu gewährleisten.

  {
    "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\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": "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"
  }