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

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

حزمة تطوير البرامج (SDK) للتنقّل مع رصد حدود المنطقة الجغرافية
حزمة تطوير البرامج (SDK) لنظام التنقّل مع ميزة رصد الحدود الجغرافية

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

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

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

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

النطاق

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ضبط التبعيات لمجموعة 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، يُرجى الاطّلاع على هذا الرابط.

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

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
}

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

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

نهج بديل

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

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

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

[Execution Environment] بنية وضع حدود جغرافية من جهة الخادم

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

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

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

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

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

الخاتمة

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

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

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

مراجع إضافية مقترَحة: