يمكنك تفعيل الحدود الجغرافية من جهة العميل لتتبُّع مواد العرض على الأجهزة الجوّالة باستخدام حزمة تطوير البرامج (SDK) باستخدام برنامج Nav.

يوضّح هذا المستند مفهوم تحديد الموقع الجغرافي من جهة العميل، وحالات استخدامه، وكيفية تطبيقه على حالات الاستخدام في تطبيق جوّال. توضّح هذه الصفحة أيضًا كيفية تنفيذ مثال على نظام التشغيل Android باستخدام حزمة تطوير البرامج للتنقّل من Google.

حزمة تطوير البرامج للتنقّل مع رصد السياج الجغرافي
Nav SDK with geofence detection

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

من المهم معرفة الوقت الذي تعبر فيه مركبة معيّنة حدودًا معيّنة، وذلك لعدة حالات استخدام، مثل:

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

لذلك، من المهم معرفة كيفية تمثيل هذه المناطق (المضلّعات) داخل تطبيق مخصّص للعملاء، ويجب أن يتتبّع هذا التطبيق الموقع الجغرافي للجهاز ويتأكّد مما إذا كان قد اخترق سياجًا جغرافيًا معيّنًا.

النطاق

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

  1. المضلّعات التي يجب التحقّق منها بحثًا عن أي انتهاكات
  2. الموقع الجغرافي للمستخدم في الوقت الفعلي
  3. منطق للتحقّق مما إذا كان الموقع الجغرافي الحالي داخل أي من المضلّعات أو خارجها.

يتضمّن هذا الدليل أمثلة على نظام التشغيل Android، ولكن هناك طرق مكافئة لتنفيذ ذلك على نظام التشغيل iOS. تتضمّن "خدمة الموقع الجغرافي من Google" عملية تنفيذ مدمجة لحدود جغرافية دائرية يمكن الاطّلاع عليها هنا. إنّ رمز المرجع والوصف أدناه هما نقطة بداية لعمليات تنفيذ أكثر تعقيدًا.

حزمة تطوير البرامج للتنقّل هي مكتبة أصلية لنظام التشغيل Android أو iOS يتم إضافتها إلى تطبيق السائق، وهي مسؤولة عمّا يلي:

  • الحصول على المواقع الجغرافية التي تم ضبطها على الطرق من التطبيق الذي يعرضها وهي أكثر دقة من FusedLocationProvider (FLP) في Android لأنّها تستخدم شبكة الطرق من Google لتحديد المواقع الجغرافية على أقرب جزء من الطريق، ما يجعل الوقت المقدَّر للوصول أكثر دقة، بالإضافة إلى معلومات أخرى من FLP.
  • تجربة التنقّل خطوة بخطوة التي تتيح للسائقين الانتقال بكفاءة من النقطة "أ" إلى النقطة "ب" مع الأخذ في الاعتبار حركة المرور في الوقت الفعلي وقيود المسار الأخرى
  • إطلاق الأحداث من خلال أدوات معالجة الأحداث وعمليات رد الاتصال المسجّلة

أدوات معالجة الأحداث

تحتوي حزمة تطوير البرامج (SDK) للتنقّل على العديد من أدوات معالجة الأحداث التي يمكنك استخدامها. في ما يلي بعض الأمثلة:

  • تغييرات الموقع الجغرافي من خلال موفّر RoadSnappedLocation
  • إعادة توجيه الأحداث (إذا فات المستخدم منعطفًا على شكل حرف U أو منعطفًا إلى اليسار أو غير ذلك وانحرف عن المسار المقترَح) من خلال ReroutingListener
  • أحداث الوصول (وصول المستخدم إلى الوجهة المخطّط لها) من خلال ArrivalListener
  • تتوفّر أحداث المسافة المتبقية ووقت الوصول المقدَّر (تلقّي إشعار عندما يكون السائق على وشك الوصول إلى الوجهة استنادًا إلى الأمتار، وتلقّي إشعار عندما يكون السائق على وشك الوصول إلى الوجهة استنادًا إلى الوقت) من خلال RemainingTimeOrDistanceChangedListener.

في هذا الدليل، يتم استخدام RoadSnappedLocationProvider وLocationListener فقط.

حلّ وضع الحدود الجغرافية من جهة العميل

لنستعرض الآن خطوات إنشاء إمكانية تحديد الموقع الجغرافي من جهة العميل. في المثال أدناه، تعمل حزمة تطوير البرامج (SDK) الخاصة بخدمة Navigation في وضع التنقّل خطوة بخطوة، ويتم تحديد مضلّع في المسار يمثّل السياج الجغرافي.

المخطط الوظيفي
المخطط الوظيفي

  1. يتم تخزين السياجات الجغرافية في BigQuery ويتم استردادها من خلال الخلفية.
  2. يرسل الخلفية بشكل دوري السياجات الجغرافية إلى تطبيقات القيادة.
  3. يتنقّل السائق ويتحقّق تطبيق السائق بانتظام من السياجات الجغرافية بحثًا عن مشغّل.
  4. يُعلم تطبيق السائق الخلفية بحدث مشغِّل كي تتمكّن من اتّخاذ إجراء.

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

ضبط التبعيات لأداة Android-Maps-Utils

يستخدم هذا الحلّ Android-Maps-Utils، وهي مكتبة مفتوحة المصدر تحتوي على أدوات مساعدة مفيدة لمجموعة كبيرة من التطبيقات التي تستخدم Google Maps Android API.

هذه المكتبة عامة ومستضافة على Github ويمكن الوصول إليها من خلال:

  • Android: https://github.com/googlemaps/android-maps-utils
  • iOS: https://github.com/googlemaps/google-maps-ios-utils

لتضمين هذه المكتبة في تطبيق Android (نطاق هذا المستند)، عليك تعديل ملف build.gradle لتضمينها. يُرجى العِلم أنّ ملف build.gradle هذا مخصّص للوحدة (التطبيق) التي يتم إنشاؤها، وليس على مستوى المشروع.

dependencies {
   ...
   // Utilities for Maps SDK for Android (requires Google Play Services)
   implementation 'com.google.maps.android:android-maps-utils:2.3.0'
}

بعد ذلك، وبعد مزامنة Gradle مع أحدث ملف build.gradle، يمكنك استيراد com.google.maps.android.PolyUtil في ملف Java:

import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;

تحديد الحدود الجغرافية

يُرجى العِلم أنّه يتم هنا أيضًا استيراد PolygonOptions. والسبب هو أنّ هذا ما يتم استخدامه لتمثيل المضلّع:

mPolygonOptions = new PolygonOptions()
       .add(new LatLng(29.4264525,-98.4948758))
       .add(new LatLng(29.4267029,-98.4948758))
       .add(new LatLng(29.4273742,-98.4945822))
       .add(new LatLng(29.4264562,-98.4943592))
       .fillColor(0x0000ff36)
       .strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
       .strokeColor(Color.BLUE)
       .strokeWidth(5);

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

لمزيد من التفاصيل حول ما يمكن تحديده في PolygonOptions، يُرجى الاطّلاع على هذا الرابط.

يجب تحديد المضلّعات أثناء إنشاء Fragment أو Activity. على سبيل المثال:

protected void onCreate(Bundle savedInstanceState) {
   ...
   mPolygonOptions = new PolygonOptions()
           .add(new LatLng(29.4264525,-98.4948758))
           .add(new LatLng(29.4267029,-98.4948758))
           .add(new LatLng(29.4273742,-98.4945822))
           .add(new LatLng(29.4264562,-98.4943592))
           .fillColor(0x0000ff36)
           .strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
           .strokeColor(Color.BLUE)
           .strokeWidth(5);

   ...// more code here
}

الاستماع إلى إشعارات الموقع الجغرافي

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

mLocListener = new RoadSnappedLocationProvider.LocationListener() {
   @Override
   public void onLocationChanged(Location snapped) {
       LatLng snappedL = new LatLng(snapped.getLatitude(), snapped.getLongitude());
       if(PolyUtil.containsLocation(snappedL, mPolygonOptions.getPoints(), true) && !mGeofenceBreached){
           Log.d("Geofence", "Vehicle has breached the polygon");
       }
   }
   @Override
   public void onRawLocationUpdate(Location location) {
   }
};

باستخدام Android-Maps-Utils، يمكنك استخدام PolyUtil.containsLocation للتحقّق مما إذا كان الموقع الجغرافي المستلَم يقع داخل المضلّع المحدّد مسبقًا. في المثال أدناه، يتم استخدام المضلّع المحدّد مسبقًا الذي يمثّل السياج الجغرافي، ولكن في الواقع قد يكون لديك مضلّعات متعددة وسيكون من الضروري استخدام حلقة.

طريقة بديلة

يركّز هذا المستند على تطبيق موجّه للعملاء يتحقّق من حدوث خرق لسياج جغرافي مخصّص (مضلّع). ومع ذلك، هناك سيناريوهات قد تحتاج فيها إلى إجراء عمليات التحقّق هذه في الخلفية.

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

يمكن أن يكون الحل المحتمل على النحو التالي:

[بيئة التنفيذ] بنية تحديد الموقع الجغرافي على الخادم

مثال على بنية توضّح أسلوبًا من جهة الخادم لتحديد الموقع الجغرافي.

الحلّ من جهة الخادم
حلّ من جهة الخادم

  1. يرسل تطبيق السائق، باستخدام Driver SDK، تعديلات الموقع الجغرافي إلى Fleet Engine. يتم تلقّي إشعارات بشأن الموقع الجغرافي والتنقّل داخل التطبيق من خلال حزمة تطوير البرامج للتنقّل.
  2. تُرسِل Fleet Engine هذه التعديلات إلى Cloud Logging أو Pub/Sub.
  3. يجمع الخلفية إشارات الموقع الجغرافي هذه.
  4. يتم تخزين السياجات الجغرافية في BigQuery ليتم تحليلها من خلال الخلفية.
  5. عند تفعيل السياج الجغرافي، يتم إرسال التنبيهات إلى تطبيق السائق.

في هذه البنية، يتم استخدام Driver SDK وFleet Engine. يمكن أن يرسل Fleet Engine تحديثات PubSub وينشئ إدخالات سجلّ في Cloud Logging. في كلتا الحالتين، يمكن استرداد الموقع الجغرافي للمركبة.

يمكن أن تراقب الخلفية بعد ذلك قائمة انتظار PubSub أو تقرأ السجلات وتراقب تحديثات المركبات. بعد ذلك، عندما يحدث تعديل (أو كل بضع ثوانٍ أو دقائق، حسب أهمية التعديل)، يمكن للخادم الخلفي استدعاء وظائف BigQuery GIS لتحديد ما إذا كانت مركبة معيّنة داخل أو خارج السياجات الجغرافية. في حال اختراق سياج جغرافي واحد أو أكثر، يمكن للخادم الخلفي اتّخاذ إجراءات وتفعيل قنوات داخلية أو إجراءات سير عمل أخرى ذات صلة.

الخاتمة

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

توفّر حزمة تطوير البرامج (SDK) الخاصة بخدمة Navigation أدوات معالجة أحداث مفيدة يمكنها رصد العديد من اللحظات المهمة أثناء الرحلة. غالبًا ما تتطلّب الشركات إنشاء سياجات جغرافية مخصّصة لحالات استخدام معيّنة. في هذا المستند، عرضنا طريقة لتحقيق ذلك، ولكن الإمكانيات لا حصر لها. نتطلّع إلى رؤية ابتكاراتك.

الإجراءات التالية

محتوى إضافي للقراءة: