نظرة عامة
تحسب خدمة Distance Matrix من Google مسافة التنقّل ومدة الرحلة بين عدة نقاط انطلاق ووجهات باستخدام وسيلة نقل معيّنة.
لا تعرض هذه الخدمة معلومات تفصيلية عن المسار. يمكن الحصول على معلومات المسار، بما في ذلك الخطوط المتعددة والاتجاهات النصية، من خلال تمرير نقطة البداية والوجهة الفرديتين المطلوبتين إلى خدمة الاتجاهات.
الخطوات الأولى
قبل استخدام خدمة Distance Matrix في Maps JavaScript API، تأكَّد أولاً من تفعيل Distance Matrix API (الإصدار القديم) في وحدة تحكّم Google Cloud، وذلك في المشروع نفسه الذي أعددته لـ Maps JavaScript API.
للاطّلاع على قائمة واجهات برمجة التطبيقات المفعَّلة، اتّبِع الخطوات التالية:
- انتقِل إلى وحدة تحكّم Google Cloud.
- انقر على الزر اختيار مشروع، ثم اختَر المشروع نفسه الذي أعددته لـ Maps JavaScript API وانقر على فتح.
- من قائمة واجهات برمجة التطبيقات في لوحة البيانات، ابحث عن Distance Matrix API (الإصدار القديم).
- إذا ظهرت واجهة برمجة التطبيقات في القائمة، يعني ذلك أنّك قد انتهيت من عملية الإعداد. إذا لم تكن واجهة برمجة التطبيقات مدرَجة، فعِّلها على https://console.cloud.google.com/apis/library/distance-matrix-backend.googleapis.com
الأسعار والسياسات
الأسعار
لمعرفة المزيد عن سياسات الأسعار والاستخدام لخدمة JavaScript Distance Matrix، يُرجى الاطّلاع على الاستخدام والفوترة لواجهة برمجة التطبيقات Distance Matrix API (الإصدار القديم).
ملاحظة: يقتصر كل طلب يتم إرساله إلى خدمة "مصفوفة المسافات" على عدد العناصر المسموح بها، حيث يتم تحديد عدد العناصر من خلال عدد المصادر مضروبًا في عدد الوجهات.
السياسات
يجب أن يكون استخدام خدمة Distance Matrix متوافقًا مع السياسات الموضّحة في صفحة Distance Matrix API (الإصدار القديم).
طلبات مصفوفة المسافة
يتم الوصول إلى خدمة Distance Matrix بشكل غير متزامن، لأنّ Google Maps API يحتاج إلى إجراء طلب إلى خادم خارجي. لهذا السبب، عليك تمرير طريقة callback لتنفيذها عند اكتمال الطلب، وذلك لمعالجة النتائج.
يمكنك الوصول إلى خدمة "مصفوفة المسافات" ضمن الرمز البرمجي من خلال عنصر الإنشاء google.maps.DistanceMatrixService.
تبدأ الطريقة DistanceMatrixService.getDistanceMatrix() طلبًا إلى خدمة "مصفوفة المسافات"، وتمرّر إليها حرفيًا كائن 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(مطلوبة) — مصفوفة تحتوي على سلسلة واحدة أو أكثر من سلاسل العناوين أو كائنات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طلبات الحصول على اتجاهات المشي عبر مسارات المشاة والأرصفة (حيثما توفّرت)
خيارات النقل العام
خدمة النقل العام هي حاليًا في مرحلة "تجريبية". خلال هذه المرحلة، سنفرض حدودًا على عدد الطلبات في الدقيقة الواحدة لمنع إساءة استخدام واجهة برمجة التطبيقات. سنفرض في النهاية حدًا أقصى على إجمالي عدد طلبات البحث لكل عملية تحميل خريطة استنادًا إلى الاستخدام العادل لواجهة برمجة التطبيقات.
تختلف الخيارات المتاحة لطلب مصفوفة المسافة باختلاف وسائل النقل.
في طلبات النقل العام، يتم تجاهل الخيارَين avoidHighways وavoidTolls. يمكنك تحديد خيارات توجيه خاصة بالنقل العام من خلال TransitOptions.
طلبات النقل حساسة للوقت. لن يتم عرض العمليات الحسابية إلا للأوقات المستقبلية.
يحتوي حرف الكائن TransitOptions على الحقول التالية:
{ arrivalTime: Date, departureTime: Date, modes: [transitMode1, transitMode2] routingPreference: TransitRoutePreference }
في ما يلي شرح لهذه الحقول:
- تحدّد السمة
arrivalTime(اختيارية) وقت الوصول المطلوب كعنصرDate. إذا تم تحديد وقت الوصول، سيتم تجاهل وقت المغادرة. - تحدّد السمة
departureTime(اختيارية) وقت المغادرة المطلوب كعنصرDate. سيتم تجاهلdepartureTimeفي حال تحديدarrivalTime. يتم ضبط القيمة التلقائية على "الآن" (أي الوقت الحالي) في حال عدم تحديد قيمة لكل منdepartureTimeأوarrivalTime. -
modes(اختياري) هي مصفوفة تحتوي على قيمة حرفية واحدة أو أكثر من قيمTransitMode. لا يمكن تضمين هذا الحقل إلا إذا كان الطلب يتضمّن مفتاح واجهة برمجة تطبيقات. يحدّد كلTransitModeوسيلة نقل عام مفضّلة. يُسمح بالقيم التالية:- يشير
BUSإلى أنّ المسار المحسوب يجب أن يفضّل التنقّل بالحافلة. - يشير
RAILإلى أنّ المسار المحسوب يجب أن يفضّل التنقّل بالقطار والترام والقطار الخفيف ومترو الأنفاق. - يشير الرمز
SUBWAYإلى أنّ المسار المحسوب يجب أن يفضّل التنقّل بواسطة مترو الأنفاق. - يشير
TRAINإلى أنّ المسار المحسوب يجب أن يفضّل التنقّل بالقطار. - يشير
TRAMإلى أنّ المسار المحسوب يجب أن يفضّل التنقّل بالترام والقطار الخفيف.
- يشير
- تحدّد السمة
routingPreference(اختيارية) الإعدادات المفضّلة لمسارات النقل العام. باستخدام هذا الخيار، يمكنك تحديد الخيارات التي يتم عرضها بدلاً من قبول أفضل مسار تلقائي تختاره واجهة برمجة التطبيقات. لا يمكن تحديد هذا الحقل إلا إذا كان الطلب يتضمّن مفتاح API. يُسمح بالقيم التالية:- يشير
FEWER_TRANSFERSإلى أنّ المسار المحسوب يجب أن يفضّل عددًا محدودًا من عمليات تغيير وسائل النقل. - تشير
LESS_WALKINGإلى أنّ المسار المحسوب يجب أن يفضّل السير لمسافات قصيرة.
- يشير
خيارات القيادة
استخدِم العنصر drivingOptions لتحديد وقت المغادرة من أجل احتساب أفضل مسار إلى وجهتك، وذلك بالنظر إلى ظروف حركة المرور المتوقّعة. يمكنك أيضًا تحديد ما إذا كنت تريد أن يكون الوقت المقدَّر في حركة المرور متشائمًا أو متفائلاً أو أفضل تقدير استنادًا إلى حالات حركة المرور السابقة وحركة المرور الحالية.
يحتوي عنصر drivingOptions على الحقول التالية:
{ departureTime: Date, trafficModel: TrafficModel }
في ما يلي شرح لهذه الحقول:
- تحدّد السمة
departureTime(مطلوبة لكي يكون الكائن الحرفيdrivingOptionsصالحًا) وقت المغادرة المطلوب ككائنDate. يجب ضبط القيمة على الوقت الحالي أو وقت في المستقبل. لا يمكن أن يكون تاريخًا سابقًا. (تحوّل واجهة برمجة التطبيقات جميع التواريخ إلى التوقيت العالمي المنسّق لضمان معالجتها بشكل متّسق في جميع المناطق الزمنية). إذا تضمّن الطلبdepartureTime، ستعرض واجهة برمجة التطبيقات أفضل مسار وفقًا لحالات حركة المرور المتوقّعة في الوقت المحدّد، كما ستتضمّن الوقت المتوقّع في حركة المرور (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 API
عند إجراء طلب ناجح إلى خدمة "مصفوفة المسافة"، يتم عرض كائن 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" } } ] } ] }
نتائج Distance Matrix
في ما يلي شرح للحقول المتوافقة في الردّ.
-
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]; } } } }