אפשר לפרק את המסלול של רכב, לאורך ציר הזמן, באופן הבא (אנחנו מניחים שיש n ביקורים):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
חשוב לדעת שיש הבדל בין:
- 'אירועים מדויקים', כמו תחילת הנסיעה וסיום הנסיעה ותחילת הביקור וסיום הביקור (כלומר הגעה ויציאה). הם מתרחשים בשנייה נתונה.
- 'מרווחי זמן', כמו הביקורים עצמם והמעבר בין הביקורים. לפעמים מרווחי הזמן יכולים להיות באורך אפס, כלומר להתחיל ולהסתיים באותה שנייה, אבל לרוב הם באורך חיובי.
Invariants:
- אם יש n ביקורים, יש n+1 מעברים.
- ביקור תמיד מוקף במעבר לפניו (באותו אינדקס) ובמעבר אחריו (האינדקס + 1).
- אחרי התנעת הרכב תמיד מופיע המעבר מס' 0.
- תמיד מופיעה המעברה מס' n לפני סיום הרכב.
בהמשך, נסביר מה קורה במהלך Transition
ו-Visit
:
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
לסיום, כך אפשר לסדר את האירועים 'נסיעה', 'הפסקות', 'עיכוב' ו'המתנה' במהלך מעבר.
- הן לא חופפות.
- הערך של DELAY הוא ייחודי וחייב להיות תקופה רציפה של זמן ממש לפני הביקור הבא (או סיום הנסיעה ברכב). לכן, מספיק לדעת את משך העיכוב כדי לדעת את שעת ההתחלה והסיום שלו.
- ההפסקות הן תקופות זמן רצופות ולא חופפות. התגובה מציינת את שעת ההתחלה ואת משך הזמן של כל הפסקה.
- האירועים TRAVEL ו-WAIT הם 'ניתנים לביטול': אפשר להפריע להם כמה פעמים במהלך המעבר הזה. הלקוחות יכולים להניח שהנסיעה תתבצע "בהקדם האפשרי", ושהזמן שנותר יתמלא ב'המתנה'.
דוגמה (מורכבת):
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
ייצוג ב-JSON |
---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
שדות | |
---|---|
vehicle |
הרכב שמבצע את המסלול, שמזוהה לפי האינדקס שלו במקור |
vehicle |
התווית של הרכב שמבצע את המסלול הזה, שווה ל- |
vehicle |
השעה שבה הרכב מתחיל את המסלול. חותמת זמן בפורמט UTC 'Zulu' של RFC3339, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
vehicle |
השעה שבה הרכב מסיים את המסלול. חותמת זמן בפורמט UTC 'Zulu' של RFC3339, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
visits[] |
רצף מסודר של ביקורים שמייצג מסלול. visits[i] הוא הביקור ה-i במסלול. אם השדה הזה ריק, הרכב נחשב ללא בשימוש. |
transitions[] |
רשימה מסודרת של מעברים במסלול. |
has |
כשהערך של
סביר להניח שהגעה ל-next_visit תתרחש מאוחר יותר מחלון הזמן הנוכחי שלה בגלל האומדן המוגדל של זמן הנסיעה |
route |
ייצוג הפוליגון המקודד של המסלול. השדה הזה מאוכלס רק אם השדה |
breaks[] |
ההפסקות שתוזמנו לרכב שמבצע את המסלול הזה. הרצף |
metrics |
מדדי משך הזמן, המרחק והעומס במסלול הזה. השדות של |
route |
העלות של המסלול, לפי פירוט בשדות הבקשה שקשורים לעלויות. המפתחות הם נתיבים של פרוטו, ביחס לקלט OptimizeToursRequest, למשל 'model.shipments.pickups.cost', והערכים הם העלות הכוללת שנוצרה על ידי שדה העלות התואם, שנצברה לאורך המסלול כולו. במילים אחרות, costs["model.shipments.pickups.cost"] הוא הסכום של כל עלויות האיסוף במסלול. כל העלויות שמוגדרות במודל מדווחות כאן בפירוט, למעט עלויות שקשורות ל-TransitionAttributes שמדווחות רק באופן מצטבר החל מינואר 2022. |
route |
העלות הכוללת של המסלול. הסכום של כל העלויות במפת העלויות. |
כניסה
ביקור שבוצע במהלך מסלול. הביקור הזה תואם לאיסוף או למשלוח של Shipment
.
ייצוג ב-JSON |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
שדות | |
---|---|
shipment |
אינדקס השדה |
is |
אם הערך הוא True, הביקור תואם לאיסוף של |
visit |
האינדקס של |
start |
השעה שבה מתחיל הביקור. חשוב לדעת שהרכב עשוי להגיע למיקום הביקור לפני המועד הזה. השעות תואמות ל חותמת זמן בפורמט UTC 'Zulu' של RFC3339, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
load |
הביקוש הכולל לטעינת ביקורים כסכום של המשלוח ובקשת הביקור |
detour |
זמן עיקוף נוסף עקב המשלוח שנבדק במסלול לפני הביקור ועקב זמן ההמתנה הפוטנציאלי שנגרם בגלל חלונות הזמן. אם הביקור הוא מסירה, הסטייה מחושבת מהביקור התואם לאיסוף והיא שווה ל:
אחרת, הוא מחושב מהרכב
משך הזמן בשניות, עם עד תשע ספרות עשרוניות, שמסתיימים ב-' |
shipment |
עותק של |
visit |
עותק של |
מעבר
מעבר בין שני אירועים במסלול. אפשר לעיין בתיאור של ShipmentRoute
.
אם לרכב אין startLocation
ו/או endLocation
, מדדי הנסיעה התואמים יהיו 0.
ייצוג ב-JSON |
---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
שדות | |
---|---|
travel |
משך הנסיעה במהלך המעבר. משך הזמן בשניות, עם עד תשע ספרות עשרוניות, שמסתיימים ב-' |
travel |
המרחק שעברתם במהלך המעבר. |
traffic |
כשמבקשים מידע על תנועה דרך |
delay |
סכום משך הזמן של העיכובים שחלים על המעבר הזה. אם יש עיכוב, הוא מתחיל בדיוק משך הזמן בשניות, עם עד תשע ספרות עשרוניות, שמסתיימים ב-' |
break |
סכום משך ההפסקות שהתרחשו במהלך המעבר הזה, אם היו כאלה. פרטים על שעת ההתחלה והמשך של כל הפסקה נשמרים ב- משך הזמן בשניות, עם עד תשע ספרות עשרוניות, שמסתיימים ב-' |
wait |
משך הזמן שהמתנתם במהלך המעבר. משך ההמתנה תואם לזמן ההמתנה ללא פעילות, ולא כולל את זמן ההפסקה. חשוב גם לזכור שזמן ההמתנה הזה עשוי להתחלק למספר מקטעים לא רציפים. משך הזמן בשניות, עם עד תשע ספרות עשרוניות, שמסתיימים ב-' |
total |
משך המעבר הכולל, לצורך נוחות. הוא שווה ל-:
משך הזמן בשניות, עם עד תשע ספרות עשרוניות, שמסתיימים ב-' |
start |
שעת ההתחלה של המעבר הזה. חותמת זמן בפורמט UTC 'Zulu' של RFC3339, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
route |
ייצוג הקוד של הקו הפוליגוני של המסלול שבו נעשה שימוש במהלך המעבר. השדה הזה מאוכלס רק אם השדה |
route |
פלט בלבד. אסימון אטום שאפשר להעביר ל-Navigation SDK כדי לשחזר את המסלול במהלך הניווט, ובמקרה של שינוי מסלול, לשמור על הכוונה המקורית שלכם כשיצרתם את המסלול. מתייחסים לאסימון הזה כאל blob אטום. אין להשוות את הערך שלו בין בקשות שונות, כי הערך עשוי להשתנות גם אם השירות מחזיר את אותו מסלול בדיוק. השדה הזה מאוכלס רק אם השדה |
vehicle |
עומסי הרכב במהלך המעבר הזה, לכל סוג שמופיע ב- העומסים במהלך המעבר הראשון הם העומסים ההתחלתיים של מסלול הרכב. לאחר מכן, אחרי כל ביקור, הערכים של |
EncodedPolyline
הייצוג המקודד של קו מרובה. מידע נוסף על קידוד קווים פוליגונים זמין כאן: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.
ייצוג ב-JSON |
---|
{ "points": string } |
שדות | |
---|---|
points |
מחרוזת שמייצגת נקודות מקודדות של הקו המורכב. |
הפסקה
נתונים שמייצגים את הביצוע של הפסקה.
ייצוג ב-JSON |
---|
{ "startTime": string, "duration": string } |
שדות | |
---|---|
start |
שעת ההתחלה של ההפסקה. חותמת זמן בפורמט UTC 'Zulu' של RFC3339, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
duration |
משך ההפסקה. משך הזמן בשניות, עם עד תשע ספרות עשרוניות, שמסתיימים ב-' |