يمكن تقسيم مسار المركبة على محور الوقت على النحو التالي (نفترض أنّ هناك 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
يُرجى العِلم بأنّنا نفرّق بين ما يلي:
- "الأحداث المحدّدة بوقت"، مثل بدء المركبة وإيقافها وبدء كل زيارة وانتهائها (المعروفة أيضًا باسم الوصول والمغادرة) تحدث هذه الأحداث في ثانية معيّنة.
- "الفواصل الزمنية"، مثل الزيارات نفسها والانتقال بين الزيارات على الرغم من أنّ الفواصل الزمنية قد تكون أحيانًا صفرية المدة، أي تبدأ وتنتهي في الثانية نفسها، إلا أنّها غالبًا ما تكون ذات مدة موجبة.
الثوابت:
- إذا كانت هناك 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
أخيرًا، إليك كيفية ترتيب TRAVEL وBREAKS وDELAY وWAIT أثناء عملية الانتقال.
- ولا تتداخل مع بعضها.
- يجب أن يكون التأخير فريدًا ويجب أن يكون فترة زمنية متجاورة قبل الزيارة التالية مباشرةً (أو نهاية الرحلة). وبالتالي، يكفي معرفة مدة التأخير لمعرفة وقت بدئه وانتهائه.
- فترات الاستراحة هي فترات زمنية متجاورة وغير متداخلة. يحدّد الردّ وقت بدء كل استراحة ومدتها.
- يمكن "مقاطعة" حالتي 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 ( |
| الحقول | |
|---|---|
vehicleIndex |
المركبة التي تسلك المسار، ويتم تحديدها من خلال الفهرس في المصدر |
vehicleLabel |
تصنيف المركبة التي تسلك هذا المسار، ويساوي |
vehicleStartTime |
الوقت الذي تبدأ فيه المركبة مسارها يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: |
vehicleEndTime |
الوقت الذي تنهي فيه المركبة مسارها يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: |
visits[] |
تسلسل مرتّب من الزيارات يمثّل مسارًا. تمثّل visits[i] الزيارة رقم i في المسار. إذا كان هذا الحقل فارغًا، سيتم اعتبار المركبة غير مستخدَمة. |
transitions[] |
قائمة مرتّبة بعمليات الانتقال للمسار. |
hasTrafficInfeasibilities |
عند ضبط من المرجّح أن يكون موعد الوصول إلى next_visit متأخرًا عن الفترة الزمنية الحالية بسبب زيادة تقدير وقت السفر |
routePolyline |
تمثيل الخطوط المتعددة المشفّرة للمسار. لا تتم تعبئة هذا الحقل إلا إذا تم ضبط |
breaks[] |
فترات الاستراحة المجدوَلة للمركبة التي تسلك هذا المسار يمثّل التسلسل |
metrics |
مقاييس المدة والمسافة والحِمل لهذا المسار يتم جمع حقول |
vehicleFullness |
حقل تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل. |
routeCosts |
تكلفة المسار، مقسّمة حسب حقول الطلبات ذات الصلة بالتكلفة المفاتيح هي مسارات أولية، بالنسبة إلى OptimizeToursRequest للإدخال، مثل "model.shipments.pickups.cost"، والقيم هي التكلفة الإجمالية التي تم إنشاؤها بواسطة حقل التكلفة المقابل، ويتم تجميعها على مستوى المسار بأكمله. بعبارة أخرى، costs["model.shipments.pickups.cost"] هو مجموع كل تكاليف عمليات الاستلام على طول المسار. يتم هنا عرض جميع التكاليف المحدّدة في النموذج بالتفصيل، باستثناء التكاليف المتعلّقة بسمات الانتقال التي يتم عرضها بشكل مجمّع فقط اعتبارًا من 2022/01. |
routeTotalCost |
تمثّل هذه السمة التكلفة الإجمالية للمسار. مجموع كل التكاليف في خريطة التكاليف |
زيارة
زيارة تم إجراؤها أثناء مسار تتطابق هذه الزيارة مع عملية استلام أو توصيل Shipment.
| تمثيل JSON |
|---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
| الحقول | |
|---|---|
shipmentIndex |
فهرس الحقل |
isPickup |
إذا كانت القيمة صحيحة، تتوافق الزيارة مع استلام |
visitRequestIndex |
فهرس |
startTime |
الوقت الذي تبدأ فيه الزيارة يُرجى العِلم أنّ المركبة قد تصل إلى الموقع الجغرافي للزيارة قبل هذا الوقت. تتطابق الأوقات مع يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: |
loadDemands |
إجمالي طلب تحميل الزيارات كمجموع الشحنة وطلب الزيارة |
detour |
وقت إضافي للانحراف عن المسار بسبب الشحنات التي تمّت زيارتها على المسار قبل الزيارة ووقت الانتظار المحتمل الناتج عن الفترات الزمنية. إذا كانت الزيارة عبارة عن عملية تسليم، يتم احتساب الانحراف عن المسار من زيارة الاستلام المقابلة ويكون مساويًا لما يلي: بخلاف ذلك، يتم احتسابه من المركبة مدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
shipmentLabel |
نسخة من |
visitLabel |
نسخة من |
injectedSolutionLocationToken |
رمز مميز غير شفاف يمثّل معلومات حول الموقع الجغرافي للزيارة. قد تتم تعبئة هذا الحقل في زيارات مسارات النتائج عندما تكون قيمة تجريبية: يُرجى الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request لمزيد من التفاصيل. |
الانتقال
الانتقال بين حدثَين على المسار اطّلِع على وصف ShipmentRoute.
إذا لم تكن المركبة مزوّدة بجهاز startLocation و/أو endLocation، تكون مقاييس التنقّل ذات الصلة صفرًا.
| تمثيل JSON |
|---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
| الحقول | |
|---|---|
travelDuration |
مدة السفر خلال هذه الفترة الانتقالية مدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
travelDistanceMeters |
المسافة المقطوعة أثناء الانتقال |
trafficInfoUnavailable |
عند طلب معلومات حركة المرور من خلال |
delayDuration |
مجموع مدة التأخير المطبَّقة على عملية النقل هذه إذا كان هناك أي تأخير، يبدأ التأخير قبل مدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
breakDuration |
مجموع مدة الفواصل الإعلانية التي تحدث أثناء هذا الانتقال، إن وُجدت. يتم تخزين تفاصيل حول وقت بدء كل استراحة ومدتها في مدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
waitDuration |
الوقت الذي تم قضاؤه في الانتظار خلال هذا الانتقال تتوافق مدة الانتظار مع وقت عدم النشاط ولا تشمل وقت الاستراحة. يُرجى العِلم أيضًا أنّ مدة الانتظار هذه قد يتم تقسيمها إلى عدة فواصل زمنية غير متجاورة. مدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
totalDuration |
إجمالي مدة الانتقال، ويتم توفيرها لتسهيل الأمر. وهي تساوي:
مدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
startTime |
وقت بدء هذا الانتقال يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: |
routePolyline |
تمثيل الخطوط المتعددة المشفّرة للمسار الذي تم اتّباعه أثناء الانتقال لا تتم تعبئة هذا الحقل إلا إذا تم ضبط |
routeToken |
النتائج فقط. رمز مميّز غير شفاف يمكن تمريره إلى Navigation SDK لإعادة إنشاء المسار أثناء التنقّل، وفي حال إعادة التوجيه، يتم الالتزام بالنية الأصلية عند إنشاء المسار. تعامَل مع الرمز المميز هذا ككائن ثنائي كبير غير شفاف. لا تقارِن قيمتها بين الطلبات لأنّ قيمتها قد تتغيّر حتى إذا كانت الخدمة تعرض المسار نفسه بالضبط. لا تتم تعبئة هذا الحقل إلا إذا تم ضبط |
vehicleLoads |
حمولة المركبة خلال عملية النقل هذه، لكل نوع يظهر في عمليات التحميل أثناء عملية النقل الأولى هي عمليات التحميل الأولية لمسار المركبة. بعد ذلك، وبعد كل زيارة، تتم إضافة |
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 } |
| الحقول | |
|---|---|
startTime |
وقت بدء الاستراحة يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: |
duration |
مدة الاستراحة مدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ " |
VehicleFullness
VehicleFullness هو مقياس يحسب مدى امتلاء مركبة. تتراوح قيمة كل حقل VehicleFullness بين 0 و1، ويتم احتسابها كنسبة بين حقل مقياس محدود (مثل AggregatedMetrics.travel_distance_meters) والحد الأقصى للمركبة المرتبط به (مثل Vehicle.route_distance_limit)، إذا كان هذا الحد الأقصى متوفّرًا. وفي حال عدم إجراء ذلك، سيظلّ معدّل الامتلاء غير محدّد. إذا كان الحدّ 0، يتم ضبط الحقل على 1. ملاحظة: عندما يكون المسار عرضة لعدم إمكانية التنقّل بسبب الازدحام، قد تتجاوز بعض نسب الامتلاء الأولية القيمة 1.0، مثلاً قد تتجاوز المركبة الحدّ الأقصى للمسافة. في هذه الحالات، نضع حدًا أقصى لقيم الامتلاء عند 1.0.
| تمثيل JSON |
|---|
{ "maxFullness": number, "distance": number, "travelDuration": number, "activeDuration": number, "maxLoad": number, "activeSpan": number } |
| الحقول | |
|---|---|
maxFullness |
الحد الأقصى لجميع الحقول الأخرى في هذه الرسالة |
distance |
النسبة بين |
travelDuration |
النسبة بين [AggregatedMetrics.travel_duration_seconds][] و |
activeDuration |
النسبة بين [AggregatedMetrics.total_duration_seconds][] و |
maxLoad |
النسبة القصوى بين جميع أنواع [AggregatedMetrics.max_load][] و |
activeSpan |
تمثّل هذه السمة النسبة (vehicleEndTime - vehicleStartTime) / (latestVehicleEndTime - earliestVehicleStartTime) لمركبة معيّنة. في حال عدم توفّر المقام، يتم استخدام ( |