يوضّح هذا المستند ما هو المقصود بميزة "الحدّ الجغرافي من جهة العميل"، وحالات استخدامها، وكيفية تطبيقها على حالات الاستخدام في تطبيق جوّال. كما توضح أيضًا كيفية تنفيذ مثال على Android باستخدام حزمة SDK للتنقل في Google.
غالبًا ما تحتاج الشركات إلى معرفة ما إذا كان جهاز جوّال قد دخل منطقة معيّنة أو غادرها. ويتم ذلك من خلال الحفاظ على الحدود الجغرافية الافتراضية، أو الحواجز الجغرافية، ما يتيح للبرامج بدء الأحداث عندما يتجاوز الجهاز حدودًا معيّنة.
من المهم معرفة الحالات التي تجتاز فيها مركبة معيّنة حدودًا، وذلك لاستخدامات متعدّدة، مثل:
- تفاعل العملاء: يمكن للأنشطة التجارية استخدام ميزة تحديد الموقع الجغرافي لإرسال إشعارات فورية إلى المستخدمين النهائيين بشأن العروض الخاصة أو الفعاليات أو المنتجات الجديدة.
- الأمان والسلامة: يمكن للأنشطة التجارية استخدام ميزة "الحدّ الجغرافي" لإنشاء حدود افتراضية حول المناطق الحسّاسة، مثل مراكز البيانات أو المستودعات، وتنبيه أفراد الأمن إذا دخل شخص ما إلى المنطقة أو خرج منها.
- النقل: يمكن للأنشطة التجارية استخدام ميزة "الحدّ الجغرافي" لتتبُّع موقع المركبات وتحسين المسارات والجداول الزمنية.
لذلك من المهم أن تعرف كيفية تمثيل تلك المناطق (المضلعات) داخل تطبيق مواجه للعميل. ويجب أن يتتبّع هذا التطبيق الموقع الجغرافي للجهاز ويتحقّق مما إذا كان قد اخترق حدودًا جغرافية معيّنة.
النطاق
يركّز هذا المستند على التنفيذ من جانب العميل لوضع حدود جغرافية . وهذا يعني أنّ تطبيق العميل يجب أن يتضمّن ما يلي:
- المضلعات التي يلزم التحقق منها بحثًا عن أي اختراقات
- الموقع الجغرافي للمستخدم في الوقت الفعلي
- منطق للتحقق مما إذا كان الموقع الحالي داخل أي مضلّع أو خارجه.
يتضمّن هذا الدليل أمثلة على أجهزة Android، ولكن هناك طرق مماثلة لتنفيذ ذلك على أجهزة iOS. تتضمن "خدمة الموقع الجغرافي على Android" تنفيذًا مدمجًا للأسوار الجغرافية الدائرية التي يمكن الاطّلاع عليها هنا. يمثل الرمز المرجعي والوصف أدناه نقطة بداية لعمليات تنفيذ أكثر تعقيدًا.
حزمة تطوير البرامج للتنقّل
حزمة تطوير البرامج (SDK) للتنقّل هي مكتبة أصلية لنظامَي التشغيل Android وiOS تمت إضافتها إلى تطبيق السائق. وهي مسؤولة عن ما يلي:
- الحصول على المواقع الجغرافية التي تم اقتطاعها من التطبيق الذي يشغله وهذا الإجراء أكثر دقة من FusedLocationProvider (FLP) في Android، لأنّه يستخدم شبكة الطرق من Google لربط المواقع الجغرافية بأقرب جزء من الطريق، ما يجعل وقت الوصول المقدَّر أكثر دقة، بالإضافة إلى معلومات أخرى من FLP.
- تجربة التنقّل من نقطة إلى أخرى تتيح للسائقين الانتقال بكفاءة من النقطة "أ" إلى النقطة "ب" مع مراعاة حركة المرور في الوقت الفعلي والقيود الأخرى المفروضة على المسار
- بدء الأحداث من خلال أدوات معالجة الأحداث وعمليات الاستدعاء المسجَّلة
أدوات معالجة الأحداث
تحتوي حزمة تطوير البرامج (SDK) للتنقّل على العديد من أدوات معالجة البيانات التي يمكنك استخدامها. في ما يلي بعض الأمثلة:
- يتم تغيير الموقع الجغرافي من خلال مقدّم خدمة RoadSnappedLocation.
- إعادة توجيه الأحداث (يفوت المستخدم دوران للخلف أو انعطاف لليسار وما إلى ذلك وينحرف عن المسار المقترَح) من خلال ReroutingListener.
- أحداث الوصول (يصل المستخدم إلى الوجهة المخطط لها) من خلال ArrivalListener.
- حدثا المسافة المتبقية ووقت الوصول المقدَّر (يتم إعلامك عندما يكون السائق على وشك الوصول إلى الوجهة استنادًا إلى الأمتار، ويتم إعلامك عندما يكون السائق على وشك الوصول إلى الوجهة استنادًا إلى الوقت) متوفّران من خلال RemainingTimeOrDistanceChangedListener.
في هذا الدليل، يتم استخدام RoadSnappedLocationProvider وLocationListener الخاص به فقط.
حلّ وضع حدود جغرافية من جهة العميل
لننتقل الآن إلى مرحلة إنشاء إمكانية وضع حدود جغرافية من جانب العميل. في المثال أدناه، تعمل حزمة SDK للتنقل في وضع الاتّجاهات المفصّلة ومضلّعًا محدّدًا في المسار الذي يمثّل السياج الجغرافي.
- يتم تخزين حدود الجغرافية في BigQuery ويتم استرجاعها من خلال الخلفية.
- تعمل الخلفية بشكل دوري على إرسال السياجات الجغرافية إلى تطبيقات محرك الأقراص.
- يتنقّل برنامج التشغيل ويتحقّق تطبيق السائق بانتظام من الحدود الجغرافية بحثًا عن مشغّل معيّن.
- يُرسِل تطبيق "سائق Google" إشعارًا إلى الخلفية بشأن حدث مشغِّل كي تتمكّن من اتّخاذ إجراء.
وأثناء تحرك المركبة على طول المسار، يتحقق التطبيق بانتظام مما إذا كان قد تم اختراق المضلّع. عندما يرصد التطبيق أنّه عبر حدودًا جغرافية، تظهر رسالة على واجهة المستخدم نصها: تم اختراق الحدود الجغرافية.
ضبط التبعيات لمجموعة Android-Maps-Utils
يستخدم هذا الحل Android-Maps-Utils (مكتبة-استخدامات-Android)، وهي مكتبة مفتوحة المصدر تحتوي على برامج خدمات مفيدة لمجموعة كبيرة من التطبيقات باستخدام واجهة برمجة تطبيقات Android لخرائط Google.
هذه المكتبة عامة ومستضافة على 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] بنية وضع حدود جغرافية من جهة الخادم
مثال على بنية توضّح أسلوبًا من جهة الخادم لتحديد الحدود الجغرافية
- يرسل تطبيق السائق، باستخدام Driver SDK، تحديثات الموقع الجغرافي إلى Fleet Engine. يتم إجراء تعديلات على الموقع الجغرافي والتنقّل داخل التطبيق من خلال حزمة تطوير البرامج (SDK) للتنقّل.
- تُخرج أداة Fleet Engine هذه التعديلات إلى Cloud Logging أو Pub/Sub.
- تجمع الخلفية إشارات الموقع الجغرافي هذه.
- يتم تخزين حدود الجغرافية في BigQuery لتحليلها من خلال الخلفية.
- عند تفعيل السياج الجغرافي، يتم إرسال التنبيهات إلى "تطبيق السائق".
في هذه البنية، يتم استخدام Driver SDK وFleet Engine. يمكن أن يصدر Fleet Engine تحديثات PubSub وينشئ إدخالات السجلّ في Cloud Logging. وفي كلتا الحالتين، يمكن استرداد الموقع الجغرافي للمركبة.
يمكن أن تتولى الخلفية بعد ذلك مراقبة "قائمة الانتظار في PubSub" أو قراءة السجلات والبحث عن آخر المعلومات المتعلّقة بالمركبة. وبعد ذلك، عند حدوث تحديث (أو كل بضع ثوانٍ، دقائق، مع مراعاة مدى أهمية ذلك)، يمكن للواجهة الخلفية استدعاء وظائف GIS في BigQuery لتحديد ما إذا كانت مركبة معيّنة داخل الحدود الجغرافية أو خارجها. في حال تم اختراق حدود منطقة جغرافية واحدة أو أكثر، يمكن للخلفية اتّخاذ إجراء وتشغيل مسارات عمل داخلية أو مسارات عمل أخرى ذات صلة.
الخاتمة
إنّ وضع حدود جغرافية هو أداة فعّالة يمكن استخدامها لأغراض مختلفة. يمكن للأنشطة التجارية استخدام ميزة تحديد المواقع الجغرافية لاستهداف المستخدمين النهائيين من خلال الإعلانات والعروض الترويجية ذات الصلة، وتقديم خدمات مستندة إلى الموقع الجغرافي، وتحسين الأمان والسلامة.
توفِّر حزمة تطوير البرامج (SDK) للتنقّل أدوات معالجة بيانات مفيدة للأحداث يمكنها رصد العديد من اللحظات المهمة خلال الرحلة. غالبًا ما تتطلّب الشركات حدودًا جغرافية مخصّصة لحالات استخدام معيّنة. وقد أظهرنا في هذا المستند طريقة لتحقيق ذلك، لكن الاحتمالات لا حصر لها. نحن في انتظار رؤية أفكارك.
الإجراءات التالية
- اطّلع على البرنامج التعليمي على الويب الاستكشاف والتعلّم واستلهام الأفكار من الإمكانيات المتاحة باستخدام "منصة خرائط Google".
قراءة إضافية مقترحة: