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

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

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

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

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

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

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

היקף

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

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

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

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

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

פונקציות מסוג listener

ב-SDK של הניווט יש מאזינים רבים שבהם תוכל להשתמש. הנה כמה דוגמאות:

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

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

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

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

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

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

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

הגדרת יחסי תלות עבור כלי Android-מפות Google

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

יש להגדיר את הפוליגונים במהלך יצירת ה-Fragment או הפעילות. למשל:

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
}

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

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

גישה חלופית

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

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

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

[סביבת ביצוע] ארכיטקטורה של גבולות וירטואליים בצד השרת

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

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

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

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

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

סיכום

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

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

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

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