الفرق بين المراجعتين لصفحة: «Cordova/cordova plugin geolocation»

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:إضافة تحديد الموقع الجغرافي في كوردوفا}}</noinclude> تصنيف: Cordova تصنيف: Plugin ت...'
 
تحديث
 
(7 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:إضافة تحديد الموقع الجغرافي في كوردوفا}}</noinclude>
<noinclude>{{DISPLAYTITLE:إضافة تحديد الموقع الجغرافي في كوردوفا}}</noinclude>
[[تصنيف: Cordova]]
[[تصنيف: Cordova]]
[[تصنيف: Plugin]]
[[تصنيف: Cordova Plugin]]
[[تصنيف: cordova-plugin-geolocation]]
توفر هذه الإضافة معلومات حول الموقع الجغرافي للجهاز، مثل خط العرض وخط الطول.
توفر هذه الإضافة معلومات حول موقع الجهاز، مثل خط ايُعيد وخط الطول.  


من المصادر الشائعة لمعلومات الموقع الجغرافي نجد: نظام تحديد المواقع العالمي (GPS)، واستنتاج الموقع من إشارات الشبكة، مثل عنوان IP وعناوين تحديد الهوية بموجات الراديو (RFID) واللاسلكي (WiFi) وعناوين MAC Bluetooth ومُعرِّفات الخلية GSM/CDMA. ليس هناك ما يضمن أن الواجهة البرمجية ستعيد الموقع الفعلي للجهاز.  
هناك عدة طرقٍ لتحديد معلومات الموقع الجغرافي منها:  
لمعرفة كيفية استخدام هذه الإضافة، اطلع على [#sample sample] في أسفل هذه الصفحة، أو انتقل مباشرة إلى [#reference reference].  
* نظام تحديد المواقع العالمي (GPS)، و 
* استنتاج الموقع من إشارات الشبكة، مثل عنوان IP، وعناوين تحديد الهوية بموجات الراديو (RFID)، و 
* اللاسلكي (WiFi)، و 
* عناوين Bluetooth الفيزيائية (MAC)، و 
* مُعرِّفات الشبكة GSM/CDMA.
ليس هناك ما يضمن أن تعيد الواجهةُ البرمجية الموقعَ الفعلي للجهاز. لمعرفة كيفية استخدام هذه الإضافة، اطلع على الأمثلة التوضيحية في نهاية هذه الصفحة.
__TOC__
تأسست الواجهة البرمجية لهذه الإضافة على [http://dev.w3.org/geo/api/spec-source.html مواصفات الواجهة البرمجية لتحديد المواقع الجغرافية (W3C)] ، ولا تُنفّذ إلا على الأجهزة التي لا توفر تنفيذًا (implementation) جاهزًا لها مسبقًا.


تأسست الواجهة البرمجية لهذه الإضافة على [http://dev.w3.org/geo/api/spec-source.html W3C Geolocation API Specification]، ولا تُنفّذ إلا على الأجهزة التي لا توفر تقديما (implementation) جاهزًا سلفًا.  
'''تنبيه''': جمع واستخدام بيانات تحديد الموقع الجغرافي تثير مخاوف بخصوص قضايا الخصوصية. يجب أن تُوضّح [[Cordova/privacy|سياسةُ الخصوصية]] في تطبيقك كيفية استخدام التطبيق لبيانات تحديد الموقع الجغرافي، وما إن كانت ستُتَشارك مع أي أطراف أخرى، ومستوى دقة البيانات (مثل هل المعلومات ستكون تقريبية، أم دقيقة، أم تستهدف الرمز البريدي ZIP، وغير ذلك). عمومًا، تعتبر بيانات تحديد الموقع الجغرافي حسَّاسة، لأنها قد تُستخدم لمعرفة مكان المستخدم، وفي حال تخزينها، فستكشف تاريخ حركاته وسكناته. لذلك، فبالإضافة إلى سياسة خصوصية التطبيق، سيكون من الجيد تقديم إشعار فوري قبل محاولة تطبيقك الوصول إلى بيانات الموقع الجغرافي (إن لم يكن نظام التشغيل يفعل ذلك سلفًا). ينبغي أن يوفر هذا الإشعار نفس المعلومات المذكورة أعلاه، إضافةً إلى استئذان المُستخدم (على سبيل المثال، عبر تقديم خيارات من قبيل "'''حسنًا'''" و "'''لا شكرًا'''"). لمزيد من المعلومات، يرجى الاطلاع على [[Cordova/privacy|دليل الخصوصية]].  


'''WARNING''': جمع واستخدام بيانات تحديد الموقع الجغرافي تثير مخاوف حول قضايا الخصوصية. يجب أن تناقش سياسة الخصوصية في تطبيقك كيفية استخدام التطبيق لبيانات تحديد الموقع الجغرافي، وما إن كانت ستُتَشارك مع أي أطراف أخرى، ومستوى دقة البيانات (على سبيل المثال، مستوى تقريبي، دقيق، الرمز البريدي، وما إلى ذلك). تعتبر بيانات تحديد الموقع الجغرافي حساسة بشكل عام، لأنها قد تُستخدم لمعرفة مكان وجود المستخدم، وفي حال تخزينها، فستكشف تاريخ سفرياتهم وتحركاتهم. لذلك، فبالإضافة إلى سياسة خصوصية التطبيق، سيكون من الجيد تقديم إشعار فوري قبل وصول تطبيقك إلى بيانات الموقع الجغرافي (إن لم يكن نظام التشغيل المُستخدم في الجهاز يفعل ذلك سلفًا). ينبغي أن يوفر هذا الإشعار نفس المعلومات المذكورة أعلاه، إضافة إلى استئذان المُستخدم (على سبيل المثال، عبر تقديم خيارات من قبيل '''OK''' و '''No Thanks'''). لمزيد من المعلومات، يرجى الاطلاع على [http://cordova.apache.org/docs/en/latest/guide/appdev/privacy/index.html Privacy Guide].  
تعرِّف هذه الإضافة كائنًا عامًّا هو <code>navigator.geolocation</code> (في المنصات التي لا يكون مُعرّفا فيها).  


تعرّف هذه الإضافة كائنًا عامًّا <code>navigator.geolocation</code> (في المنصات التي لا يكون مُعرّفا فيها).
على الرغم من أنّ هذا الكائن موجود في النطاق العام (global scope)، إلا أنّ الميزات التي يوفرها لن تكون متاحة إلا بعد إطلاق الحدث <code>[[Cordova/events#deviceready|deviceready]]</code>.  
 
على الرغم من أن هذا الكائن موجود في النطاق العام (global scope)، فإن الميزات التي توفرها هذه الإضافة لن تكون متاحة إلا بعد إطلاق الحدث <code>deviceready</code>.  
<syntaxhighlight lang="javascript">document.addEventListener("deviceready", onDeviceReady, false);
<syntaxhighlight lang="javascript">document.addEventListener("deviceready", onDeviceReady, false);
     function onDeviceReady() {
     function onDeviceReady() {
سطر 20: سطر 24:
     }‎</syntaxhighlight>  
     }‎</syntaxhighlight>  


==مرجع==
==التثبيت==  
 
== التثبيت ==  


تتطلب إضافة تحديد الموقع الجغرافي كوردوفا 5.0 أوما بعدها (الإصدار المستقر الحالي 1.0.0)  
تتطلب إضافة تحديد الموقع الجغرافي الإصدارَ كوردوفا 5.0 أوما بعده (الإصدار المستقر الحالي 1.0.0). لتثبيتها، نفذ الأمر التالي:
<syntaxhighlight lang="javascript">cordova plugin add cordova-plugin-geolocation‎</syntaxhighlight>  
<syntaxhighlight lang="shell">cordova plugin add cordova-plugin-geolocation‎</syntaxhighlight>  


لا يزال بإمكان الإصدارات القديمة من كوردوفا تثبيت هذه الإضافة عبر المُعرِّف المُتجاوز (الإصدار المستقر 0.3.12)  
لا يزال بإمكان الإصدارات القديمة من كوردوفا تثبيت هذه الإضافة عبر المُعرِّف المهمل (الإصدار المستقر 0.3.12) بالشكل التالي:
<syntaxhighlight lang="javascript">cordova plugin add org.apache.cordova.geolocation‎</syntaxhighlight>  
<syntaxhighlight lang="shell">cordova plugin add org.apache.cordova.geolocation‎</syntaxhighlight>  


من الممكن أيضًا تثبيت هذه الإضافة عبر عنوان مستودع git مباشرة (إلا أنه غير مستقر)  
من الممكن أيضًا تثبيت هذه الإضافة عبر عنوان مستودع git مباشرة (إلا أنه غير مستقر):
<syntaxhighlight lang="javascript">cordova plugin add https://github.com/apache/cordova-plugin-geolocation.git‎</syntaxhighlight>  
<syntaxhighlight lang="shell">cordova plugin add https://github.com/apache/cordova-plugin-geolocation.git‎</syntaxhighlight>  


== المنصات المدعومة ==  
== المنصات المدعومة ==  
سطر 38: سطر 40:
*ويندوز  
*ويندوز  


== التوابع ==  
== التوابع ==
* navigator.geolocation.getCurrentPosition
===<code>navigator.geolocation.getCurrentPosition</code>===  
* navigator.geolocation.watchPosition
* navigator.geolocation.clearWatch
 
== الكائنات (للقراءة فقط) ==  
*Position
* PositionError
*Coordinates
 
==navigator.geolocation.getCurrentPosition==  


يُعيد هذا التابع الموضع الحالي للجهاز إلى دالة الاستجابة (callback) ‏<code>geolocationSuccess</code> مع تمرير الكائن <code>Position</code> كمعامل. إذا كان هناك خطأ، فسيُمرّر لدالة الاستجابة <code>geolocationError</code> الكائن <code>PositionError</code>.  
يُعيد هذا التابع الموقع الحالي للجهاز، ويمرّره إلى دالة رد النداء (callback) ‏<code>geolocationSuccess</code>، مع تمرير الكائن <code>Position</code> كمعامل. إذا كان هناك خطأ، فسيُمرّر الكائن <code>PositionError</code> إلى دالة رد النداء <code>geolocationError</code>.  
<syntaxhighlight lang="javascript">navigator.geolocation.getCurrentPosition(geolocationSuccess,
<syntaxhighlight lang="javascript">navigator.geolocation.getCurrentPosition(geolocationSuccess,
                                         [geolocationError],
                                         [geolocationError],
                                         [geolocationOptions]);‎</syntaxhighlight>  
                                         [geolocationOptions]);‎</syntaxhighlight>المعاملات المُمرَّرة إلى التابع هي:
===الوسائط===
* <code>geolocationSuccess</code>: دالة رد نداء (callback) التي سيُمرّر إليها الموقع الحالي.  
* '''geolocationSuccess''': دالة الاستجابة (callback) التي سيُمرّر إليها الموضع الحالي.  
* <code>geolocationError</code>: (اختياري) دالة رد النداء التي ستُنفَّذ في حالة حدوث خطأ.  
* '''geolocationError''': (اختياري) دالة الاستجابة التي ستُنفذ في حالة حدوث خطأ.  
* <code>geolocationOptions</code>: (اختياري) خيارات تحديد الموقع الجغرافي.  
* '''geolocationOptions''': (اختياري) خيارات تحديد الموقع الجغرافي.  
مثال عن استعمال التابع <code>getCurrentPosition</code>:<syntaxhighlight lang="javascript">   // onSuccess دالة رد النداء للحدث
=== مثال ===
     // والذي يحتوي Position يقبل هذا التابع الكائن
<syntaxhighlight lang="javascript">// onSuccess Callback
     // الحالية GPS إحداثيات
     // This method accepts a Position object, which contains the
     // current GPS coordinates
     //
     //
     var onSuccess = function(position) {
     var onSuccess = function(position) {
سطر 73: سطر 64:
               'Timestamp: '        + position.timestamp                + '\n');
               'Timestamp: '        + position.timestamp                + '\n');
     };
     };
     // onError Callback receives a PositionError object
     // PositionError الكائن onError تتلقى دالة الاستجابة للحدث
     //
     //
     function onError(error) {
     function onError(error) {
سطر 80: سطر 71:
     }
     }
     navigator.geolocation.getCurrentPosition(onSuccess, onError);‎</syntaxhighlight>  
     navigator.geolocation.getCurrentPosition(onSuccess, onError);‎</syntaxhighlight>  
== ملاحظات خاصة بمنصة iOS ==  
==== ملاحظات خاصة بمنصة iOS ====  


منذ الإصدار iOS 10، صار من الإلزامي تقديم وصف للاستخدام في الملف <code>info.plist</code> إن كنت تريد الوصول إلى بيانات حساسة. عندما يستأذن النظام المستخدم للوصول إلى تلك المعلومات، سيُعرض وصف الاستخدام ذاك كجزء من مربع حوار الاستئذان، ولكن إذا لم توفر وصف الاستخدام، فسيتعطل التطبيق قبل عرض مربع الحوار. وأيضًا، سترفض Apple التطبيقات التي تصل إلى البيانات الخاصة دون أن تقدم وصفًا للاستخدام.  
منذ الإصدار iOS 10، صار من الإلزامي تقديم وصف للاستخدام في الملف <code>info.plist</code> إن كنت تريد الوصول إلى البيانات الحساسة. عندما يستأذن النظام المستخدم للوصول إلى تلك المعلومات، سيُعرض وصف الاستخدام ذاك كجزء من مربع حوار الاستئذان، ولكن في حال عدم توفير وصف الاستخدام، فسيتعطل التطبيق قبل عرض مربع الحوار. كما سترفض Apple التطبيقات التي تحاول الوصول إلى البيانات الخاصة دون تقديم وصفٍ للاستخدام.  


تتطلب هذه الإضافات أوصاف الاستخدام التالية:  
تتطلب هذه الإضافة وصف الاستخدام التالي:  
* <code>NSLocationWhenInUseUsageDescription</code> تصف سبب وصول التطبيق إلى موقع المستخدم.  
* <code>NSLocationWhenInUseUsageDescription</code>: يحدد سبب سعي التطبيق للوصول إلى موقع المستخدم.  


لإضافة هذه المُدخلة إلى <code>info.plist</code>، يمكنك استخدام الوسم <code>edit-config</code> في الملف <code>config.xml</code> على النحو التالي:  
لإضافة هذه المُدخلة إلى <code>info.plist</code>، يمكنك استخدام الوسم <code>edit-config</code> في الملف <code>[[Cordova/config ref|config.xml]]</code> على النحو التالي:  
<syntaxhighlight lang="javascript"><edit-config target="NSLocationWhenInUseUsageDescription" file="*-Info.plist" mode="merge">
<syntaxhighlight lang="xml"><edit-config target="NSLocationWhenInUseUsageDescription" file="*-Info.plist" mode="merge">
     <string>need location access to find things nearby</string>
     <string>need location access to find things nearby</string>
</edit-config></syntaxhighlight>  
</edit-config>
===ملاحظات خاصة بمنصة أندرويد ===  
</syntaxhighlight>  
====ملاحظات خاصة بمنصة أندرويد ====  


إذا تم إيقاف تشغيل خدمة تحديد الموقع الجغرافي، فستُستدعى دالة الاستجابة <code>onError</code> بعد المدة الزمنية <code>timeout</code> (إذا تم تحديدها). في حال عدم تحديد المعامل <code>timeout</code>، فلن يتم استدعاء أي دالة استجابة.  
إذا تم إيقاف خدمة تحديد الموقع الجغرافي، فستُستدعَى دالة رد النداء <code>onError</code> بعد المدة الزمنية <code>timeout</code> (إذا تم تحديدها). وفي حال عدم تحديد المعامل <code>timeout</code>، فلن يتم استدعاء أي دالة رد نداء.  


==navigator.geolocation.watchPosition==  
===<code>navigator.geolocation.watchPosition</code>===  


يُعيد هذا التابع الموضع الحالي للجهاز عند رصد أي تغيير في الموضع. عندما يتغير موقع الجهاز، يتم تنفيذ دالة الاستجابة <code>geolocationSuccess</code> مع تمرير الكائن <code>Position</code> إليها كمعامل. إن حدث خطأ، يتم تنفيذ دالة الاستجابة <code>geolocationError</code> مع تمرير الكائن <code>PositionError</code> كمعامل.  
يُعيد هذا التابع الموضع الحالي للجهاز عند رصد أي تغيير في الموضع. عندما يتغير موقع الجهاز، يتم تنفيذ دالة رد النداء <code>geolocationSuccess</code> مع تمرير الكائن <code>Position</code> إليها كمعامل. إن حدث خطأ، فستُنفّذ دالة رد النداء <code>geolocationError</code> مع تمرير الكائن <code>PositionError</code> كمعامل.  
<syntaxhighlight lang="javascript">var watchId = navigator.geolocation.watchPosition(geolocationSuccess,
<syntaxhighlight lang="javascript">var watchId = navigator.geolocation.watchPosition(geolocationSuccess,
                                                   [geolocationError],
                                                   [geolocationError],
                                                   [geolocationOptions]);‎</syntaxhighlight>  
                                                   [geolocationOptions]);‎</syntaxhighlight>المعاملات المُمرَّرة إلى التابع هي:
===الوسائط===
* <code>geolocationSuccess</code>: دالة رد النداء التي سيُمرّر إليها الموقع الحالي.  
* '''geolocationSuccess''': دالة الاستجابة التي سيُمرّر إليها الموضع الحالي.  
* <code>geolocationError</code>: (اختياري) دالة رد النداء التي ستُنفَّذ عند حدوث خطأ.  
* '''geolocationError''': (اختياري) دالة الاستجابة التي ستُنفذ عند حدوث خطأ.  
* <code>geolocationOptions</code>: (اختياري) خيارات تحديد الموقع الجغرافي.  
* '''geolocationOptions''': (اختياري) خيارات تحديد الموقع الجغرافي.  
يعيد التابع سلسلة نصية تحتوي على معرفِ المراقبة (watch id)، الذي يحدِّد مجال مراقبة الموقع (watch position interval). يجب استخدام مٌعرّف المراقبة مع التابع <code>navigator.geolocation.clearWatch</code> لإيقاف مراقبة تغييرات الموقع الجغرافي.
=== القيمة المعادة ===
 
* '''String''': يعاد معرف المراقبة (watch id)، الذي يشير إلى لمجال مراقبة الموضع (watch position interval). يجب استخدام مٌعرّف المراقبة مع <code>navigator.geolocation.clearWatch</code> لإيقاف مراقبة التغييرات في الموضع.  
إليك المثال التالي:<syntaxhighlight lang="javascript">   // للنجاح onSuccess دالة رد النداء
=== مثال ===
     //الذي يحتوي على Position يقبل هذا التابع الكائن
<syntaxhighlight lang="javascript">// onSuccess Callback
     // الحالية GPS احداثيات
     //   This method accepts a `Position` object, which contains
     //   the current GPS coordinates
     //
     //
     function onSuccess(position) {
     function onSuccess(position) {
سطر 118: سطر 108:
                             '<hr />'      + element.innerHTML;
                             '<hr />'      + element.innerHTML;
     }
     }
     // onError Callback receives a PositionError object
     // PositionError الكائن onError تتلقى دالة رد النداء للخطأ
     //
     //
     function onError(error) {
     function onError(error) {
سطر 124: سطر 114:
               'message: ' + error.message + '\n');
               'message: ' + error.message + '\n');
     }
     }
     // Options: throw an error if no update is received every 30 seconds.
     // خيارات: إن لم يحدث أي تحديث خلال 30 ثانية، فسيُطلق خطأ
    //
     var watchID = navigator.geolocation.watchPosition(onSuccess, onError, { timeout: 30000 });‎</syntaxhighlight>
     var watchID = navigator.geolocation.watchPosition(onSuccess, onError, { timeout: 30000 });‎</syntaxhighlight>  
 
==geolocationOptions==


معاملات اختيارية تُستخدم لتخصيص عملية تحصيل معلومات الموقع الجغرافي <code>Position</code>.  
=== <code>geolocationOptions</code> ===
<syntaxhighlight lang="javascript">{ maximumAge: 3000, timeout: 5000, enableHighAccuracy: true };‎</syntaxhighlight>  
يستعمل المعامل <code>geolocationOptions</code> لتخصيص عملية تحصيل معلومات الموقع الجغرافي من الكائن <code>Position</code>.<syntaxhighlight lang="javascript">{ maximumAge: 3000, timeout: 5000, enableHighAccuracy: true };‎</syntaxhighlight>الخيارات التي يمكن استعمالها مع هذا المعامل هي:
===خيارات===
* <code>enableHighAccuracy</code>: قيمة منطقية تحدد إن كان تطبيقك يحتاج إلى الحصول على أدق النتائج الممكنة. بشكل افتراضي، يحاول الجهاز تحصيل معلومات الموقع الجغرافي (<code>Position</code>) باستخدام أساليب تستند إلى الشبكة. إنَّ ضبط هذه الخاصية إلى القيمة <code>true</code> سيُخطِر إطار العمل بضرورة استخدام أساليب أكثر دقة، مثل تحديد الموقع عبر الأقمار الصناعية.  
* '''enableHighAccuracy''': يلمح إلى أنّ التطبيق يحتاج إلى الحصول على أدق النتائج الممكنة. بشكل افتراضي، يحاول الجهاز تحصيل <code>Position</code> باستخدام أساليب تستند إلى الشبكة. إن ضبط هذه الخاصية عند القيمة <code>true</code> يخبر إطار العمل بضرورة استخدام أساليب أكثر دقة، مثل تحديد الموقع عبر الأقمار الصناعية. (قيمة منطقية)
* <code>timeout</code>: عدد يحدِّد الفترة الزمنية القصوى (بالميلي ثانية) المسموح بمرورها منذ لحظة استدعاء التابع <code>navigator.geolocation.getCurrentPosition</code> أو <code>geolocation.watchPosition</code> وحتى تنفيذ دالة رد النداء <code>geolocationSuccess</code> المقابلة. إذا لم يتم استدعاء دالة رد النداء <code>geolocationSuccess</code> خلال هذا الوقت، فسيُمرّر إلى دالة الخطأ <code>geolocationError</code> رمز الخطأ <code>PositionError.TIMEOUT</code>. (لاحظ أنّه عند استخدامها مع التابع <code>geolocation.watchPosition</code>، يمكن استدعاء دالة الخطأ <code>geolocationError</code> بشكل متكررٍ كل <code>timeout</code> ميلي ثانية).
* '''timeout''': االفترة الزمنية القصوى (بالميليثانية) المسموح به بمرورها منذ استدعاء <code>navigator.geolocation.getCurrentPosition</code> أو <code>geolocation.watchPosition</code> وحتى تنفيذ دالة الاستجابة المقابلة <code>geolocationSuccess</code>. إذا لم يتم استدعاء دالة الاستجابة <code>geolocationSuccess</code> خلال هذا الوقت، فسيُمرّر إلى دالة الاستجابة <code>geolocationError</code> كود الخطأ <code>PositionError.TIMEOUT</code>. (لاحظ أنه عند استخدامها مع <code>geolocation.watchPosition</code>، يمكن استدعاء دالة الاستجابة <code>geolocationError</code> على فواصل زمنية كل <code>timeout</code> ميليثانية) (عدد)  
* <code>maximumAge</code>: عدد يحدد أقصى عمر (الوقت بالميلي ثانية) للموقع المخزَّن مؤقتًا (cached position) ليتم قبوله.  
* '''maximumAge''': يقبل موضع مخزنا مؤقتًا (cached position)، والذي لا يزيد عمره عن الوقت المحدد بالميليثانية. (عدد)
====ملاحظات خاصة بمنصة أندرويد ====  
===ملاحظات خاصة بمنصة أندرويد ===  


في حال إيقاف خدمة تحديد الموقع الجغرافي، فستُستدعى دالة الاستجابة <code>onError</code> بعد الفاصل الزمني <code>timeout</code> (في حال تحديده). إذا لم يتم تحديد المعامل <code>timeout</code>، فلن يتم استدعاء أي دالة استجابة.  
في حال إيقاف خدمة تحديد الموقع الجغرافي، فستُستدعى دالة رد النداء <code>onError</code> بعد الفاصل الزمني <code>timeout</code> في حال تحديده. أما في حال عدم تحديده، فلن يتم استدعاء أي دالة رد نداء.  


==navigator.geolocation.clearWatch==  
===<code>navigator.geolocation.clearWatch</code>===  


يوقف هذا التابع عملية مراقبة التغييرات في موقع الجهاز، والمشار إليه من قبل المعامل <code>watchID</code>.  
يوقف هذا التابع عملية مراقبة التغييرات في موقع الجهاز، والمشار إليها من قبل المعامل <code>watchID</code>.  
<syntaxhighlight lang="javascript">navigator.geolocation.clearWatch(watchID);‎</syntaxhighlight>  
<syntaxhighlight lang="javascript">navigator.geolocation.clearWatch(watchID);‎</syntaxhighlight>المعامل المُمرَّر إلى التابع هو:
===المعاملات===
* <code>watchID</code>: سلسلة نصية تُمثِّل مُعرِّف المجال <code>watchPosition</code> المُراد حذفه.  
* '''watchID''': مُعرِّف الفاصل الزمني للتابع <code>watchPosition</code> الذي يُراد حذفه. (سلسلة نصية)
إليك المثال التالي:<syntaxhighlight lang="javascript">   // خيارات: مراقبة التغيرات في الموقع الجغرافي، مع  الموقع
=== مثال ===
     // استخدام أدق وسائل تحديد الموقع المُمكنة
<syntaxhighlight lang="javascript">// Options: watch for changes in position, and use the most
     // accurate position acquisition method available.
     //
     //
     var watchID = navigator.geolocation.watchPosition(onSuccess, onError, { enableHighAccuracy: true });
     var watchID = navigator.geolocation.watchPosition(onSuccess, onError, { enableHighAccuracy: true });
     // ...later on...
     // ...في وقت لاحق...
     navigator.geolocation.clearWatch(watchID);‎</syntaxhighlight>  
     navigator.geolocation.clearWatch(watchID);‎</syntaxhighlight>


==Position==  
== كائنات (للقراءة فقط) ==


يحتوي هذا الكائن على إحداثيات <code>Position</code> وطابعه الزمني، يتم أنشاؤه من قبل الواجهة البرمجية للإضافة.
===<code>Position</code>===  
=== خاصيات ===
* '''coords''': مجموعة من الإحداثيات الجغرافية. (احداثيات)
* '''timestamp''': الطابع الزمني للإنشاء الخاص بالكائن <code>coords</code>. (DOMTimeStamp)


==Coordinates==
يحتوي الكائن <code>Position</code>  على إحداثيات الموقع الجغرافي مع بصمة زمنية (timestamp)؛ يتم انشاؤه من قبل الواجهة البرمجية للإضافة.


تُربط الكائنات <code>Coordinates</code> بكائن <code>Position</code> متوفرٍ لدوال الاستجابة الخاصة بطلبيات الموضع الحالي. يحتوي على مجموعة من الخاصيات التي تصف الإحداثيات الجغرافية للموضع.  
خاصيات هذا الكائن هي:
=== خاصيات ===
* <code>coords</code>: مجموعة من الإحداثيات الجغرافية.
* '''latitude''': خط العرض بالدرجات العشرية. (عدد)
* <code>timestamp</code>: البصمة الزمنية التي تحدد وقت تسجيل الإحداثيات <code>coords</code>.  
* '''longitude''': خط الطول بالدرجات العشرية. (عدد)
* '''altitude''': ارتفاع الموقع بالأمتار فوق الإهليليج (ellipsoid). (عدد)
* '''accuracy''': مستوى الدقة لإحداثيات الطول والعرض بالأمتار. (عدد)
* '''altitudeAccuracy''': مستوى دقة إحداثيات الإرتفاع بالأمتار. (عدد)
* '''heading''': اتجاه السفر، محدد بعدد الدرجات في اتجاه عقارب الساعة نسبةً إلى الشمال الحقيقي. (عدد)
* '''speed''': السرعة الأرضية الحالية للجهاز، تُحدد بعدد الأمتار المقطوعة في الثانية. (عدد)
===ملاحظات خاصة بمنصة أندرويد ===


'''altitudeAccuracy''': غير مدعومة في أجهزة أندرويد، تعيد <code>null</code>.
===<code>Coordinates</code>===


==PositionError==
يُربَطُ الكائنُ <code>Coordinates</code> بكائنٍ <code>Position</code>، والذي يتم توفيره لدوال رد النداء (callback functions) الخاصة بطلبيات (requests) الموقع الحالي. يحتوي هذا الكائن على مجموعة من الخاصيات التي تحدد الإحداثيات الجغرافية لموقعٍ ما.


يُمرّر الكائن <code>PositionError</code> إلى دالة الاستجابة <code>geolocationError</code> عند حدوث خطأ في navigator.geolocation.
خاصيات هذا الكائن هي:
=== خاصيات ===
* <code>latitude</code>: عدد يحدد خط العرض بالدرجات العشرية. 
* '''code''': أحد رموز الخطأ المحددة مسبقًا المدرجة أدناه.  
* <code>longitude</code>: عدد يحدد خط الطول بالدرجات العشرية.  
* '''message''': رسالة خطأ تصف تفاصيل الخطأ الذي وقع.
* <code>altitude</code>: عدد يمثِّل ارتفاع الموقع بالأمتار فوق الإهليليج (ellipsoid).
===ثوابت===
* <code>accuracy</code>: عدد يمثِّل مستوى الدقة لإحداثيات الطول والعرض بالأمتار.  
*<code>PositionError.PERMISSION_DENIED</code>  
* <code>altitudeAccuracy</code>: عدد يحدد مستوى دقة إحداثيات الإرتفاع بالأمتار.
* تُعاد هذه الثابتة عندما يرفض المستخدمون السماح للتطبيق بالوصول إلى معلومات الموقع الجغرافي. يعتمد هذا على المنصة المُستخدمة.  
* <code>heading</code>: عدد يمثِّل اتجاه السفر، يُحدّد بعدد الدرجات في اتجاه عقارب الساعة نسبةً إلى الشمال الحقيقي.  
*<code>PositionError.POSITION_UNAVAILABLE</code>  
* <code>speed</code>: عدد يحدِّد السرعة الأرضية الحالية للجهاز، تُحدد بعدد الأمتار المقطوعة في الثانية.  
* تُعاد عندما يعجز الجهاز عن الحصول على الموقع الجغرافي. بشكل عام، هذا يعني أنّ الجهاز ليس متصلًا بأي بشبكة، أو لا يمكنه الوصول إلى القمر الصناعي.  
====ملاحظات خاصة بمنصة أندرويد ====
*<code>PositionError.TIMEOUT</code>  
* تُعاد عندما يتعذر على الجهاز الحصول الموقع الجغرافي خلال الوقت المحدد بواسطة <code>timeout</code> المتضمَّن في <code>geolocationOptions</code>. عند استخدامها مع التابع <code>navigator.geolocation.watchPosition</code>، يمكن تمرير هذا الخطأ مراراً وتكراراً إلى دالة الاستجابة <code>geolocationError</code> كل <code>timeout</code> ميليثانية.  


== عينة: الحصول على الطقس، والعثور على المتاجر، ومشاهدة الصور للأشياء القريبة مع تحديد الموقع الجغرافي ==
الخاصية <code>altitudeAccuracy</code> غير مدعومة في أجهزة أندرويد، لذا ستحوي القيمة <code>null</code>.


يمكن أن استخدام هذه الإضافة لمساعدة المستخدمين على العثور على المواقع أو الأحداث القريبة منهم، مثل عروض Grouponأ والمنازل المعروضة للبيعأ والأفلام المعروضة حاليًا، والأحداث الرياضية والترفيهية وغير ذلك.
===<code>PositionError</code>===


إليك مجموعة من الأفكار لتبدأ بها. في الشيفرات البرمجية أدناه، سنريك بعض الطرق السهلة لإضافة هذه الميزات إلى تطبيقك.
يُمرّر الكائن <code>PositionError</code> إلى دالة رد النداء <code>geolocationError</code> عند حدوث خطأ في الكائن <code>navigator.geolocation</code>.  
*[#coords Get your coordinates].
*[#weather Get the weather forecast].
*[#receive Receive updated weather forecasts as you drive around].
*[#see See where you are on a map].
*[#find Find stores near you].  
*[#see See pictures of things around you].  


== الحصول على إحداثيات موقعك الجغرافي ==  
خاصيات هذا الكائن هي:
* <code>code</code>: أحد رموز الخطأ المحددة مسبقًا، والمدرجة أدناه.
* <code>message</code>: رسالة خطأ تحتوي تفاصيل الخطأ الذي وقع.
ثوابت هذا الكائن هي:
*<code>PositionError.PERMISSION_DENIED</code>: يعاد هذا الثابت عندما يرفض المستخدمون السماح للتطبيق بالوصول إلى معلومات الموقع الجغرافي. يتعلق هذا الثابت بالمنصة المُستخدمة.
*<code>PositionError.POSITION_UNAVAILABLE</code>: يعاد عندما يعجز الجهاز عن الحصول على الموقع الجغرافي. بشكل عام، هذا يعني أنّ الجهاز ليس متصلًا بأي بشبكة، أو لا يمكنه الوصول إلى القمر الصناعي.
*<code>PositionError.TIMEOUT</code>: يعاد عندما يتعذر على الجهاز الحصول على الموقع الجغرافي خلال الوقت المحدد بواسطة المعامل <code>timeout</code> المتضمَّن في الخيارات <code>geolocationOptions</code>. عند استخدامها مع التابع <code>navigator.geolocation.watchPosition</code>، يمكن تمرير هذا الخطأ مرارًا وتكرارًا إلى دالة رد النداء <code>geolocationError</code> كل <code>timeout</code> ميلي ثانية.
 
== أمثلة عملية ==
 
يمكن استخدام هذه الإضافة لمساعدة المستخدمين على العثور على المواقع أو الأحداث القريبة منهم، مثل عروض Groupon، والمنازل المعروضة للبيع، والأفلام المعروضة حاليًا، والأحداث الرياضية والترفيهية وغير ذلك.
 
تحتوي هذه الفقرة على مجموعة من الأفكار التي توضح كيفية استغلال هذه الإضافة. في الشيفرات البرمجية أدناه، ستتعلم بعض الطرق السهلة لإضافة الميزات التالية إلى تطبيقك.
*الحصول على إحداثيات موقعك
*الحصول على توقعات الطقس
*تلقي تحديثات توقعات الطقس أثناء القيادة
*التعرف على موقعك على الخريطة
*البحث عن متجر قريب
*مطالعة صور عن المنطقة المحيطة بك
 
=== الحصول على إحداثيات موقعك الجغرافي ===  
<syntaxhighlight lang="javascript">function getWeatherLocation() {
<syntaxhighlight lang="javascript">function getWeatherLocation() {
     navigator.geolocation.getCurrentPosition
     navigator.geolocation.getCurrentPosition
سطر 208: سطر 194:
}‎</syntaxhighlight>  
}‎</syntaxhighlight>  


== الحصول على توقعات الطقس ==  
=== الحصول على توقعات الطقس ===  
<syntaxhighlight lang="javascript">// Success callback for get geo coordinates
<syntaxhighlight lang="javascript">// دالة النجاح التي ستُمرر إليها الإحداثيات الجغرافية
var onWeatherSuccess = function (position) {
var onWeatherSuccess = function (position) {
     Latitude = position.coords.latitude;
     Latitude = position.coords.latitude;
سطر 215: سطر 201:
     getWeather(Latitude, Longitude);
     getWeather(Latitude, Longitude);
}
}
// Get weather by using coordinates
// الحصول على معلومات الطقس انطلاقا من معلومات الموقع الجغرافي
function getWeather(latitude, longitude) {
function getWeather(latitude, longitude) {
    // Get a free key at http://openweathermap.org/. Replace the "Your_Key_Here" string with that key.
  // http://openweathermap.org/ الحصول على مفتاح من الموقع
  // بالمفتاح الذي حصلت عليه "Your_Key_Here" استبدل السلسلة النصية
     var OpenWeatherAppKey = "Your_Key_Here";
     var OpenWeatherAppKey = "Your_Key_Here";
     var queryString =
     var queryString =
سطر 242: سطر 229:
     });
     });
}
}
// Error callback
// دالة رد النداء للخطأ
function onWeatherError(error) {
function onWeatherError(error) {
     console.log('code: ' + error.code + '\n' +
     console.log('code: ' + error.code + '\n' +
سطر 248: سطر 235:
}‎</syntaxhighlight>  
}‎</syntaxhighlight>  


== تلقي تحديثات توقعات الطقس أثناء القيادة ==  
=== تلقي تحديثات توقعات الطقس أثناء القيادة ===  
<syntaxhighlight lang="javascript">// Watch your changing position
<syntaxhighlight lang="javascript">// مراقبة التغيرات في الموقع
function watchWeatherPosition() {
function watchWeatherPosition() {
     return navigator.geolocation.watchPosition
     return navigator.geolocation.watchPosition
     (onWeatherWatchSuccess, onWeatherError, { enableHighAccuracy: true });
     (onWeatherWatchSuccess, onWeatherError, { enableHighAccuracy: true });
}
}
// Success callback for watching your changing position
// دالة رد النداء للنجاح الخاصة بمراقبة تغيرات موقعك
var onWeatherWatchSuccess = function (position) {
var onWeatherWatchSuccess = function (position) {
     var updatedLatitude = position.coords.latitude;
     var updatedLatitude = position.coords.latitude;
سطر 261: سطر 248:
         Latitude = updatedLatitude;
         Latitude = updatedLatitude;
         Longitude = updatedLongitude;
         Longitude = updatedLongitude;
         // Calls function we defined earlier.
         // استدعاء الدوال التي عرّفناها سابقًا
         getWeather(updatedLatitude, updatedLongitude);
         getWeather(updatedLatitude, updatedLongitude);
     }
     }
}‎</syntaxhighlight>  
}‎</syntaxhighlight>  


== التعرف على موقعك على الخريطة ==  
=== التعرف على موقعك على الخريطة ===  


يُوفر كلٌّ من Bing و Google خدمات الخرائط. سنستخدم جوجل. ستحتاج إلى مفتاح، وهو مجاني إن كنت تحاول تجربة الخدمة.  
يُوفر كلٌ من الموقعين Bing و Google خدمات الخرائط. سنستخدم في هذا المثال Google.


قم بإضافة مرجع إلى الخدمة '''maps'''.  
ستحتاج إلى مفتاحِ لاستخدام خرائط Google، والذي يمكنك الحصول عليه مجانًا إن كنت تريد تجربة الخدمة.
 
قم بإضافة مرجع إلى الخدمة <code>maps</code>.  
<syntaxhighlight lang="javascript"><script src="https://maps.googleapis.com/maps/api/js?key=Your_API_Key"></script>‎</syntaxhighlight>  
<syntaxhighlight lang="javascript"><script src="https://maps.googleapis.com/maps/api/js?key=Your_API_Key"></script>‎</syntaxhighlight>  


ثم أضف الشيفرة التالية لاستخدامها.  
ثم أضف الشيفرة التالية لاستخدام الخدمة.  
<syntaxhighlight lang="javascript">var Latitude = undefined;
<syntaxhighlight lang="javascript">var Latitude = undefined;
var Longitude = undefined;
var Longitude = undefined;
// Get geo coordinates
// الحصول على الإحداثيات الجغرافية
function getMapLocation() {
function getMapLocation() {
     navigator.geolocation.getCurrentPosition
     navigator.geolocation.getCurrentPosition
     (onMapSuccess, onMapError, { enableHighAccuracy: true });
     (onMapSuccess, onMapError, { enableHighAccuracy: true });
}
}
// Success callback for get geo coordinates
// دالة النجاح التي تستجيب لإحداثيات الموقع الجغرافي
var onMapSuccess = function (position) {
var onMapSuccess = function (position) {
     Latitude = position.coords.latitude;
     Latitude = position.coords.latitude;
سطر 287: سطر 276:
     getMap(Latitude, Longitude);
     getMap(Latitude, Longitude);
}
}
// Get map by using coordinates
// الحصول على الخريطة انطلاقًا من الموقع الجغرافي
function getMap(latitude, longitude) {
function getMap(latitude, longitude) {
     var mapOptions = {
     var mapOptions = {
سطر 304: سطر 293:
     map.setCenter(marker.getPosition());
     map.setCenter(marker.getPosition());
}
}
// Success callback for watching your changing position
// دالة النجاح التي تستجيب للتغيرات في الموقع الجغرافي
var onMapWatchSuccess = function (position) {
var onMapWatchSuccess = function (position) {
     var updatedLatitude = position.coords.latitude;
     var updatedLatitude = position.coords.latitude;
سطر 314: سطر 303:
     }
     }
}
}
// Error callback
// دالة الاستجابة للخطأ
function onMapError(error) {
function onMapError(error) {
     console.log('code: ' + error.code + '\n' +
     console.log('code: ' + error.code + '\n' +
         'message: ' + error.message + '\n');
         'message: ' + error.message + '\n');
}
}
// Watch your changing position
// مراقبة التغيرات في موقعك الجغرافي
function watchMapPosition() {
function watchMapPosition() {
     return navigator.geolocation.watchPosition
     return navigator.geolocation.watchPosition
سطر 325: سطر 314:
}‎</syntaxhighlight>  
}‎</syntaxhighlight>  


== البحث عن متجر قريب ==  
=== البحث عن متجر قريب ===  


يمكنك استخدام نفس مفتاح جوجل لأجل هذا.  
يمكنك استخدام نفس مفتاح جوجل في هذا المثال.  


أضف مرجعًا إلى الخدمة '''places'''.  
أضف مرجعًا إلى الخدمة <code>places</code>.  
<syntaxhighlight lang="javascript"><script src=
<syntaxhighlight lang="javascript"><script src=
"https://maps.googleapis.com/maps/api/js?key=Your_API_Key&libraries=places">
"https://maps.googleapis.com/maps/api/js?key=Your_API_Key&libraries=places">
</script>‎</syntaxhighlight>  
</script>‎</syntaxhighlight>  


ثم أضف الشيفرة التالية لاستخدامها.  
ثم أضف الشيفرة التالية لاستخدام هذه الخدمة.  
<syntaxhighlight lang="javascript">var Map;
<syntaxhighlight lang="javascript">var Map;
var Infowindow;
var Infowindow;
var Latitude = undefined;
var Latitude = undefined;
var Longitude = undefined;
var Longitude = undefined;
// Get geo coordinates
// الحصول على الإحداثيات الجغرافية
function getPlacesLocation() {
function getPlacesLocation() {
     navigator.geolocation.getCurrentPosition
     navigator.geolocation.getCurrentPosition
     (onPlacesSuccess, onPlacesError, { enableHighAccuracy: true });
     (onPlacesSuccess, onPlacesError, { enableHighAccuracy: true });
}
}
// Success callback for get geo coordinates
// دالة النجاح للاستجابة لإحداثيات الموقع الجغرافي
var onPlacesSuccess = function (position) {
var onPlacesSuccess = function (position) {
     Latitude = position.coords.latitude;
     Latitude = position.coords.latitude;
سطر 350: سطر 339:
     getPlaces(Latitude, Longitude);
     getPlaces(Latitude, Longitude);
}
}
// Get places by using coordinates
// التعرف على الأمكنة انطلاقا من احداثيات الموقع الجغرافي
function getPlaces(latitude, longitude) {
function getPlaces(latitude, longitude) {
     var latLong = new google.maps.LatLng(latitude, longitude);
     var latLong = new google.maps.LatLng(latitude, longitude);
سطر 367: سطر 356:
     }, foundStoresCallback);
     }, foundStoresCallback);
}
}
// Success callback for watching your changing position
// دالة النجاح للاستجابة للتغيرات في الموقع الجغرافي
var onPlacesWatchSuccess = function (position) {
var onPlacesWatchSuccess = function (position) {
     var updatedLatitude = position.coords.latitude;
     var updatedLatitude = position.coords.latitude;
سطر 377: سطر 366:
     }
     }
}
}
// Success callback for locating stores in the area
// دالة النجاح للاستجابة للعثور على متجر قريب
function foundStoresCallback(results, status) {
function foundStoresCallback(results, status) {
     if (status === google.maps.places.PlacesServiceStatus.OK) {
     if (status === google.maps.places.PlacesServiceStatus.OK) {
سطر 385: سطر 374:
     }
     }
}
}
// Place a pin for each store on the map
// على كل متجر عثرت عليه في الخريطة pin وضع علامة
function createMarker(place) {
function createMarker(place) {
     var placeLoc = place.geometry.location;
     var placeLoc = place.geometry.location;
سطر 397: سطر 386:
     });
     });
}
}
// Error callback
// دالة الخطأ
function onPlacesError(error) {
function onPlacesError(error) {
     console.log('code: ' + error.code + '\n' +
     console.log('code: ' + error.code + '\n' +
         'message: ' + error.message + '\n');
         'message: ' + error.message + '\n');
}
}
// Watch your changing position
// مراقبة التغير في موقعك الجغرافي
function watchPlacesPosition() {
function watchPlacesPosition() {
     return navigator.geolocation.watchPosition
     return navigator.geolocation.watchPosition
سطر 408: سطر 397:
}‎</syntaxhighlight>  
}‎</syntaxhighlight>  


== مطالعة صور الأشياء المحيطة بك ==  
=== مطالعة صور عن المنطقة المحيطة بك ===  


يمكن أن تحتوي الصور الرقمية على إحداثيات جغرافية تحدد مكان التقاط الصورة.  
يمكن أن تُرفق الصور الرقمية مع الإحداثيات الجغرافية للمكان الذي التُقطت فيه.  


استخدم الواجهة البرمجية لموقع Flickr للعثور على الصور التي التُقِطت بالقرب من مكان تواجدك. مثل خدمات جوجل، ستحتاج إلى مفتاح، ولكنه مجاني إن كنت ترغب في التجربة وحسب.  
استخدم الواجهة البرمجية لموقع Flickr للعثور على الصور التي التُقِطت بالقرب من مكان تواجدك. ومثل خدمات جوجل، ستحتاج إلى مفتاح، ولكنه مجاني إن كنت ترغب في التجربة فحسب.  
<syntaxhighlight lang="javascript">var Latitude = undefined;
<syntaxhighlight lang="javascript">var Latitude = undefined;
var Longitude = undefined;
var Longitude = undefined;
// Get geo coordinates
// الحصول على الاحداثيات الجغرافية
function getPicturesLocation() {
function getPicturesLocation() {
     navigator.geolocation.getCurrentPosition
     navigator.geolocation.getCurrentPosition
     (onPicturesSuccess, onPicturesError, { enableHighAccuracy: true });
     (onPicturesSuccess, onPicturesError, { enableHighAccuracy: true });
}
}
// Success callback for get geo coordinates
// دالة النجاح للاستجابة لاحداثيات الموقع الجغرافي
var onPicturesSuccess = function (position) {
var onPicturesSuccess = function (position) {
     Latitude = position.coords.latitude;
     Latitude = position.coords.latitude;
سطر 426: سطر 415:
     getPictures(Latitude, Longitude);
     getPictures(Latitude, Longitude);
}
}
// Get pictures by using coordinates
// الحصول على الصور باستخدام احداثيات الموقع الجغرافي
function getPictures(latitude, longitude) {
function getPictures(latitude, longitude) {
     $('#pictures').empty();
     $('#pictures').empty();
سطر 441: سطر 430:
     );
     );
}
}
// Success callback for watching your changing position
// دالة النجاح للاستجابة للتغيرات في موقعك الجغرافي
var onPicturesWatchSuccess = function (position) {
var onPicturesWatchSuccess = function (position) {
     var updatedLatitude = position.coords.latitude;
     var updatedLatitude = position.coords.latitude;
سطر 451: سطر 440:
     }
     }
}
}
// Error callback
// دالة الخطأ
function onPicturesError(error) {
function onPicturesError(error) {
     console.log('code: ' + error.code + '\n' +
     console.log('code: ' + error.code + '\n' +
         'message: ' + error.message + '\n');
         'message: ' + error.message + '\n');
}
}
// Watch your changing position
// مراقبة التغيرات في موقعك الجغرافي
function watchPicturePosition() {
function watchPicturePosition() {
     return navigator.geolocation.watchPosition
     return navigator.geolocation.watchPosition
     (onPicturesWatchSuccess, onPicturesError, { enableHighAccuracy: true });
     (onPicturesWatchSuccess, onPicturesError, { enableHighAccuracy: true });
}‎</syntaxhighlight>
}‎</syntaxhighlight>
== انظر أيضًا ==
* إضافة [[Cordova/cordova plugin camera|الكاميرا]]
* إضافة [[Cordova/cordova plugin dialogs|مربعات الحوار]]
* إضافة [[Cordova/cordova plugin network information|حالة الشبكة]]
* [[Cordova/plugins|دليل تطوير الإضافات في كوردوفا]]
==مصادر==
==مصادر==
*[https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-geolocation/index.html صفحة cordova-plugin-geolocation في توثيق كوردوفا الرسمي.]
*[https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-geolocation/index.html صفحة cordova-plugin-geolocation في توثيق كوردوفا الرسمي.]

المراجعة الحالية بتاريخ 18:09، 3 ديسمبر 2020

توفر هذه الإضافة معلومات حول الموقع الجغرافي للجهاز، مثل خط العرض وخط الطول.

هناك عدة طرقٍ لتحديد معلومات الموقع الجغرافي منها:

  • نظام تحديد المواقع العالمي (GPS)، و
  • استنتاج الموقع من إشارات الشبكة، مثل عنوان IP، وعناوين تحديد الهوية بموجات الراديو (RFID)، و
  • اللاسلكي (WiFi)، و
  • عناوين Bluetooth الفيزيائية (MAC)، و
  • مُعرِّفات الشبكة GSM/CDMA.

ليس هناك ما يضمن أن تعيد الواجهةُ البرمجية الموقعَ الفعلي للجهاز. لمعرفة كيفية استخدام هذه الإضافة، اطلع على الأمثلة التوضيحية في نهاية هذه الصفحة.

تأسست الواجهة البرمجية لهذه الإضافة على مواصفات الواجهة البرمجية لتحديد المواقع الجغرافية (W3C) ، ولا تُنفّذ إلا على الأجهزة التي لا توفر تنفيذًا (implementation) جاهزًا لها مسبقًا.

تنبيه: جمع واستخدام بيانات تحديد الموقع الجغرافي تثير مخاوف بخصوص قضايا الخصوصية. يجب أن تُوضّح سياسةُ الخصوصية في تطبيقك كيفية استخدام التطبيق لبيانات تحديد الموقع الجغرافي، وما إن كانت ستُتَشارك مع أي أطراف أخرى، ومستوى دقة البيانات (مثل هل المعلومات ستكون تقريبية، أم دقيقة، أم تستهدف الرمز البريدي ZIP، وغير ذلك). عمومًا، تعتبر بيانات تحديد الموقع الجغرافي حسَّاسة، لأنها قد تُستخدم لمعرفة مكان المستخدم، وفي حال تخزينها، فستكشف تاريخ حركاته وسكناته. لذلك، فبالإضافة إلى سياسة خصوصية التطبيق، سيكون من الجيد تقديم إشعار فوري قبل محاولة تطبيقك الوصول إلى بيانات الموقع الجغرافي (إن لم يكن نظام التشغيل يفعل ذلك سلفًا). ينبغي أن يوفر هذا الإشعار نفس المعلومات المذكورة أعلاه، إضافةً إلى استئذان المُستخدم (على سبيل المثال، عبر تقديم خيارات من قبيل "حسنًا" و "لا شكرًا"). لمزيد من المعلومات، يرجى الاطلاع على دليل الخصوصية.

تعرِّف هذه الإضافة كائنًا عامًّا هو navigator.geolocation (في المنصات التي لا يكون مُعرّفا فيها).

على الرغم من أنّ هذا الكائن موجود في النطاق العام (global scope)، إلا أنّ الميزات التي يوفرها لن تكون متاحة إلا بعد إطلاق الحدث deviceready.

document.addEventListener("deviceready", onDeviceReady, false);
    function onDeviceReady() {
        console.log("navigator.geolocation works well");
    }

التثبيت

تتطلب إضافة تحديد الموقع الجغرافي الإصدارَ كوردوفا 5.0 أوما بعده (الإصدار المستقر الحالي 1.0.0). لتثبيتها، نفذ الأمر التالي:

cordova plugin add cordova-plugin-geolocation‎

لا يزال بإمكان الإصدارات القديمة من كوردوفا تثبيت هذه الإضافة عبر المُعرِّف المهمل (الإصدار المستقر 0.3.12) بالشكل التالي:

cordova plugin add org.apache.cordova.geolocation‎

من الممكن أيضًا تثبيت هذه الإضافة عبر عنوان مستودع git مباشرة (إلا أنه غير مستقر):

cordova plugin add https://github.com/apache/cordova-plugin-geolocation.git‎

المنصات المدعومة

  • أندرويد
  • iOS
  • ويندوز

التوابع

navigator.geolocation.getCurrentPosition

يُعيد هذا التابع الموقع الحالي للجهاز، ويمرّره إلى دالة رد النداء (callback) ‏geolocationSuccess، مع تمرير الكائن Position كمعامل. إذا كان هناك خطأ، فسيُمرّر الكائن PositionError إلى دالة رد النداء geolocationError.

navigator.geolocation.getCurrentPosition(geolocationSuccess,
                                         [geolocationError],
                                         [geolocationOptions]);

المعاملات المُمرَّرة إلى التابع هي:

  • geolocationSuccess: دالة رد نداء (callback) التي سيُمرّر إليها الموقع الحالي.
  • geolocationError: (اختياري) دالة رد النداء التي ستُنفَّذ في حالة حدوث خطأ.
  • geolocationOptions: (اختياري) خيارات تحديد الموقع الجغرافي.

مثال عن استعمال التابع getCurrentPosition:

    // onSuccess دالة رد النداء للحدث
    // والذي يحتوي Position  يقبل هذا التابع الكائن
    // الحالية GPS  إحداثيات
    //
    var onSuccess = function(position) {
        alert('Latitude: '          + position.coords.latitude          + '\n' +
              'Longitude: '         + position.coords.longitude         + '\n' +
              'Altitude: '          + position.coords.altitude          + '\n' +
              'Accuracy: '          + position.coords.accuracy          + '\n' +
              'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + '\n' +
              'Heading: '           + position.coords.heading           + '\n' +
              'Speed: '             + position.coords.speed             + '\n' +
              'Timestamp: '         + position.timestamp                + '\n');
    };
    // PositionError الكائن onError تتلقى دالة الاستجابة للحدث 
    //
    function onError(error) {
        alert('code: '    + error.code    + '\n' +
              'message: ' + error.message + '\n');
    }
    navigator.geolocation.getCurrentPosition(onSuccess, onError);

ملاحظات خاصة بمنصة iOS

منذ الإصدار iOS 10، صار من الإلزامي تقديم وصف للاستخدام في الملف info.plist إن كنت تريد الوصول إلى البيانات الحساسة. عندما يستأذن النظام المستخدم للوصول إلى تلك المعلومات، سيُعرض وصف الاستخدام ذاك كجزء من مربع حوار الاستئذان، ولكن في حال عدم توفير وصف الاستخدام، فسيتعطل التطبيق قبل عرض مربع الحوار. كما سترفض Apple التطبيقات التي تحاول الوصول إلى البيانات الخاصة دون تقديم وصفٍ للاستخدام.

تتطلب هذه الإضافة وصف الاستخدام التالي:

  • NSLocationWhenInUseUsageDescription: يحدد سبب سعي التطبيق للوصول إلى موقع المستخدم.

لإضافة هذه المُدخلة إلى info.plist، يمكنك استخدام الوسم edit-config في الملف config.xml على النحو التالي:

<edit-config target="NSLocationWhenInUseUsageDescription" file="*-Info.plist" mode="merge">
    <string>need location access to find things nearby</string>
</edit-config>

ملاحظات خاصة بمنصة أندرويد

إذا تم إيقاف خدمة تحديد الموقع الجغرافي، فستُستدعَى دالة رد النداء onError بعد المدة الزمنية timeout (إذا تم تحديدها). وفي حال عدم تحديد المعامل timeout، فلن يتم استدعاء أي دالة رد نداء.

navigator.geolocation.watchPosition

يُعيد هذا التابع الموضع الحالي للجهاز عند رصد أي تغيير في الموضع. عندما يتغير موقع الجهاز، يتم تنفيذ دالة رد النداء geolocationSuccess مع تمرير الكائن Position إليها كمعامل. إن حدث خطأ، فستُنفّذ دالة رد النداء geolocationError مع تمرير الكائن PositionError كمعامل.

var watchId = navigator.geolocation.watchPosition(geolocationSuccess,
                                                  [geolocationError],
                                                  [geolocationOptions]);

المعاملات المُمرَّرة إلى التابع هي:

  • geolocationSuccess: دالة رد النداء التي سيُمرّر إليها الموقع الحالي.
  • geolocationError: (اختياري) دالة رد النداء التي ستُنفَّذ عند حدوث خطأ.
  • geolocationOptions: (اختياري) خيارات تحديد الموقع الجغرافي.

يعيد التابع سلسلة نصية تحتوي على معرفِ المراقبة (watch id)، الذي يحدِّد مجال مراقبة الموقع (watch position interval). يجب استخدام مٌعرّف المراقبة مع التابع navigator.geolocation.clearWatch لإيقاف مراقبة تغييرات الموقع الجغرافي.

إليك المثال التالي:

    // للنجاح onSuccess دالة رد النداء
    //الذي يحتوي على Position يقبل هذا التابع الكائن 
    // الحالية GPS احداثيات 
    //
    function onSuccess(position) {
        var element = document.getElementById('geolocation');
        element.innerHTML = 'Latitude: '  + position.coords.latitude      + '<br />' +
                            'Longitude: ' + position.coords.longitude     + '<br />' +
                            '<hr />'      + element.innerHTML;
    }
    // PositionError الكائن onError تتلقى دالة رد النداء للخطأ 
    //
    function onError(error) {
        alert('code: '    + error.code    + '\n' +
              'message: ' + error.message + '\n');
    }
    // خيارات: إن لم يحدث أي تحديث خلال 30 ثانية، فسيُطلق خطأ
    var watchID = navigator.geolocation.watchPosition(onSuccess, onError, { timeout: 30000 });

geolocationOptions

يستعمل المعامل geolocationOptions لتخصيص عملية تحصيل معلومات الموقع الجغرافي من الكائن Position.

{ maximumAge: 3000, timeout: 5000, enableHighAccuracy: true };

الخيارات التي يمكن استعمالها مع هذا المعامل هي:

  • enableHighAccuracy: قيمة منطقية تحدد إن كان تطبيقك يحتاج إلى الحصول على أدق النتائج الممكنة. بشكل افتراضي، يحاول الجهاز تحصيل معلومات الموقع الجغرافي (Position) باستخدام أساليب تستند إلى الشبكة. إنَّ ضبط هذه الخاصية إلى القيمة true سيُخطِر إطار العمل بضرورة استخدام أساليب أكثر دقة، مثل تحديد الموقع عبر الأقمار الصناعية.
  • timeout: عدد يحدِّد الفترة الزمنية القصوى (بالميلي ثانية) المسموح بمرورها منذ لحظة استدعاء التابع navigator.geolocation.getCurrentPosition أو geolocation.watchPosition وحتى تنفيذ دالة رد النداء geolocationSuccess المقابلة. إذا لم يتم استدعاء دالة رد النداء geolocationSuccess خلال هذا الوقت، فسيُمرّر إلى دالة الخطأ geolocationError رمز الخطأ PositionError.TIMEOUT. (لاحظ أنّه عند استخدامها مع التابع geolocation.watchPosition، يمكن استدعاء دالة الخطأ geolocationError بشكل متكررٍ كل timeout ميلي ثانية).
  • maximumAge: عدد يحدد أقصى عمر (الوقت بالميلي ثانية) للموقع المخزَّن مؤقتًا (cached position) ليتم قبوله.

ملاحظات خاصة بمنصة أندرويد

في حال إيقاف خدمة تحديد الموقع الجغرافي، فستُستدعى دالة رد النداء onError بعد الفاصل الزمني timeout في حال تحديده. أما في حال عدم تحديده، فلن يتم استدعاء أي دالة رد نداء.

navigator.geolocation.clearWatch

يوقف هذا التابع عملية مراقبة التغييرات في موقع الجهاز، والمشار إليها من قبل المعامل watchID.

navigator.geolocation.clearWatch(watchID);

المعامل المُمرَّر إلى التابع هو:

  • watchID: سلسلة نصية تُمثِّل مُعرِّف المجال watchPosition المُراد حذفه.

إليك المثال التالي:

    // خيارات: مراقبة التغيرات في الموقع الجغرافي، مع  الموقع 
    // استخدام أدق وسائل تحديد الموقع المُمكنة 
    //
    var watchID = navigator.geolocation.watchPosition(onSuccess, onError, { enableHighAccuracy: true });
    // ...في وقت لاحق...
    navigator.geolocation.clearWatch(watchID);

كائنات (للقراءة فقط)

Position

يحتوي الكائن Position على إحداثيات الموقع الجغرافي مع بصمة زمنية (timestamp)؛ يتم انشاؤه من قبل الواجهة البرمجية للإضافة.

خاصيات هذا الكائن هي:

  • coords: مجموعة من الإحداثيات الجغرافية.
  • timestamp: البصمة الزمنية التي تحدد وقت تسجيل الإحداثيات coords.

Coordinates

يُربَطُ الكائنُ Coordinates بكائنٍ Position، والذي يتم توفيره لدوال رد النداء (callback functions) الخاصة بطلبيات (requests) الموقع الحالي. يحتوي هذا الكائن على مجموعة من الخاصيات التي تحدد الإحداثيات الجغرافية لموقعٍ ما.

خاصيات هذا الكائن هي:

  • latitude: عدد يحدد خط العرض بالدرجات العشرية.
  • longitude: عدد يحدد خط الطول بالدرجات العشرية.
  • altitude: عدد يمثِّل ارتفاع الموقع بالأمتار فوق الإهليليج (ellipsoid).
  • accuracy: عدد يمثِّل مستوى الدقة لإحداثيات الطول والعرض بالأمتار.
  • altitudeAccuracy: عدد يحدد مستوى دقة إحداثيات الإرتفاع بالأمتار.
  • heading: عدد يمثِّل اتجاه السفر، يُحدّد بعدد الدرجات في اتجاه عقارب الساعة نسبةً إلى الشمال الحقيقي.
  • speed: عدد يحدِّد السرعة الأرضية الحالية للجهاز، تُحدد بعدد الأمتار المقطوعة في الثانية.

ملاحظات خاصة بمنصة أندرويد

الخاصية altitudeAccuracy غير مدعومة في أجهزة أندرويد، لذا ستحوي القيمة null.

PositionError

يُمرّر الكائن PositionError إلى دالة رد النداء geolocationError عند حدوث خطأ في الكائن navigator.geolocation.

خاصيات هذا الكائن هي:

  • code: أحد رموز الخطأ المحددة مسبقًا، والمدرجة أدناه.
  • message: رسالة خطأ تحتوي تفاصيل الخطأ الذي وقع.

ثوابت هذا الكائن هي:

  • PositionError.PERMISSION_DENIED: يعاد هذا الثابت عندما يرفض المستخدمون السماح للتطبيق بالوصول إلى معلومات الموقع الجغرافي. يتعلق هذا الثابت بالمنصة المُستخدمة.
  • PositionError.POSITION_UNAVAILABLE: يعاد عندما يعجز الجهاز عن الحصول على الموقع الجغرافي. بشكل عام، هذا يعني أنّ الجهاز ليس متصلًا بأي بشبكة، أو لا يمكنه الوصول إلى القمر الصناعي.
  • PositionError.TIMEOUT: يعاد عندما يتعذر على الجهاز الحصول على الموقع الجغرافي خلال الوقت المحدد بواسطة المعامل timeout المتضمَّن في الخيارات geolocationOptions. عند استخدامها مع التابع navigator.geolocation.watchPosition، يمكن تمرير هذا الخطأ مرارًا وتكرارًا إلى دالة رد النداء geolocationError كل timeout ميلي ثانية.

أمثلة عملية

يمكن استخدام هذه الإضافة لمساعدة المستخدمين على العثور على المواقع أو الأحداث القريبة منهم، مثل عروض Groupon، والمنازل المعروضة للبيع، والأفلام المعروضة حاليًا، والأحداث الرياضية والترفيهية وغير ذلك.

تحتوي هذه الفقرة على مجموعة من الأفكار التي توضح كيفية استغلال هذه الإضافة. في الشيفرات البرمجية أدناه، ستتعلم بعض الطرق السهلة لإضافة الميزات التالية إلى تطبيقك.

  • الحصول على إحداثيات موقعك
  • الحصول على توقعات الطقس
  • تلقي تحديثات توقعات الطقس أثناء القيادة
  • التعرف على موقعك على الخريطة
  • البحث عن متجر قريب
  • مطالعة صور عن المنطقة المحيطة بك

الحصول على إحداثيات موقعك الجغرافي

function getWeatherLocation() {
    navigator.geolocation.getCurrentPosition
    (onWeatherSuccess, onWeatherError, { enableHighAccuracy: true });
}

الحصول على توقعات الطقس

// دالة النجاح التي ستُمرر إليها الإحداثيات الجغرافية
var onWeatherSuccess = function (position) {
    Latitude = position.coords.latitude;
    Longitude = position.coords.longitude;
    getWeather(Latitude, Longitude);
}
// الحصول على معلومات الطقس انطلاقا من معلومات الموقع الجغرافي
function getWeather(latitude, longitude) {
   // http://openweathermap.org/ الحصول على مفتاح من الموقع
   // بالمفتاح الذي حصلت عليه "Your_Key_Here" استبدل السلسلة النصية 
    var OpenWeatherAppKey = "Your_Key_Here";
    var queryString =
      'http://api.openweathermap.org/data/2.5/weather?lat='
      + latitude + '&lon=' + longitude + '&appid=' + OpenWeatherAppKey + '&units=imperial';
    $.getJSON(queryString, function (results) {
        if (results.weather.length) {
            $.getJSON(queryString, function (results) {
                if (results.weather.length) {
                    $('#description').text(results.name);
                    $('#temp').text(results.main.temp);
                    $('#wind').text(results.wind.speed);
                    $('#humidity').text(results.main.humidity);
                    $('#visibility').text(results.weather[0].main);
                    var sunriseDate = new Date(results.sys.sunrise);
                    $('#sunrise').text(sunriseDate.toLocaleTimeString());
                    var sunsetDate = new Date(results.sys.sunrise);
                    $('#sunset').text(sunsetDate.toLocaleTimeString());
                }
            });
        }
    }).fail(function () {
        console.log("error getting location");
    });
}
// دالة رد النداء للخطأ
function onWeatherError(error) {
    console.log('code: ' + error.code + '\n' +
        'message: ' + error.message + '\n');
}

تلقي تحديثات توقعات الطقس أثناء القيادة

// مراقبة التغيرات في الموقع
function watchWeatherPosition() {
    return navigator.geolocation.watchPosition
    (onWeatherWatchSuccess, onWeatherError, { enableHighAccuracy: true });
}
// دالة رد النداء للنجاح الخاصة بمراقبة تغيرات موقعك
var onWeatherWatchSuccess = function (position) {
    var updatedLatitude = position.coords.latitude;
    var updatedLongitude = position.coords.longitude;
    if (updatedLatitude != Latitude && updatedLongitude != Longitude) {
        Latitude = updatedLatitude;
        Longitude = updatedLongitude;
        // استدعاء الدوال التي عرّفناها سابقًا
        getWeather(updatedLatitude, updatedLongitude);
    }
}

التعرف على موقعك على الخريطة

يُوفر كلٌ من الموقعين Bing و Google خدمات الخرائط. سنستخدم في هذا المثال Google.

ستحتاج إلى مفتاحِ لاستخدام خرائط Google، والذي يمكنك الحصول عليه مجانًا إن كنت تريد تجربة الخدمة.

قم بإضافة مرجع إلى الخدمة maps.

<script src="https://maps.googleapis.com/maps/api/js?key=Your_API_Key"></script>‎

ثم أضف الشيفرة التالية لاستخدام الخدمة.

var Latitude = undefined;
var Longitude = undefined;
// الحصول على الإحداثيات الجغرافية
function getMapLocation() {
    navigator.geolocation.getCurrentPosition
    (onMapSuccess, onMapError, { enableHighAccuracy: true });
}
// دالة النجاح التي تستجيب لإحداثيات الموقع الجغرافي
var onMapSuccess = function (position) {
    Latitude = position.coords.latitude;
    Longitude = position.coords.longitude;
    getMap(Latitude, Longitude);
}
// الحصول على الخريطة انطلاقًا من الموقع الجغرافي
function getMap(latitude, longitude) {
    var mapOptions = {
        center: new google.maps.LatLng(0, 0),
        zoom: 1,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map
    (document.getElementById("map"), mapOptions);
    var latLong = new google.maps.LatLng(latitude, longitude);
    var marker = new google.maps.Marker({
        position: latLong
    });
    marker.setMap(map);
    map.setZoom(15);
    map.setCenter(marker.getPosition());
}
// دالة النجاح التي تستجيب للتغيرات في الموقع الجغرافي
var onMapWatchSuccess = function (position) {
    var updatedLatitude = position.coords.latitude;
    var updatedLongitude = position.coords.longitude;
    if (updatedLatitude != Latitude && updatedLongitude != Longitude) {
        Latitude = updatedLatitude;
        Longitude = updatedLongitude;
        getMap(updatedLatitude, updatedLongitude);
    }
}
// دالة الاستجابة للخطأ
function onMapError(error) {
    console.log('code: ' + error.code + '\n' +
        'message: ' + error.message + '\n');
}
// مراقبة التغيرات في موقعك الجغرافي
function watchMapPosition() {
    return navigator.geolocation.watchPosition
    (onMapWatchSuccess, onMapError, { enableHighAccuracy: true });
}

البحث عن متجر قريب

يمكنك استخدام نفس مفتاح جوجل في هذا المثال.

أضف مرجعًا إلى الخدمة places.

<script src=
"https://maps.googleapis.com/maps/api/js?key=Your_API_Key&libraries=places">
</script>‎

ثم أضف الشيفرة التالية لاستخدام هذه الخدمة.

var Map;
var Infowindow;
var Latitude = undefined;
var Longitude = undefined;
// الحصول على الإحداثيات الجغرافية
function getPlacesLocation() {
    navigator.geolocation.getCurrentPosition
    (onPlacesSuccess, onPlacesError, { enableHighAccuracy: true });
}
// دالة النجاح للاستجابة لإحداثيات الموقع الجغرافي
var onPlacesSuccess = function (position) {
    Latitude = position.coords.latitude;
    Longitude = position.coords.longitude;
    getPlaces(Latitude, Longitude);
}
// التعرف على الأمكنة انطلاقا من احداثيات الموقع الجغرافي
function getPlaces(latitude, longitude) {
    var latLong = new google.maps.LatLng(latitude, longitude);
    var mapOptions = {
        center: new google.maps.LatLng(latitude, longitude),
        zoom: 15,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    Map = new google.maps.Map(document.getElementById("places"), mapOptions);
    Infowindow = new google.maps.InfoWindow();
    var service = new google.maps.places.PlacesService(Map);
    service.nearbySearch({
        location: latLong,
        radius: 500,
        type: ['store']
    }, foundStoresCallback);
}
// دالة النجاح للاستجابة للتغيرات في الموقع الجغرافي
var onPlacesWatchSuccess = function (position) {
    var updatedLatitude = position.coords.latitude;
    var updatedLongitude = position.coords.longitude;
    if (updatedLatitude != Latitude && updatedLongitude != Longitude) {
        Latitude = updatedLatitude;
        Longitude = updatedLongitude;
        getPlaces(updatedLatitude, updatedLongitude);
    }
}
// دالة النجاح للاستجابة للعثور على متجر قريب
function foundStoresCallback(results, status) {
    if (status === google.maps.places.PlacesServiceStatus.OK) {
        for (var i = 0; i < results.length; i++) {
            createMarker(results[i]);
        }
    }
}
// على كل متجر عثرت عليه في الخريطة pin وضع علامة 
function createMarker(place) {
    var placeLoc = place.geometry.location;
    var marker = new google.maps.Marker({
        map: Map,
        position: place.geometry.location
    });
    google.maps.event.addListener(marker, 'click', function () {
        Infowindow.setContent(place.name);
        Infowindow.open(Map, this);
    });
}
// دالة الخطأ
function onPlacesError(error) {
    console.log('code: ' + error.code + '\n' +
        'message: ' + error.message + '\n');
}
// مراقبة التغير في موقعك الجغرافي
function watchPlacesPosition() {
    return navigator.geolocation.watchPosition
    (onPlacesWatchSuccess, onPlacesError, { enableHighAccuracy: true });
}

مطالعة صور عن المنطقة المحيطة بك

يمكن أن تُرفق الصور الرقمية مع الإحداثيات الجغرافية للمكان الذي التُقطت فيه.

استخدم الواجهة البرمجية لموقع Flickr للعثور على الصور التي التُقِطت بالقرب من مكان تواجدك. ومثل خدمات جوجل، ستحتاج إلى مفتاح، ولكنه مجاني إن كنت ترغب في التجربة فحسب.

var Latitude = undefined;
var Longitude = undefined;
// الحصول على الاحداثيات الجغرافية
function getPicturesLocation() {
    navigator.geolocation.getCurrentPosition
    (onPicturesSuccess, onPicturesError, { enableHighAccuracy: true });
}
// دالة النجاح للاستجابة لاحداثيات الموقع الجغرافي
var onPicturesSuccess = function (position) {
    Latitude = position.coords.latitude;
    Longitude = position.coords.longitude;
    getPictures(Latitude, Longitude);
}
// الحصول على الصور باستخدام احداثيات الموقع الجغرافي
function getPictures(latitude, longitude) {
    $('#pictures').empty();
    var queryString =
    "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=Your_API_Key&lat="
    + latitude + "&lon=" + longitude + "&format=json&jsoncallback=?";
    $.getJSON(queryString, function (results) {
        $.each(results.photos.photo, function (index, item) {
            var photoURL = "http://farm" + item.farm + ".static.flickr.com/" +
                item.server + "/" + item.id + "_" + item.secret + "_m.jpg";
            $('#pictures').append($("<img />").attr("src", photoURL));
           });
        }
    );
}
// دالة النجاح للاستجابة للتغيرات في موقعك الجغرافي
var onPicturesWatchSuccess = function (position) {
    var updatedLatitude = position.coords.latitude;
    var updatedLongitude = position.coords.longitude;
    if (updatedLatitude != Latitude && updatedLongitude != Longitude) {
        Latitude = updatedLatitude;
        Longitude = updatedLongitude;
        getPictures(updatedLatitude, updatedLongitude);
    }
}
// دالة الخطأ
function onPicturesError(error) {
    console.log('code: ' + error.code + '\n' +
        'message: ' + error.message + '\n');
}
// مراقبة التغيرات في موقعك الجغرافي
function watchPicturePosition() {
    return navigator.geolocation.watchPosition
    (onPicturesWatchSuccess, onPicturesError, { enableHighAccuracy: true });
}

انظر أيضًا

مصادر