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

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

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

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

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

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

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

النطاق

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

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

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

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

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

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

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

  • تغييرات الموقع الجغرافي من خلال موفّر 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
}

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

بعد تحديد النطاقات الجغرافية، ما عليك سوى إنشاء أداة معالجة لتلقّي إشعارات التحديث بشأن الموقع الجغرافي للاشتراك في الحدث المذكور أعلاه في حزمة تطوير البرامج للتنقّل باسم 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 أدوات معالجة أحداث مفيدة يمكنها رصد العديد من اللحظات المهمة أثناء الرحلة. غالبًا ما تحتاج الشركات إلى إنشاء سياجات جغرافية مخصّصة لحالات استخدام معيّنة. في هذا المستند، عرضنا طريقة لتحقيق ذلك، ولكن الاحتمالات لا حصر لها. نتطلّع إلى رؤية ما ستقدّمه.

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

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