סקירה כללית
שירות Distance Matrix של Google מחשב את מרחק הנסיעה ואת משך הנסיעה בין כמה נקודות מוצא ויעד באמצעות אמצעי תחבורה נתון.
השירות הזה לא מחזיר פרטי מסלול מפורטים. כדי לקבל מידע על מסלול, כולל קווים פוליגונים והוראות טקסט, מעבירים את המקור והיעד הרצויים ל-Directions Service.
תחילת העבודה
לפני שמשתמשים בשירות מטריצת המרחקים ב-Maps JavaScript API, צריך לוודא ש-Distance Matrix API (ממשק API מדור קודם) מופעל במסוף Google Cloud, באותו פרויקט שהגדרתם ל-Maps JavaScript API.
כדי להציג את רשימת ממשקי ה-API המופעלים:
- נכנסים ל מסוף Google Cloud.
- לוחצים על הלחצן Select a project, בוחרים את אותו פרויקט שהגדרתם ל-Maps JavaScript API ולוחצים על Open.
- ברשימת ממשקי ה-API במרכז הבקרה, מחפשים את Distance Matrix API (Legacy).
- אם ה-API מופיע ברשימה, סימן שהכול מוכן. אם ה-API לא מופיע ברשימה, מפעילים אותו בכתובת https://console.cloud.google.com/apis/library/distance-matrix-backend.googleapis.com.
תמחור ומדיניות
תמחור
למידע על התמחור ועל מדיניות השימוש בשירות מטריצת המרחקים ב-JavaScript, ראו שימוש וחיוב ב-Distance Matrix API (ממשק מדור קודם).
הערה: כל שאילתה שנשלחת לשירות Distance Matrix מוגבלת למספר הרכיבים המותרים, כאשר מספר המקורות כפול מספר היעדים מגדיר את מספר הרכיבים.
מדיניות
השימוש בשירות Distance Matrix חייב להתבצע בהתאם למדיניות שמתוארת עבור Distance Matrix API (מדור קודם).
בקשות של Distance Matrix
הגישה לשירות מטריצת המרחקים היא אסינכרונית, כי Google Maps API צריך לבצע קריאה לשרת חיצוני. לכן, צריך להעביר שיטה של הפעלה חוזרת שתתבצע בסיום הבקשה, כדי לעבד את התוצאות.
כדי לגשת לשירות Distance Matrix בקוד, משתמשים באובייקט ה-constructor google.maps.DistanceMatrixService.
ה-method DistanceMatrixService.getDistanceMatrix() יוצר בקשה לשירות Distance Matrix, מעביר לו אובייקט DistanceMatrixRequest ליטרלי שמכיל את נקודות המוצא, את נקודות היעד ואת אופן הנסיעה, וגם method של קריאה חוזרת (callback) שיתבצע עם קבלת התשובה.
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(חובה) – מערך שמכיל מחרוזת כתובת אחת או יותר, אובייקטים מסוגgoogle.maps.LatLngאו אובייקטים מסוג Place, שמהם מחשבים את המרחק והזמן.destinations(חובה) – מערך שמכיל מחרוזת כתובת אחת או יותר, אובייקטים מסוגgoogle.maps.LatLngאו אובייקטים מסוג Place שרוצים לחשב את המרחק והזמן אליהם.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. אפשר לציין אפשרויות ניתוב ספציפיות לתחבורה ציבורית באמצעות המשתנה המילולי של האובייקט TransitOptions.
בקשות העברה הן דחופות. החישובים יחזירו ערכים רק לזמנים עתידיים.
המשתנה המילולי של האובייקט TransitOptions מכיל את השדות הבאים:
{ arrivalTime: Date, departureTime: Date, modes: [transitMode1, transitMode2] routingPreference: TransitRoutePreference }
השדות האלה מוסברים בהמשך:
arrivalTime(אופציונלי) מציין את זמן ההגעה הרצוי כאובייקטDate. אם צוינה שעת הגעה, המערכת מתעלמת משעת היציאה.departureTime(אופציונלי) מציין את זמן היציאה הרצוי כאובייקטDate. המערכת תתעלם מ-departureTimeאם צויןarrivalTime. ערך ברירת המחדל הוא 'עכשיו' (כלומר, השעה הנוכחית) אם לא צוין ערך בשדהdepartureTimeאו בשדהarrivalTime.modes(אופציונלי) הוא מערך שמכיל לפחות לישן אחד של אובייקטTransitMode. אפשר לכלול את השדה הזה רק אם הבקשה כוללת מפתח 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
קריאה מוצלחת לשירות 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של הבקשה למרחק המשוער. הכתובות מוחזרות בפורמט שבו הן אופיינו על ידי המקודד הגיאוגרפי.destinationAddressesהוא מערך שמכיל את המיקומים שהועברו בשדהdestinations, בפורמט שהוחזר על ידי המקודד הגיאוגרפי.rowsהוא מערך של אובייקטים מסוגDistanceMatrixResponseRow, כאשר כל שורה תואמת למקור.elementsהם צאצאים שלrows, והם תואמים למקור השורה עם כל יעד. הם מכילים מידע על הסטטוס, משך הנסיעה, המרחק והמחיר (אם זמין) של כל צמד מקור/יעד.- כל
elementמכיל את השדות הבאים:status: רשימה של קודי הסטטוס האפשריים מופיעה במאמר קודי סטטוס.duration: משך הזמן שנדרש כדי לעבור את המסלול הזה, שמופיע בשניות (בשדהvalue) ובערךtext. הפורמט של הערך הטקסטואלי נקבע לפי הערך שלunitSystemשצוין בבקשה (או לפי המדד, אם לא צוינה העדפה).duration_in_traffic: משך הזמן שנדרש כדי לנסוע במסלול הזה, תוך התחשבות בתנאי התנועה הנוכחיים, בשניות (השדהvalue) ובערךtext. הפורמט של הערך הטקסטואלי נקבע לפי הערך שלunitSystemשצוין בבקשה (או לפי המדד, אם לא צוינה העדפה). הערך שלduration_in_trafficמוחזר רק אם נתוני התנועה זמינים, הערך שלmodeמוגדר כ-drivingוהערך שלdepartureTimeנכלל בשדהdistanceMatrixOptionsבבקשה.distance: המרחק הכולל של המסלול הזה, שמופיע במטרים (value) ובערךtext. הפורמט של הערך הטקסטואלי נקבע לפי הערך שלunitSystemשצוין בבקשה (או לפי המדד, אם לא צוינה העדפה).fare: מכיל את המחיר הכולל (כלומר, עלות הכרטיס הכולל) במסלול הזה. הנכס הזה מוחזר רק לבקשות לתחבורה ציבורית, ורק לספקי תחבורה ציבורית שבהם זמינים פרטי התעריפים. המידע כולל:currency: קוד מטבע בתקן ISO 4217 שמציין את המטבע שבו הופיע הסכום.value: סכום המחיר הכולל, במטבע שצוין למעלה.
קודי סטטוס
התשובה של Distance Matrix כוללת קוד סטטוס לתשובה כולה, וגם סטטוס לכל רכיב.
קודי סטטוס תגובה
קודי הסטטוס שחלים על 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 אחד לכל מקור שהוענק בבקשה. כל שורה מכילה שדה 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]; } } } }