נתוני כבישים בזמן אמת

נתוני הדרכים בזמן אמת מספקים עדכונים שוטפים על תנאי הדרך ואירועים במסלולים שבחרתם, וכך מאפשרים מעקב דינמי ותגובה מהירה. הנתונים האלה שונים מהנתונים שנאספים מדי פעם וזמינים ב-BigQuery, והם מתאימים לתרחישים שבהם נדרש מידע עדכני.

הנתונים האלה זורמים באופן רציף וכוללים את משך הנסיעה, שמציין את זמני ההגעה במסלול, ואת מרווחי קריאת המהירות, שמראים את צפיפות התנועה לאורך המסלול.

כדי לגשת לנתוני כבישים בזמן אמת, החוזה שלכם צריך לכלול את חבילת Real-Time Operations.

יצירת מינוי Pub/Sub למרווחי זמן לקריאת מהירות ומשך נסיעה

תקבלו נושאים ייעודיים של Google Cloud Pub/Sub, שבהם תוכלו להירשם לנתונים בזמן אמת לכל המסלולים שיצרתם.

דוגמת הקוד הבאה מראה את הפורמט של הנושא באמצעות קידוד בינארי:

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

אנחנו מספקים גם נושא אחר באמצעות קידוד JSON (עם הסיומת -json). כדי לקבל הודעות נתונים בזמן אמת, צריך להירשם לנושא Pub/Sub שסופק לכם. במאמר הרשמה לנושא תוכלו לקרוא סקירה כללית קצרה על הרשמה לנושא ב-Cloud Pub/Sub וצריכת הודעות ממנו.

סכימה של מרווחי הזמן של משך הנסיעה ומהירות הקריאה

כל הודעת נתונים בזמן אמת כוללת נתונים כמו:

  • פרטי כביש כמו duration_in_seconds, static_duration_in_seconds, speed_reading_offsets (מרווחי קריאת מהירות מבוססי-היסט), retrieval_timestamp ו-has_road_closure.
  • מזהי מסלולים כמו selected_route_id ו-display_name.

כל הודעה מתפרסמת בהתאם לפורמט 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. Omitted when has_road_closure is true.
  repeated SpeedReadingOffset speed_reading_offsets = 8;
  // The duration of travel through the route based on current traffic
  // conditions. Omitted when has_road_closure is true.
  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;
  // Whether there is a full road closure on the route. When true,
  // duration_in_seconds and speed_reading_offsets are omitted because the
  // route is impassable. Omitted when road closure information is undetermined.
  bool has_road_closure = 12;
}

מרווחי קריאת מהירות מבוססי-היסט והעברת שדות

החל מ-8 באוקטובר 2026, מרווחי מהירות הקריאה יסופקו בשדה speed_reading_offsets שמבוסס על היסט, כאשר כל מרווח תחום על ידי start_offset (כולל) ו-end_offset (לא כולל) במטרים מתחילת המסלול, וכולל את קטגוריית המהירות הרביעית TRAFFIC_JAM_HEAVY. למידע נוסף על קטגוריות מהירות ופורמטים של מרווחים, ראו מרווחי קריאת מהירות.

בטבלה הבאה ממופה כל שדה Pub/Sub מדור קודם (שייתכן שלא יאוכלס יותר החל מ-9 בנובמבר 2026) לשדה שמחליף אותו:

שדה מדור קודם שדה חלופי הערות
speed_reading_intervals speed_reading_offsets משתמש בהיסטים במטרים (start_offset,‏ end_offset) במקום בקואורדינטות של קו פוליגוני, ומוסיף את קטגוריית המהירות TRAFFIC_JAM_HEAVY.
travel_duration.duration_in_seconds duration_in_seconds השדה הומר לשדה float ברמה העליונה.
travel_duration.static_duration_in_seconds static_duration_in_seconds השדה הופך לשדה float ברמה העליונה.
retrieval_time retrieval_timestamp הפורמט הוא מחרוזת RFC 3339, שהמינויים ל-BigQuery ממירים באופן אוטומטי ל-TIMESTAMP.

העברת נתוני מסלולים בסטרימינג ל-BigQuery באמצעות Pub/Sub

אפשר להגדיר מינוי ל-Pub/Sub כדי להעביר בסטרימינג נתוני כבישים ישירות לטבלה ב-BigQuery. כך אפשר לאחסן נתונים בצורה יעילה ולנתח את פרטי המסלול שסופקו. לפני שמגדירים מינוי מהסוג הזה, צריך ליצור מערך נתונים וטבלה מתאימים בפרויקט ב-BigQuery כדי לכתוב בהם את הנתונים.

הוראות מפורטות ליצירת מינוי ל-Pub/Sub שכותב ב-BigQuery מופיעות במאמר העברת נתונים בסטרימינג ל-BigQuery. יוצרים את המינוי ל-BigQuery בנושא בקידוד JSON. כשמגדירים את המינוי, בוחרים באפשרות Use table schema ומפעילים את Drop unknown fields כדי שצינור עיבוד הנתונים להטמעה ימשיך לפעול בצורה חלקה כשמוסיפים שדות חדשים. כדי לאחסן שדות חדשים, כמו speed_reading_offsets, צריך להוסיף את העמודות המתאימות לטבלה.

סכימת טבלה ב-BigQuery

ההודעות שמתפרסמות בנושא Pub/Sub, שאפשר גם לכתוב בטבלה ב-BigQuery, תואמות לסכימה הבאה. כדי להבטיח תאימות, צריך להשתמש בסכימה הזו כשיוצרים את טבלת היעד ב-BigQuery.

[
  {
    "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. Omitted when has_road_closure is true."
  },
  {
    "mode": "NULLABLE",
    "name": "duration_in_seconds",
    "type": "FLOAT",
    "description": "The duration of travel through the route based on current traffic conditions. Omitted when has_road_closure is true."
  },
  {
    "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."
  },
  {
    "mode": "NULLABLE",
    "name": "has_road_closure",
    "type": "BOOLEAN",
    "description": "Whether there is a full road closure on the route. When true, duration_in_seconds and speed_reading_offsets are omitted because the route is impassable. A NULL value indicates that road closure information is undetermined."
  }
]