נתונים בזמן אמת על הכבישים מספקים עדכונים שוטפים על תנאי הדרך ועל אירועים במסלולים שנבחרו, ותומכים במעקב דינמי ובתגובה מהירה. הנתונים האלה שונים מהנתונים שנאספים מעת לעת וזמינים ב-BigQuery, והם מתאימים לתרחישים שבהם נדרש מידע עדכני.
הנתונים האלה מועברים באופן רציף וכוללים: משך הנסיעה, שמציין את זמני הנסיעה במסלול, ומרווחי קריאת המהירות, שמציגים את הצפיפות בקטע כביש.
כדי לגשת לנתוני כבישים בזמן אמת, החוזה שלכם צריך לכלול את חבילת Real-Time Operations.
יצירת מינוי ל-Cloud Pub/Sub
אחרי שמגדירים את הפרויקט לקבלת נתונים בזמן אמת, נושא ייעודי ב-Google Cloud Pub/Sub הופך לזמין בפרויקט. בנושא הזה ב-Pub/Sub אפשר למצוא את הנתונים בזמן אמת של כל המסלולים שיצרתם.
בדוגמה הבאה של קוד מוצג הפורמט של כתובת ה-URL של הנושא.
projects/maps-platform-roads-management/topics/rmi-roadsinformation-PROJECT_NUMBER
כדי לקבל הודעות נתונים בזמן אמת, צריך להירשם לנושא Pub/Sub שסופק לכם. במאמר הרשמה לנושא יש סקירה מהירה על הרשמה וצריכת הודעות מנושא ב-Cloud Pub/Sub.
סכימת הודעות של נתוני תנועה בזמן אמת
כל הודעת נתוני זמן אמת כוללת נתונים כמו:
- פרטי הכביש כמו
travel_duration
ו-speed_reading_intervals
. - מזהי מסלולים כמו
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 { 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; }
העברת נתוני מסלולים בסטרימינג ל-BigQuery באמצעות Pub/Sub
אפשר להגדיר מינוי ל-Pub/Sub כדי להזרים נתוני כבישים ישירות לטבלת BigQuery. כך אפשר לאחסן נתונים בצורה יעילה ולבצע ניתוח מתקדם של נתוני המסלול. לפני שמגדירים מינוי מסוג כזה, צריך ליצור מערך נתונים וטבלה מתאימים בפרויקט BigQuery כדי לכתוב בהם את הנתונים.
הוראות מפורטות ליצירת מינוי ל-Pub/Sub שכותב ל-BigQuery זמינות במאמר הזרמת נתונים ל-BigQuery.
סכימת טבלה ב-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." }, { "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" }