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

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

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

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

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

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

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

النطاق

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

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

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

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

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

المستمعون

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

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

في هذا الدليل، يتم استخدام موفّر RoadSnappedLocation فقط وLocationListener الخاص به.

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

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

مخطط وظيفي
مخطّط وظيفي

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

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

ضبط التبعيات لتطبيقات Android-Maps-Utills

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

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

  • 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 مع ملف version.gradle الأحدث، يمكنك استيراد com.google.maps.android.PolyUtill في ملف 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-Utills، يمكنك استخدام PolyUtil.containsLocation للتحقق مما إذا كان الموقع الذي تم استلامه يقع داخل المضلّع المحدد مسبقًا. في المثال أدناه، يتم استخدام المضلّع المحدد مسبقًا، الذي يمثل السياج الجغرافي، ولكن من الناحية العملية، قد يكون لديك مضلّعات متعددة وسيلزم تكرار حلقة.

نهج بديل

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

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

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

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

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

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

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

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

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

الخلاصة

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

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

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

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