ShipmentRoute

เส้นทางของยานพาหนะสามารถแยกวิเคราะห์ตามแกนเวลาได้ดังนี้ (สมมติว่ามีการเข้าชม 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

โปรดทราบว่าเราแยกความแตกต่างระหว่าง

  • "เหตุการณ์ตามเวลา" เช่น จุดเริ่มต้นและจุดสิ้นสุดของยานพาหนะ รวมถึงจุดเริ่มต้นและจุดสิ้นสุดของการเข้าชมแต่ละครั้ง (หรือที่เรียกว่าการมาถึงและการออกเดินทาง) เหตุการณ์เหล่านี้เกิดขึ้นในวินาทีหนึ่งๆ
  • "ช่วงเวลา" เช่น การเข้าชมเอง และการเปลี่ยนระหว่างการเข้าชม แม้ว่าบางครั้งช่วงเวลาอาจมีระยะเวลาเป็น 0 เช่น เริ่มต้นและสิ้นสุดในเวลาวินาทีเดียวกัน แต่มักจะมีระยะเวลาเป็นบวก

อินตัวแปร

  • หากมีการเข้าชม 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 ระหว่างการเปลี่ยนเส้นทาง

  • โดยไม่ซ้อนทับกัน
  • 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 (Visit)
    }
  ],
  "transitions": [
    {
      object (Transition)
    }
  ],
  "hasTrafficInfeasibilities": boolean,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "breaks": [
    {
      object (Break)
    }
  ],
  "metrics": {
    object (AggregatedMetrics)
  },
  "routeCosts": {
    string: number,
    ...
  },
  "routeTotalCost": number
}
ช่อง
vehicleIndex

integer

ยานพาหนะที่วิ่งเส้นทาง ซึ่งระบุด้วยดัชนีในแหล่งที่มา ShipmentModel

vehicleLabel

string

ป้ายกํากับของยานพาหนะที่วิ่งเส้นทางนี้ ซึ่งเท่ากับ ShipmentModel.vehicles(vehicleIndex).label หากระบุ

vehicleStartTime

string (Timestamp format)

เวลารถเริ่มออกเดินทาง

การประทับเวลาจะอยู่ในรูปแบบ RFC3339 UTC "Zulu" ที่มีความละเอียดระดับนาโนวินาทีและทศนิยมสูงสุด 9 หลัก ตัวอย่างเช่น "2014-10-02T15:01:23Z" และ "2014-10-02T15:01:23.045123456Z"

vehicleEndTime

string (Timestamp format)

เวลาที่พาหนะวิ่งเส้นทางเสร็จสิ้น

การประทับเวลาจะอยู่ในรูปแบบ RFC3339 UTC "Zulu" ที่มีความละเอียดระดับนาโนวินาทีและทศนิยมสูงสุด 9 หลัก ตัวอย่างเช่น "2014-10-02T15:01:23Z" และ "2014-10-02T15:01:23.045123456Z"

visits[]

object (Visit)

ลําดับการเข้าชมที่เรียงลําดับซึ่งแสดงถึงเส้นทาง โดย visits[i] คือการเข้าชมที่ i ในเส้นทาง หากช่องนี้ว่าง ระบบจะถือว่ายานพาหนะไม่ได้ใช้งาน

transitions[]

object (Transition)

รายการทรานซิชันตามลําดับของเส้นทาง

hasTrafficInfeasibilities

boolean

เมื่อตั้งค่า OptimizeToursRequest.consider_road_traffic เป็น "จริง" ช่องนี้จะระบุว่าระบบจะคาดการณ์ความไม่สอดคล้องของเวลาในเส้นทางโดยใช้การประมาณระยะเวลาเดินทางตามการจราจร อาจไม่มีเวลาเพียงพอในการเดินทางที่ปรับตามการจราจร ระยะเวลาที่ล่าช้า และช่วงพักระหว่างการเข้าชมก่อนการเข้าชมครั้งแรกหรือหลังการเข้าชมครั้งล่าสุด โดยยังคงเป็นไปตามกรอบเวลาการเข้าชมและเวลาของยานพาหนะ ตัวอย่างเช่น

  startTime(previous_visit) + duration(previous_visit) +
  travelDuration(previous_visit, next_visit) > startTime(next_visit)

เวลาที่มาถึงที่ next_visit มีแนวโน้มที่จะเกิดช้ากว่ากรอบเวลาปัจจุบันเนื่องจากเวลาเดินทางโดยประมาณ travelDuration(previous_visit, next_visit) เพิ่มขึ้นเนื่องจากมีรถติด นอกจากนี้ ระบบอาจบังคับให้ช่วงพักซ้อนทับกับการเข้าชมเนื่องจากเวลาเดินทางโดยประมาณเพิ่มขึ้นและข้อจำกัดของกรอบเวลาการเข้าชมหรือช่วงพัก

routePolyline

object (EncodedPolyline)

การนำเสนอเส้นประกอบที่เข้ารหัสของเส้นทาง ระบบจะป้อนข้อมูลในช่องนี้เฉพาะในกรณีที่ตั้งค่า OptimizeToursRequest.populate_polylines เป็น "จริง"

breaks[]

object (Break)

ช่วงพักที่กำหนดไว้สำหรับยานพาหนะที่วิ่งเส้นทางนี้ ลำดับ breaks แสดงถึงช่วงเวลา โดยแต่ละช่วงเวลาจะเริ่มต้นที่ startTime ที่เกี่ยวข้องและยาว duration วินาที

metrics

object (AggregatedMetrics)

เมตริกระยะเวลา ระยะทาง และน้ำหนักบรรทุกของเส้นทางนี้ ระบบจะรวมช่อง AggregatedMetrics ของ ShipmentRoute.transitions หรือ ShipmentRoute.visits ทั้งหมดเข้าด้วยกัน โดยขึ้นอยู่กับบริบท

routeCosts

map (key: string, value: number)

ค่าใช้จ่ายของเส้นทางที่แจกแจงตามช่องคำขอที่เกี่ยวข้องกับค่าใช้จ่าย คีย์คือเส้นทางโปรโตคอลซึ่งสัมพันธ์กับอินพุต OptimizeToursRequest เช่น "model.shipments.pickups.cost" และค่าคือต้นทุนทั้งหมดที่สร้างขึ้นจากช่องค่าใช้จ่ายที่เกี่ยวข้อง ซึ่งรวบรวมจากทั่วทั้งเส้นทาง กล่าวคือ costs["model.shipments.pickups.cost"] คือผลรวมของค่าใช้จ่ายในการรับสินค้าทั้งหมดในเส้นทาง ระบบจะรายงานต้นทุนทั้งหมดที่กําหนดไว้ในรูปแบบโดยละเอียดที่นี่ ยกเว้นต้นทุนที่เกี่ยวข้องกับ TransitionAttributes ซึ่งจะรายงานแบบรวมเท่านั้น ณ วันที่ 01/2022

routeTotalCost

number

ต้นทุนรวมของเส้นทาง ผลรวมของค่าใช้จ่ายทั้งหมดในแผนที่ต้นทุน

ไปที่

การเข้าชมที่เกิดขึ้นระหว่างเส้นทาง การเข้าชมนี้สอดคล้องกับการรับหรือการนำส่ง Shipment

การแสดง JSON
{
  "shipmentIndex": integer,
  "isPickup": boolean,
  "visitRequestIndex": integer,
  "startTime": string,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "detour": string,
  "shipmentLabel": string,
  "visitLabel": string
}
ช่อง
shipmentIndex

integer

ดัชนีของช่อง shipments ในแหล่งที่มา ShipmentModel

isPickup

boolean

หากเป็นจริง การเข้าชมจะสอดคล้องกับการรับ Shipment มิฉะนั้น ระบบจะถือว่าคำสั่งซื้อนั้นเกี่ยวข้องกับการนำส่ง

visitRequestIndex

integer

ดัชนีของ VisitRequest ในช่องการรับสินค้าหรือการนำส่งของ Shipment (ดู isPickup)

startTime

string (Timestamp format)

เวลาที่การเข้าชมเริ่มต้น โปรดทราบว่ายานพาหนะอาจมาถึงสถานที่เข้าชมเร็วกว่านี้ เวลาสอดคล้องกับ ShipmentModel

การประทับเวลาจะอยู่ในรูปแบบ RFC3339 UTC "Zulu" ที่มีความละเอียดระดับนาโนวินาทีและทศนิยมสูงสุด 9 หลัก ตัวอย่างเช่น "2014-10-02T15:01:23Z" และ "2014-10-02T15:01:23.045123456Z"

loadDemands

map (key: string, value: object (Load))

ดีมานด์การโหลดการเข้าชมทั้งหมดเป็นผลรวมของการจัดส่งและคำขอเข้าชม loadDemands ค่าจะเป็นลบหากการเข้าชมเป็นการนําส่ง ระบบจะรายงานดีมานด์สำหรับประเภทเดียวกับ Transition.loads (ดูในช่องนี้)

detour

string (Duration format)

เวลาอ้อมทางเพิ่มเติมเนื่องจากมีการเข้าชมการจัดส่งในเส้นทางก่อนการเข้าชม และเวลารอที่อาจเกิดขึ้นเนื่องจากกรอบเวลา หากการเข้าชมเป็นการนําส่ง ระบบจะคํานวณการอ้อมเส้นทางจากการเข้าชมเพื่อรับสินค้าที่เกี่ยวข้องและเท่ากับ

startTime(delivery) - startTime(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

มิเช่นนั้น ระบบจะคํานวณจากยานพาหนะ startLocation และมีค่าเท่ากับ

startTime - vehicleStartTime - travel duration from
the vehicle's `startLocation` to the visit.

ระยะเวลาเป็นวินาทีที่มีเศษทศนิยมได้สูงสุด 9 หลัก โดยลงท้ายด้วย s เช่น "3.5s"

shipmentLabel

string

สําเนาของ Shipment.label ที่เกี่ยวข้อง หากระบุไว้ใน Shipment

visitLabel

string

สําเนาของ VisitRequest.label ที่เกี่ยวข้อง หากระบุไว้ใน VisitRequest

ทรานซิชัน

การเปลี่ยนระหว่างเหตุการณ์ 2 รายการในเส้นทาง ดูคำอธิบายของ ShipmentRoute

หากยานพาหนะไม่มี startLocation และ/หรือ endLocation เมตริกการเดินทางที่เกี่ยวข้องจะเป็น 0

การแสดง JSON
{
  "travelDuration": string,
  "travelDistanceMeters": number,
  "trafficInfoUnavailable": boolean,
  "delayDuration": string,
  "breakDuration": string,
  "waitDuration": string,
  "totalDuration": string,
  "startTime": string,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "routeToken": string,
  "vehicleLoads": {
    string: {
      object (VehicleLoad)
    },
    ...
  }
}
ช่อง
travelDuration

string (Duration format)

ระยะเวลาการเดินทางระหว่างการเปลี่ยนผ่านนี้

ระยะเวลาเป็นวินาทีที่มีเศษทศนิยมได้สูงสุด 9 หลัก โดยลงท้ายด้วย s เช่น "3.5s"

travelDistanceMeters

number

ระยะทางที่เดินทางระหว่างการเปลี่ยน

trafficInfoUnavailable

boolean

เมื่อมีการขอข้อมูลการเข้าชมผ่าน OptimizeToursRequest.consider_road_traffic และดึงข้อมูลการเข้าชมสําหรับ Transition ไม่ได้ ระบบจะตั้งค่าบูลีนนี้เป็น "จริง" ปัญหานี้อาจเกิดขึ้นชั่วคราว (เซิร์ฟเวอร์ข้อมูลการจราจรแบบเรียลไทม์ทำงานขัดข้องเป็นครั้งคราว) หรือถาวร (ไม่มีข้อมูลสำหรับสถานที่นี้)

delayDuration

string (Duration format)

ผลรวมของระยะเวลาการเลื่อนเวลาที่ใช้กับทรานซิชันนี้ หากมี หน่วงเวลาจะเริ่มขึ้น delayDuration วินาทีก่อนเหตุการณ์ถัดไป (การเข้าชมหรือยานพาหนะสิ้นสุด) ดู TransitionAttributes.delay

ระยะเวลาเป็นวินาทีที่มีเศษทศนิยมได้สูงสุด 9 หลัก โดยลงท้ายด้วย s เช่น "3.5s"

breakDuration

string (Duration format)

ผลรวมของระยะเวลาของช่วงพักที่เกิดขึ้นระหว่างการเปลี่ยนนี้ หากมี ระบบจะจัดเก็บรายละเอียดเกี่ยวกับเวลาเริ่มต้นและระยะเวลาของช่วงพักแต่ละช่วงไว้ใน ShipmentRoute.breaks

ระยะเวลาเป็นวินาทีที่มีเศษทศนิยมได้สูงสุด 9 หลัก โดยลงท้ายด้วย s เช่น "3.5s"

waitDuration

string (Duration format)

เวลาที่ใช้ในการรอระหว่างการเปลี่ยนนี้ ระยะเวลารอจะสอดคล้องกับเวลาที่ไม่ได้ใช้งาน และไม่รวมเวลาพัก และโปรดทราบว่าเวลารอนี้อาจแบ่งออกเป็นหลายช่วงเวลาที่ไม่ต่อเนื่องกัน

ระยะเวลาเป็นวินาทีที่มีเศษทศนิยมได้สูงสุด 9 หลัก โดยลงท้ายด้วย s เช่น "3.5s"

totalDuration

string (Duration format)

ระยะเวลาทั้งหมดของการเปลี่ยน ซึ่งระบุไว้เพื่อความสะดวก ซึ่งมีค่าเท่ากับ

  • การเข้าชมครั้งถัดไป startTime (หรือ vehicleEndTime หากเป็นการเปลี่ยนครั้งล่าสุด) - startTime ของการเปลี่ยนนี้
  • หาก ShipmentRoute.has_traffic_infeasibilities เป็นเท็จ เงื่อนไขเพิ่มเติมคือ `totalDuration = travelDuration + delayDuration
  • breakDuration + waitDuration`

ระยะเวลาเป็นวินาทีที่มีเศษทศนิยมได้สูงสุด 9 หลัก โดยลงท้ายด้วย s เช่น "3.5s"

startTime

string (Timestamp format)

เวลาเริ่มต้นของการเปลี่ยนนี้

การประทับเวลาจะอยู่ในรูปแบบ RFC3339 UTC "Zulu" ที่มีความละเอียดระดับนาโนวินาทีและทศนิยมสูงสุด 9 หลัก ตัวอย่างเช่น "2014-10-02T15:01:23Z" และ "2014-10-02T15:01:23.045123456Z"

routePolyline

object (EncodedPolyline)

การนําเสนอเส้นประกอบที่เข้ารหัสของเส้นทางที่ไปตามการเปลี่ยน ระบบจะป้อนข้อมูลในช่องนี้เฉพาะในกรณีที่ตั้งค่า populateTransitionPolylines เป็น "จริง"

routeToken

string

เอาต์พุตเท่านั้น โทเค็นแบบทึบที่สามารถส่งไปยัง Navigation SDK เพื่อสร้างเส้นทางใหม่ระหว่างการนําทาง และในกรณีที่มีการเปลี่ยนเส้นทาง ให้ยึดตามเจตนาเดิมเมื่อสร้างเส้นทาง ถือว่าโทเค็นนี้เป็น Blob แบบทึบ อย่าเปรียบเทียบค่าของเส้นทางนี้ในคำขอต่างๆ เนื่องจากค่าอาจเปลี่ยนแปลงได้แม้ว่าบริการจะแสดงผลเส้นทางเดียวกันทุกประการก็ตาม ระบบจะป้อนข้อมูลในช่องนี้เฉพาะในกรณีที่ตั้งค่า populateTransitionPolylines เป็น "จริง"

vehicleLoads

map (key: string, value: object (VehicleLoad))

น้ำหนักบรรทุกของยานพาหนะในระหว่างการเปลี่ยนผ่านนี้สำหรับแต่ละประเภทที่ปรากฏใน Vehicle.load_limits ของยานพาหนะนี้ หรือมี Shipment.load_demands ที่ไม่ใช่ 0 ในการจัดส่งบางรายการที่ดำเนินการในเส้นทางนี้

น้ำหนักบรรทุกระหว่างการเปลี่ยนเส้นทางครั้งแรกคือน้ำหนักบรรทุกเริ่มต้นของเส้นทางยานพาหนะ จากนั้นหลังจากการเข้าชมแต่ละครั้ง ระบบจะเพิ่มหรือลบ loadDemands ของการเข้าชมนั้นเพื่อรับการโหลดของการเปลี่ยนเส้นทางถัดไป ทั้งนี้ขึ้นอยู่กับว่าการเข้าชมเป็นการไปรับหรือการนำส่ง

EncodedPolyline

การนำเสนอที่เข้ารหัสของเส้นประกอบ ดูข้อมูลเพิ่มเติมเกี่ยวกับการเข้ารหัสเส้นประกอบได้ที่ https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding

การแสดง JSON
{
  "points": string
}
ช่อง
points

string

สตริงที่แสดงจุดที่เข้ารหัสของเส้นประกอบ

พัก

ข้อมูลที่แสดงถึงการดำเนินการของช่วงพัก

การแสดง JSON
{
  "startTime": string,
  "duration": string
}
ช่อง
startTime

string (Timestamp format)

เวลาเริ่มต้นของช่วงพัก

การประทับเวลาจะอยู่ในรูปแบบ RFC3339 UTC "Zulu" ที่มีความละเอียดระดับนาโนวินาทีและทศนิยมสูงสุด 9 หลัก ตัวอย่างเช่น "2014-10-02T15:01:23Z" และ "2014-10-02T15:01:23.045123456Z"

duration

string (Duration format)

ระยะเวลาของช่วงพัก

ระยะเวลาเป็นวินาทีที่มีเศษทศนิยมได้สูงสุด 9 หลัก โดยลงท้ายด้วย s เช่น "3.5s"