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

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

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

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

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

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

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

היקף

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

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

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

SDK הניווט הוא ספרייה מובנית ב-Android או ב-iOS שנוספה לאפליקציית מנהלי ההתקנים. היא אחראית לדברים הבאים:

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

מאזינים

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

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

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

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

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

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

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

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

הגדרת יחסי תלות ל-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) {
   }
};

כשמשתמשים במפות Google עם Android, אפשר להשתמש בPolyUtil.containsLocation כדי לבדוק אם המיקום שהתקבל נמצא בתוך הפוליגון שהוגדר מראש. בדוגמה הבאה נשתמש בפוליגון המוגדר מראש, שמייצג את הגבול הגיאוגרפי, אבל בפועל ייתכן שיש לכם כמה פוליגונים ונדרשת לולאה.

גישה חלופית

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

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

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

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

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

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

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

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

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

סיכום

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

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

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

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