บริการเมทริกซ์ระยะทาง

ภาพรวม

บริการ Distance Matrix ของ Google จะคำนวณระยะทางและระยะเวลาการเดินทางระหว่างต้นทางกับจุดหมายปลายทางหลายแห่ง โดยใช้รูปแบบการเดินทางที่ระบุ

บริการนี้จะไม่แสดงข้อมูลเส้นทางโดยละเอียด คุณจะดูข้อมูลเส้นทาง ซึ่งรวมถึงโพลีไลน์และข้อความเส้นทางได้โดยการส่งผ่านต้นทางและปลายทางเดียวที่ต้องการไปยังบริการเส้นทาง

เริ่มต้นใช้งาน

ก่อนที่จะใช้บริการ Distance Matrix ใน Maps JavaScript API ก่อนอื่นให้เปิดใช้ Distance Matrix API ใน Google Cloud Console ในโครงการเดียวกับที่คุณตั้งค่าสำหรับ Maps JavaScript API

วิธีดูรายการ API ที่เปิดใช้

  1. ไปที่ Google Cloud Console
  2. คลิกปุ่มเลือกโปรเจ็กต์ จากนั้นเลือกโปรเจ็กต์เดียวกับที่คุณตั้งค่าสำหรับ Maps JavaScript API แล้วคลิกเปิด
  3. จากรายการ API ในหน้าแดชบอร์ด ให้มองหา Distance Matrix API
  4. หากเห็น API ในรายการ นั่นหมายความว่าทุกอย่างเรียบร้อยแล้ว หาก API ไม่อยู่ในรายการ ให้เปิดใช้งานโดยทำดังนี้
    1. เลือกเปิดใช้ API ที่ด้านบนของหน้าเพื่อแสดงแท็บไลบรารี หรือเลือกคลังจากเมนูด้านซ้าย
    2. ค้นหา Distance Matrix API แล้วเลือกจากรายการผลลัพธ์
    3. เลือกเปิดใช้ เมื่อดำเนินการเสร็จ Distance Matrix API จะปรากฏในรายการ API ในหน้าแดชบอร์ด

ราคาและนโยบาย

การกำหนดราคา

ตั้งแต่วันที่ 16 กรกฎาคม 2018 แผนการตั้งราคาแบบจ่ายเมื่อใช้จะมีผลกับ Maps, Routes และ Places หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับราคาและขีดจำกัดการใช้งานใหม่สำหรับการใช้บริการ JavaScript Distance Matrix โปรดดูการใช้งานและการเรียกเก็บเงินสำหรับ Distance Matrix API

หมายเหตุ: การค้นหาแต่ละรายการที่ส่งไปยังบริการ Distance Matrix จะถูกจำกัดตามจำนวนองค์ประกอบที่อนุญาต โดยที่จำนวน ต้นทาง คูณจำนวน ปลายทาง เป็นตัวกำหนดจำนวนองค์ประกอบ

นโยบาย

การใช้บริการ Distance Matrix API ต้องเป็นไปตามนโยบายสำหรับ Distance Matrix API

คำขอเมทริกซ์ระยะทาง

การเข้าถึงบริการ Distance Matrix คือแบบไม่พร้อมกัน เนื่องจาก Google Maps API ต้องเรียกไปยังเซิร์ฟเวอร์ภายนอก ด้วยเหตุนี้ คุณจึงต้องส่งเมธอด callback เพื่อดําเนินการเมื่อคําขอเสร็จสมบูรณ์ เพื่อประมวลผลผลลัพธ์

คุณเข้าถึงบริการ Distance Matrix ภายในโค้ดผ่านออบเจ็กต์ตัวสร้าง google.maps.DistanceMatrixService เมธอด DistanceMatrixService.getDistanceMatrix() จะส่งคำขอไปยังบริการ Distance Matrix ด้วยการส่งผ่านออบเจ็กต์ DistanceMatrixRequest แบบตรงไปยังบริการดังกล่าวที่มีต้นทาง ปลายทาง และโหมดการเดินทาง ตลอดจนเมธอดโค้ดเรียกกลับที่จะเรียกใช้เมื่อได้รับการตอบกลับ

var origin1 = new google.maps.LatLng(55.930385, -3.118425);
var origin2 = 'Greenwich, England';
var destinationA = 'Stockholm, Sweden';
var destinationB = new google.maps.LatLng(50.087692, 14.421150);

var service = new google.maps.DistanceMatrixService();
service.getDistanceMatrix(
  {
    origins: [origin1, origin2],
    destinations: [destinationA, destinationB],
    travelMode: 'DRIVING',
    transitOptions: TransitOptions,
    drivingOptions: DrivingOptions,
    unitSystem: UnitSystem,
    avoidHighways: Boolean,
    avoidTolls: Boolean,
  }, callback);

function callback(response, status) {
  // See Parsing the Results for
  // the basics of a callback function.
}

ดูตัวอย่าง

DistanceMatrixRequest ประกอบด้วยช่องต่อไปนี้

  • origins (ต้องระบุ) — อาร์เรย์ที่มีสตริงที่อยู่อย่างน้อย 1 รายการ ออบเจ็กต์ google.maps.LatLng หรือออบเจ็กต์วางที่จะคำนวณระยะทางและเวลา
  • destinations (ต้องระบุ) — อาร์เรย์ที่มีสตริงที่อยู่ตั้งแต่ 1 รายการขึ้นไป ออบเจ็กต์ google.maps.LatLng หรือออบเจ็กต์วางที่จะคำนวณระยะทางและเวลา
  • travelMode (ไม่บังคับ) — รูปแบบการเดินทางที่จะใช้เมื่อคำนวณเส้นทาง ดูหัวข้อเกี่ยวกับรูปแบบการเดินทาง
  • transitOptions (ไม่บังคับ) — ตัวเลือกที่ใช้กับคำขอในกรณีที่ travelMode เป็น TRANSIT เท่านั้น ค่าที่ถูกต้องอธิบายไว้ในส่วนตัวเลือกการขนส่ง
  • drivingOptions (ไม่บังคับ) ระบุค่าที่จะใช้เฉพาะกับคำขอที่ travelMode เป็น DRIVING ค่าที่ถูกต้องอธิบายไว้ในส่วนตัวเลือกการขับรถ
  • unitSystem (ไม่บังคับ) — ระบบของหน่วยที่จะใช้เมื่อแสดงระยะทาง ค่าที่ยอมรับมีดังนี้
    • google.maps.UnitSystem.METRIC (ค่าเริ่มต้น)
    • google.maps.UnitSystem.IMPERIAL
  • avoidHighways (ไม่บังคับ) — หากเป็น true ระบบจะคำนวณเส้นทางระหว่างต้นทางและปลายทางเพื่อหลีกเลี่ยงทางหลวงหากเป็นไปได้
  • avoidTolls (ไม่บังคับ) — หากเป็น true เส้นทางระหว่างจุดจะคำนวณโดยใช้เส้นทางที่ไม่ใช่ค่าผ่านทาง หากทำได้

รูปแบบการเดินทาง

คุณระบุรูปแบบการเดินทางที่จะใช้ได้เมื่อคำนวณเวลาและระยะทาง โหมดการเดินทางที่รองรับในปัจจุบันมีดังนี้

  • BICYCLING จะขอเส้นทางจักรยานผ่านเส้นทางจักรยานและถนนที่ต้องการ (ปัจจุบันมีให้บริการเฉพาะในสหรัฐอเมริกาและบางเมืองในแคนาดา)
  • DRIVING (ค่าเริ่มต้น) ระบุเส้นทางการขับขี่มาตรฐานโดยใช้เครือข่ายถนน
  • TRANSIT ขอเส้นทางผ่านเส้นทางขนส่งสาธารณะ คุณจะระบุตัวเลือกนี้ได้ก็ต่อเมื่อคำขอมีคีย์ API เท่านั้น ดูหัวข้อเกี่ยวกับตัวเลือกขนส่งสาธารณะสำหรับตัวเลือกที่มีให้ใช้งานในคำขอประเภทนี้
  • WALKING ขอเส้นทางเดินเท้าผ่านทางเท้าและทางเท้า (หากมี)

ตัวเลือกขนส่งสาธารณะ

ขณะนี้บริการขนส่งสาธารณะอยู่ใน "ทดลอง" ในระยะนี้ เราจะใช้การจำกัดอัตราเพื่อป้องกันการละเมิด API ท้ายที่สุดแล้ว เราจะบังคับใช้ขีดจำกัดสูงสุดของจำนวนคำค้นหาทั้งหมดต่อการโหลดแผนที่โดยอิงตามการใช้งาน API ที่เหมาะสม

ตัวเลือกที่ใช้ได้สำหรับคำขอเมทริกซ์ระยะทางจะแตกต่างกันไปในแต่ละรูปแบบการเดินทาง ในคำขอขนส่งสาธารณะ ระบบจะไม่สนใจตัวเลือก avoidHighways และ avoidTolls คุณระบุตัวเลือกการกำหนดเส้นทางเฉพาะขนส่งสาธารณะได้ผ่าน Object Literal ของ TransitOptions

คำขอขนส่งสาธารณะจะคำนึงถึงเวลาเป็นสำคัญ ระบบจะแสดงผลการคำนวณสำหรับเวลาในอนาคตเท่านั้น

Object Literal ของ TransitOptions มีช่องต่อไปนี้

{
  arrivalTime: Date,
  departureTime: Date,
  modes: [transitMode1, transitMode2]
  routingPreference: TransitRoutePreference
}

ฟิลด์เหล่านี้มีคำอธิบายอยู่ด้านล่าง:

  • arrivalTime (ไม่บังคับ) ระบุเวลาถึงที่ต้องการเป็นออบเจ็กต์ Date หากระบุเวลาถึงไว้ ระบบจะไม่พิจารณาเวลาออกเดินทาง
  • departureTime (ไม่บังคับ) ระบุเวลาออกเดินทางที่ต้องการเป็นออบเจ็กต์ Date ระบบจะละเว้น departureTime หากระบุ arrivalTime ค่าเริ่มต้นคือตอนนี้ (ซึ่งก็คือเวลาปัจจุบัน) หากไม่ได้ระบุค่าสำหรับ departureTime หรือ arrivalTime
  • modes (ไม่บังคับ) เป็นอาร์เรย์ที่มีออบเจ็กต์ TransitMode อย่างน้อย 1 รายการ คุณจะรวมช่องนี้ได้ก็ต่อเมื่อคำขอมีคีย์ API เท่านั้น TransitMode แต่ละรายการจะระบุรูปแบบการเดินทางที่ต้องการ ค่าที่อนุญาตมีดังต่อไปนี้
    • BUS บ่งบอกว่าเส้นทางที่คำนวณแล้วควรเป็นการเดินทางด้วยรถประจำทาง
    • RAIL บ่งบอกว่าเส้นทางที่คำนวณแล้วควรเดินทางโดยรถไฟ รถราง รถไฟฟ้ารางเบา และรถไฟใต้ดิน
    • SUBWAY บ่งบอกว่าเส้นทางที่คำนวณแล้วควรเป็นการเดินทางด้วยรถไฟใต้ดิน
    • TRAIN บ่งบอกว่าเส้นทางที่คำนวณแล้วควรเดินทางโดยรถไฟ
    • TRAM บ่งบอกว่าเส้นทางที่คำนวณแล้วควรเดินทางด้วยรถรางและรถไฟฟ้ารางเบา
  • routingPreference (ไม่บังคับ) ระบุค่ากำหนดสำหรับเส้นทางขนส่งสาธารณะ เมื่อใช้ตัวเลือกนี้ คุณจะให้น้ำหนักกับตัวเลือกที่แสดงผล แทนการยอมรับเส้นทางที่ดีที่สุดเริ่มต้นที่ API เลือกไว้ คุณจะระบุข้อมูลในช่องนี้ได้ต่อเมื่อคำขอมีคีย์ API เท่านั้น ค่าที่อนุญาตมีดังต่อไปนี้
    • FEWER_TRANSFERS บ่งบอกว่าเส้นทางที่คำนวณแล้วควรต่อจำนวนการโอนในจำนวนที่จำกัด
    • LESS_WALKING บ่งชี้ว่าเส้นทางที่คำนวนไว้ควรใช้การเดินในปริมาณจำกัด

ตัวเลือกการขับขี่

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

ออบเจ็กต์ drivingOptions มีช่องต่อไปนี้

{
  departureTime: Date,
  trafficModel: TrafficModel
}

ฟิลด์เหล่านี้มีคำอธิบายอยู่ด้านล่าง:

  • departureTime (ต้องระบุเพื่อให้ออบเจ็กต์ drivingOptions ถูกต้อง) ระบุเวลาออกเดินทางที่ต้องการเป็นออบเจ็กต์ Date ค่านี้ต้องกำหนดเป็นเวลาปัจจุบันหรือเวลาในอนาคต โดยต้องไม่เป็นวันที่ผ่านมาแล้ว (API จะแปลงวันที่ทั้งหมดเป็นเวลา UTC เพื่อให้มีการจัดการที่สอดคล้องกันในเขตเวลาต่างๆ) หากคุณใส่ departureTime ในคำขอ API จะแสดงเส้นทางที่ดีที่สุดตามสภาพการจราจรที่คาดไว้ในขณะนั้น และรวมเวลาที่คาดการณ์ไว้ในการรับส่งข้อมูล (duration_in_traffic) ในการตอบสนอง หากคุณไม่ระบุเวลาออกเดินทาง (กล่าวคือ หากคำขอไม่มี drivingOptions) โดยทั่วไปแล้ว เส้นทางขากลับจะเป็นเส้นทางที่ดีโดยไม่พิจารณาถึงสภาพการจราจร
  • trafficModel (ไม่บังคับ) ระบุสมมติฐานที่จะใช้เมื่อคำนวณเวลาในการรับส่ง การตั้งค่านี้ส่งผลต่อค่าที่แสดงผลในช่อง duration_in_traffic ในการตอบกลับ ซึ่งมีเวลาที่คาดการณ์ไว้ในการเข้าชมตามค่าเฉลี่ยที่ผ่านมา ค่าเริ่มต้นคือ best_guess ค่าที่อนุญาตมีดังต่อไปนี้
    • bestguess (ค่าเริ่มต้น) บ่งบอกว่า duration_in_traffic ที่แสดงกลับมาควรเป็นค่าประมาณที่ดีที่สุดในการเดินทาง โดยพิจารณาจากข้อมูลสภาพการจราจรที่ผ่านมาและสภาพการจราจรปัจจุบัน การจราจรแบบเรียลไทม์มีความสำคัญมากขึ้นเมื่ออยู่ใกล้ departureTime มากขึ้น..
    • pessimistic แสดงให้เห็นว่า duration_in_traffic ที่ส่งกลับมาควรนานกว่าระยะเวลาเดินทางจริงในเกือบทุกวัน แต่ในบางครั้งวันที่สภาพการจราจรแย่เป็นพิเศษอาจมีค่าสูงกว่านี้
    • optimistic บ่งบอกว่า duration_in_traffic ที่ส่งกลับมาควรน้อยกว่าระยะเวลาเดินทางจริงในเกือบทุกวัน แต่ในบางครั้งวันที่สภาพการจราจรดีเป็นพิเศษอาจเร็วกว่าค่านี้

ด้านล่างคือตัวอย่าง DistanceMatrixRequest สำหรับเส้นทางการขับรถ รวมถึงเวลาออกเดินทางและรูปแบบการจราจร

{
  origins: [{lat: 55.93, lng: -3.118}, 'Greenwich, England'],
  destinations: ['Stockholm, Sweden', {lat: 50.087, lng: 14.421}],
  travelMode: 'DRIVING',
  drivingOptions: {
    departureTime: new Date(Date.now() + N),  // for the time N milliseconds from now.
    trafficModel: 'optimistic'
  }
}

การตอบสนองเมทริกซ์ระยะทาง

การเรียกบริการ Distance Matrix ได้สำเร็จจะส่งคืนออบเจ็กต์ DistanceMatrixResponse และออบเจ็กต์ DistanceMatrixStatus ระบบจะส่งต่อไปยังฟังก์ชันเรียกกลับที่คุณระบุในคำขอ

ออบเจ็กต์ DistanceMatrixResponse มีข้อมูลระยะทางและระยะเวลาสําหรับคู่ต้นทาง/ปลายทางแต่ละคู่ที่คํานวณเส้นทางได้

{
  "originAddresses": [ "Greenwich, Greater London, UK", "13 Great Carleton Square, Edinburgh, City of Edinburgh EH16 4, UK" ],
  "destinationAddresses": [ "Stockholm County, Sweden", "Dlouhá 609/2, 110 00 Praha-Staré Město, Česká republika" ],
  "rows": [ {
    "elements": [ {
      "status": "OK",
      "duration": {
        "value": 70778,
        "text": "19 hours 40 mins"
      },
      "distance": {
        "value": 1887508,
        "text": "1173 mi"
      }
    }, {
      "status": "OK",
      "duration": {
        "value": 44476,
        "text": "12 hours 21 mins"
      },
      "distance": {
        "value": 1262780,
        "text": "785 mi"
      }
    } ]
  }, {
    "elements": [ {
      "status": "OK",
      "duration": {
        "value": 96000,
        "text": "1 day 3 hours"
      },
      "distance": {
        "value": 2566737,
        "text": "1595 mi"
      }
    }, {
      "status": "OK",
      "duration": {
        "value": 69698,
        "text": "19 hours 22 mins"
      },
      "distance": {
        "value": 1942009,
        "text": "1207 mi"
      }
    } ]
  } ]
}

ผลลัพธ์เมทริกซ์ระยะทาง

ช่องที่รองรับในการตอบกลับจะอธิบายไว้ด้านล่าง

  • originAddresses คืออาร์เรย์ที่มีตำแหน่งที่ส่งผ่านในช่อง origins ของคำขอ Distance Matrix ระบบจะแสดงผลที่อยู่ตามการจัดรูปแบบโดยโปรแกรมเข้ารหัสพิกัดภูมิศาสตร์
  • destinationAddresses เป็นอาร์เรย์ที่มีตำแหน่งที่ส่งผ่านในช่อง destinations ในรูปแบบที่โปรแกรมเข้ารหัสพิกัดภูมิศาสตร์แสดงผล
  • rows คืออาร์เรย์ของออบเจ็กต์ DistanceMatrixResponseRow โดยแต่ละแถวสอดคล้องกับต้นทาง
  • elements เป็นรายการย่อยของ rows และสอดคล้องกับการจับคู่ต้นทางของแถวกับปลายทางแต่ละรายการ โดยจะมีสถานะ ระยะเวลา ระยะทาง และข้อมูลค่าโดยสาร (หากมี) สำหรับคู่ต้นทาง/ปลายทางแต่ละคู่
  • element แต่ละรายการจะมีช่องต่อไปนี้
    • status: ดูรหัสสถานะสำหรับรายการรหัสสถานะที่เป็นไปได้
    • duration: ระยะเวลาที่ใช้ในการเดินทางตามเส้นทางนี้ โดยระบุเป็นวินาที (ช่อง value) และในรูปแบบ text ค่าข้อความจะมีการจัดรูปแบบตาม unitSystem ที่ระบุไว้ในคำขอ (หรือในเมตริก หากไม่ได้ระบุค่ากำหนด)
    • duration_in_traffic: ระยะเวลาที่ใช้ในการเดินทางในเส้นทางนี้โดยพิจารณาจากสภาพการจราจรปัจจุบัน ซึ่งแสดงเป็นวินาที (ช่อง value) และในรูปแบบ text ค่าข้อความจะมีการจัดรูปแบบตาม unitSystem ที่ระบุไว้ในคำขอ (หรือในเมตริก หากไม่ได้ระบุค่ากำหนด) ระบบจะส่งคืน duration_in_traffic ให้ลูกค้าแพ็กเกจพรีเมียมของ Google Maps Platform ในกรณีที่มีข้อมูลการจราจรเท่านั้น รวมถึงตั้งค่า mode เป็น driving และรวม departureTime ไว้เป็นส่วนหนึ่งของช่อง distanceMatrixOptions ในคำขอ
    • distance: ระยะทางทั้งหมดของเส้นทางนี้ หน่วยเป็นเมตร (value) และ text ค่าข้อความจะมีการจัดรูปแบบตาม unitSystem ที่ระบุในคำขอ (หรือในเมตริก หากไม่ได้ระบุค่ากำหนด)
    • fare: ประกอบด้วยราคารวม (ค่าใช้จ่ายสำหรับตั๋วทั้งหมด) สำหรับเส้นทางนี้ ที่พักนี้จะแสดงสำหรับคำขอขนส่งสาธารณะเท่านั้น และจะแสดงกับผู้ให้บริการขนส่งสาธารณะที่มีข้อมูลค่าโดยสารเท่านั้น ข้อมูลดังกล่าวรวมถึง
      • currency: รหัสสกุลเงิน ISO 4217 ที่ระบุสกุลเงินที่ใช้แสดงจำนวนเงิน
      • value: จำนวนเงินค่าโดยสารทั้งหมดในสกุลเงินที่ระบุไว้ข้างต้น

รหัสสถานะ

การตอบกลับเมทริกซ์ระยะทางจะมีรหัสสถานะสำหรับการตอบกลับโดยรวม พร้อมสถานะสำหรับแต่ละองค์ประกอบ

รหัสสถานะการตอบกลับ

ระบบจะส่งรหัสสถานะที่ใช้กับ DistanceMatrixResponse ในออบเจ็กต์ DistanceMatrixStatus และมีข้อมูลต่อไปนี้

  • OK — คำขอถูกต้อง ระบบจะแสดงผลสถานะนี้แม้ว่าจะไม่พบเส้นทางระหว่างต้นทางและปลายทางใดๆ ดูข้อมูลสถานะระดับองค์ประกอบในรหัสสถานะองค์ประกอบ
  • INVALID_REQUEST — คำขอที่ระบุไม่ถูกต้อง ปัญหานี้มักเกิดจากการขาดช่องที่ต้องกรอก ดู รายการช่องที่รองรับด้านบน
  • MAX_ELEMENTS_EXCEEDED — ผลิตภัณฑ์ของต้นทางและปลายทางเกินขีดจำกัดต่อการค้นหา
  • MAX_DIMENSIONS_EXCEEDED — คำขอของคุณมีต้นทางมากกว่า 25 แห่ง หรือมีปลายทางมากกว่า 25 แห่ง
  • OVER_QUERY_LIMIT — แอปพลิเคชันของคุณขอองค์ประกอบมากเกินไปภายในระยะเวลาที่อนุญาต คำขอควรจะประสบความสำเร็จหากคุณลองอีกครั้งหลังจากผ่านไประยะหนึ่ง
  • REQUEST_DENIED — บริการปฏิเสธการใช้บริการ Distance Matrix โดยหน้าเว็บของคุณ
  • UNKNOWN_ERROR - ดำเนินการตามคำขอเมทริกซ์ระยะทางไม่ได้เนื่องจากข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์ คำขออาจสำเร็จหากคุณลองอีกครั้ง

รหัสสถานะองค์ประกอบ

รหัสสถานะต่อไปนี้ใช้กับออบเจ็กต์ DistanceMatrixElement ที่เจาะจง

  • NOT_FOUND — ระบุพิกัดทางภูมิศาสตร์สำหรับต้นทางและ/หรือปลายทางของการจับคู่นี้ไม่ได้
  • OK — การตอบกลับมีผลลัพธ์ที่ถูกต้อง
  • ZERO_RESULTS — ไม่พบเส้นทางระหว่างต้นทางและปลายทาง

การแยกวิเคราะห์ผลลัพธ์

ออบเจ็กต์ DistanceMatrixResponse มี row 1 รายการสำหรับแต่ละต้นทางที่ส่งผ่านในคำขอ โดยแต่ละแถวจะมีช่อง element สําหรับการจับคู่ต้นทางแต่ละรายการกับปลายทางที่ระบุ

function callback(response, status) {
  if (status == 'OK') {
    var origins = response.originAddresses;
    var destinations = response.destinationAddresses;

    for (var i = 0; i < origins.length; i++) {
      var results = response.rows[i].elements;
      for (var j = 0; j < results.length; j++) {
        var element = results[j];
        var distance = element.distance.text;
        var duration = element.duration.text;
        var from = origins[i];
        var to = destinations[j];
      }
    }
  }
}