הקפצה של גבולות וירטואליים בגבול הווירטואלי של הלקוח כדי לעקוב אחר נכסים בנייד באמצעות Nav SDK

במסמך הזה מוסבר מהי גיאופינינג בצד הלקוח, מתי כדאי להשתמש בו ואיך מחילים אותו על תרחישי שימוש באפליקציה לנייד. בנוסף, מוסבר איך מטמיעים דוגמה ב-Android באמצעות Google Navigation SDK.

SDK לניווט עם זיהוי גבולות וירטואליים
Nav SDK עם זיהוי של מתחם מוגדר

לעתים קרובות, חברות צריכות לדעת מתי מכשיר נייד נכנס לאזור מסוים או יוצא ממנו. לשם כך, אנחנו שומרים על גבולות גיאוגרפיים וירטואליים, או גבולות וירטואליים, שמאפשרים לתוכנה להפעיל אירועים כאשר מכשיר חוצה את הגבול.

חשוב להבין מתי כלי רכב מסוים חוצה את הגבול בכמה תרחישים לדוגמה, למשל:

  • עידוד המעורבות של הלקוחות: עסקים יכולים להשתמש בתחום הגיאוגרפית המוגדר מראש כדי לשלוח התראות לדחוף למשתמשי הקצה לגבי מבצעים, אירועים או מוצרים חדשים.
  • אבטחה ובטיחות: עסקים יכולים להשתמש בגבולות וירטואליים כדי ליצור גבולות וירטואליים לאזורים רגישים, כמו מרכזי נתונים או מחסנים, ולהתריע בפני אנשי אבטחה אם מישהו נכנס לאזור או יוצא ממנו.
  • תחבורה: עסקים יכולים להשתמש בגבולות וירטואליים כדי לעקוב אחר המיקום של כלי רכב ולשפר את המסלולים ולוחות הזמנים.

לכן חשוב לדעת איך לייצג את האזורים האלה (פוליגונים) באפליקציה שמוצגת ללקוח. האפליקציה הזו אמורה לעקוב אחרי מיקום המכשיר ולבדוק אם הוא חצה גדר גיאוגרפית מסוימת.

היקף

המאמר הזה מתמקד בהטמעה של גיאופינינג מצד הלקוח. המשמעות היא שבאפליקציית הלקוח צריכים להיות:

  1. הפוליגונים שצריך לבדוק בהשוואה אליהם כדי לזהות הפרות.
  2. מיקום המשתמש בזמן אמת
  3. היגיון היגיון לבדוק אם המיקום הנוכחי הוא בתוך הפוליגונים או מחוצה להם.

המדריך הזה כולל דוגמאות ב-Android, אבל יש דרכים מקבילות לעשות זאת גם ב-iOS. לשירות המיקום של Android יש הטמעה מובנית של אזורי הגנה גיאוגרפיים עגולים, שאפשר לראות כאן. קוד העזר והתיאור שבהמשך הם נקודת התחלה להטמעות מורכבות יותר.

Navigation SDK היא ספרייה מקורית ל-Android או ל-iOS שנוספת לאפליקציית הנהג. היא אחראית על:

  • אחזור מיקומים של צילומי כביש מהאפליקציה שמפעילה אותם. הנתונים האלה מדויקים יותר מאלה של FusedLocationProvider (FLP) של Android, כי הם מתבססים על רשת הכבישים של Google כדי לשייך מיקומים לקטע הכביש הקרוב ביותר, וכך זמן ההגעה המשוער מדויק הרבה יותר. בנוסף, הם כוללים מידע נוסף מ-FLP.
  • מסלול מפורט שמאפשר לנהגים להגיע ביעילות מנקודה א' לנקודה ב' תוך התחשבות במצב התנועה בזמן אמת ומגבלות אחרות במסלול.
  • הפעלת אירועים באמצעות פונקציות לניטור אירועים וקודי חזרה רשומים.

מאזינים

ב-SDK לניווט יש פונקציות מאזינים רבות שבהן ניתן להשתמש. בין היתר:

  • שינויים במיקום דרך הספק RoadSnappedLocation.
  • שינוי המסלול (המשתמש מפספס פניית פרסה, פנייה שמאלה וכו' וסטה מהמסלול המומלץ) דרך ReroutingListener.
  • אירועי הגעה (המשתמש מגיע ליעד המתוכנן) דרך ArrivalListener.
  • אירועי מרחק שנותר ואירועי זמן הגעה משוער (קבלת התראה כשהנהג עומד להגיע ליעד – על סמך מטרים, קבלת התראה כשהנהג עומד להגיע ליעד – על סמך זמן). שני האירועים זמינים באמצעות RemainingTimeOrDistanceChangedListener.

במדריך הזה נעשה שימוש רק ב-RoadSnappedLocationProvider וב-LocationListener שלו.

הפתרון להגדרת גבולות וירטואליים בצד הלקוח

עכשיו נלמד איך יוצרים יכולת של גיאופינינג בצד הלקוח. בדוגמה הבאה יש לנו SDK ניווט שפועל במצב מסלול מפורט ופוליגון מוגדר במסלול שמייצג את הגבול הווירטואלי שלנו.

תרשים פונקציונלי
תרשים פונקציונלי

  1. גבולות וירטואליים נשמרים ב-BigQuery ונשלפים על ידי הקצה העורפי.
  2. הקצה העורפי מעביר את המחיצות הגיאוגרפיות לאפליקציות הנסיעה מדי פעם.
  3. הנהג מנווט, ואפליקציית הנהג בודקת באופן קבוע את הגבולות הגיאוגרפיים כדי לאתר טריגר.
  4. אפליקציית הנהג מעדכנת את הקצה העורפי על אירוע מפעיל כדי שהוא יוכל לפעול.

בזמן שהרכב נע לאורך המסלול, האפליקציה בודקת באופן קבוע אם הפוליגון נפרץ. כשהאפליקציה מזהה שהיא חצתה גבול וירטואלי, מוצגת הודעה בממשק המשתמש עם הכיתוב: Geofence breached.

הגדרת יחסי תלות ל-Android-Maps-Utils

הפתרון הזה משתמש ב-Android-Maps-Utils, ספריית קוד פתוח שמכילה כלי עזר למגוון רחב של אפליקציות שמשתמשות ב-Android API של מפות 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
}

האזנה לעדכוני מיקום

אחרי שמגדירים את המיקומים הגיאוגרפיים המוגנים, צריך רק ליצור מאזין לעדכוני מיקום כדי להירשם לאירוע שצוין למעלה ב-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 כדי לבדוק אם המיקום שהתקבל נמצא בתוך הפוליגון שהוגדר מראש. בדוגמה הבאה נעשה שימוש בפוליגון המוגדר מראש, שמייצג את הגדרת הגבול הגיאוגרפית, אבל בפועל יכול להיות שתשתמשו בכמה פוליגונים ותצטרכו לצרף לולאה.

גישה חלופית

המסמך הזה מתמקד באפליקציה שפונה ללקוחות, שבודקת אם קיימת פריצה לגבולות וירטואליים (פוליגון). עם זאת, יש תרחישים שבהם כדאי לבצע בדיקות כאלה בקצה העורפי.

כלומר, האפליקציה תדווח על עדכוני מיקום לקצה עורפי, ואז הקצה העורפי יבדוק אם הרכב חצה פוליגון מסוים, כך שלא תהיה תלות באימות של אפליקציית הלקוח.

פתרון אפשרי הוא:

[Execution Environment] ארכיטקטורה של גיאופינינג בצד השרת

ארכיטקטורה לדוגמה שמדגימה גישה של צד השרת לגבולות וירטואליים.

פתרון בצד השרת
פתרון בצד השרת

  1. אפליקציית הנהג/ת באמצעות Driver SDK שולחת עדכוני מיקום ל-Fleet Engine. עדכוני מיקום וניווט בתוך האפליקציה מתבצעים באמצעות Navigation SDK.
  2. המערכת של Fleet Engine מעבירה את העדכונים האלה ל-Cloud Logging או ל-Pub/Sub.
  3. הקצה העורפי אוסף את אותות המיקום האלה.
  4. אזורי הגדרה אישית מאוחסנים ב-BigQuery לצורך ניתוח בקצה העורפי.
  5. כשהגבול הווירטואלי מופעל, ההתראות נשלחות לאפליקציית הנהג.

בארכיטקטורה הזו נעשה שימוש ב-Driver SDK וב-Fleet Engine. Fleet Engine יכול לפרסם עדכוני PubSub וליצור רשומות ביומן ב-Cloud Logging. בשני המקרים, אפשר לאחזר את מיקום הרכב.

לאחר מכן, הקצה העורפי יכול לעקוב אחרי התור של PubSub או לקרוא יומנים ולחפש עדכונים לגבי הרכב. לאחר מכן, בכל פעם שמתרחש עדכון (או כל כמה שניות או דקות, בכפוף לחשיבות של העדכון הזה), הקצה העורפי עשוי להפעיל פונקציות GIS של BigQuery כדי לקבוע אם רכב מסוים נמצא בתוך גבולות וירטואליים או מחוץ להם. במקרה של פריצת גבולות וירטואליים, הקצה העורפי יכול לפעול ולהפעיל צינורות עיבוד נתונים פנימיים או תהליכי עבודה רלוונטיים אחרים.

סיכום

גבולות וירטואליים הם כלי עוצמתי שיכול לשמש למטרות שונות. עסקים יכולים להשתמש בגיאו-פיינט כדי לטרגט משתמשי קצה עם מודעות ומבצעים רלוונטיים, לספק שירותים מבוססי-מיקום ולשפר את האבטחה והבטיחות.

ה-Navigation SDK מספק פונקציות שימושיות של האזנה לאירועים שיכולים לזהות רגעים חשובים רבים במהלך המסע. חברות בדרך כלל דורשות גבולות וירטואליים מותאמים אישית לתרחישים לדוגמה ספציפיים. במסמך הזה הדגמנו איך לעשות את זה, אבל יש אינסוף אפשרויות. אנחנו מחכים לראות מה תייצרו.

הפעולות הבאות

הצעה לקריאה נוספת: