תכנון מסלול

לפעמים כדאי לתכנן את המסלול שהאפליקציה מספקת למשתמשים. שימוש בטוקן מסלול מ-Routes API, מ-Routes Preferred API או מ-Route Optimization API יכול לעזור לכם לציין שני דברים לגבי המסלול המתוכנן:

  • קו פוליגוני למסלול

  • מטרות המסלול

לדוגמה, אלה כמה יעדי ניתוב אפשריים:

  • קיצור זמן האספקה: עסק שמספק משלוחי אוכל יכול לקצר את זמן האספקה.

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

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

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

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

מידע נוסף על תכנון מסלול באמצעות אסימון מסלול זמין במאמרים בקשת אסימון מסלול ב-Routes API ובמאמר Transition Polylines and Route Tokens ב-Route Optimization API.

למה כדאי להשתמש בטוקן מסלול ליעדי מסלול

באמצעות אסימון מסלול מ-Routes API,‏ Routes Preferred API או Route Optimization API, יש לכם יותר שליטה על המסלול שמוצג:

  • תכנון מסלול מראש כדי שמערכת Navigation SDK תוכל להשתמש בו כשזה אפשרי.

  • איך בוחרים את המסלול הכי טוב לשימוש ב-Navigation SDK אם מבקשים אסימוני מסלול כשיוצרים מסלולים ב-Routes API, מקבלים אסימון מסלול לכל מסלול שנוצר. אחר כך תוכלו לבחור את הטוקן של המסלול שבו אתם רוצים להשתמש כשאתם מעבירים אותו ל-Navigation SDK.

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

  • מגדירים יעדים מתקדמים יותר למסלול, כמו מסלול ידידותי לסביבה או המסלול הקצר ביותר.

איך פועלים אסימוני מסלולים

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

זה מה שקורה כשמבקשים אסימון מסלול ומשתמשים בו:

  1. ‫Routes API,‏ Routes Preferred API או Route Optimization API מחזירים אסימון מסלול מוצפן שכולל את קו המתאר של המסלול ואת יעדי המסלול.

  2. מעבירים את אסימון המסלול אל Navigation SDK.

  3. ‫Navigation SDK מאחזר את המסלול, או אם המסלול לא זמין בגלל שינויים בתנאים, הוא מאחזר את המסלול התואם הטוב ביותר.

  4. במהלך הנהיגה במסלול, אם יש שינויים בתנועה או בתנאי הדרך, או אם הרכב סוטה מהמסלול המתוכנן, המערכת מנסה להתאים את המסלולים ששונו למסלול הטוב ביותר על סמך יעדי המסלול שמוגדרים בטוקן.

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

למה יכול להיות שלא תצליחו לנסוע בדיוק במסלול המתוכנן

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

תכנון מסלול באמצעות אסימון מסלול

כדי לתכנן מסלול, יוצרים אסימון מסלול ומעבירים אותו אל Navigation SDK, כמו שמתואר בשלבים הבאים:

שלב 1: יוצרים אסימון מסלול באמצעות Routes API,‏ Routes Preferred API או Route Optimization API

  1. שליחת בקשה לטוקן של מסלול באחת מהשיטות הבאות:

    • Routes API: computeRoutes. מידע נוסף על בקשת טוקן של מסלול ב-Routes API זמין במאמרים חישוב מסלול ובקשת טוקן של מסלול.

    • Routes Preferred API: computeCustomRoutes. מידע נוסף על בקשת אסימון מסלול ב-Routes Preferred API זמין במאמר תכנון מסלול.

    • Route Optimization API: optimizeTours או batchOptimizeTours. מידע נוסף על שליחת בקשה לטוקן של מסלול ב-Route Optimization API זמין במאמר Transition Polylines and Route Tokens.

  2. מגדירים בקשה ל-Routes API או ל-Routes Preferred API בהתאם לדרישות לשימוש באסימון מסלול:

    • מגדירים את travel_mode לערך DRIVING או TWO_WHEELER
    • מגדירים את routing_preference לערך TRAFFIC_AWARE או TRAFFIC_AWARE_OPTIMAL
    • אל תשתמשו ב-Via נקודות ציון

שלב 2: מעבירים את אסימון המסלול אל Navigation SDK

  1. מאחסנים את אסימון המסלול: ב-Navigation SDK, מגדירים מחרוזת לאחסון אסימון המסלול. לדוגמה:

    String routeToken = "route token returned by Routes API";

    דוגמה לטוקן מסלול שמוחזר:

    {
    // Other fields
    "routeToken": "CqMBCjoKCJQOor5DHcwiEhBon3XpHXFnVvDeWMwd9PpAGgz6wtnFDKIBrAHTARpCApUDSggAAAAACjcrP3gBEAQaTApKChgKDQoCCAERAAAAAACAZkAR3SQGgZUXdUASEggAEAMQBhATEBIYAkIEGgIIBSIYChZ2VEJiWlBPSkk1aU5wUVRzNTV5d0FRKAEiFQBcJuds-Efh-2QZhOMTtUCCxEVL_g",
    }
    
  2. מעבירים את אסימון המסלול אל Navigation SDK באמצעות השיטה Navigator.setDestinations, ומציינים את אותן נקודות ציון של היעד שבהן השתמשתם כשיצרתם את אסימון המסלול:

    setDestinations(List destinations, CustomRoutesOptions customRoutesOptions, DisplayOptions displayOptions);

    לדוגמה:

    CustomRoutesOptions customRoutesOptions =
          CustomRoutesOptions.builder()
          .setRouteToken(routeToken)
          .setTravelMode(TravelMode.DRIVING)
          .build();

השיטה Navigator.setDestinations מחזירה את סטטוס הבקשה. אם נמצא מסלול ממיקום הרכב ליעד שצוין, הפונקציה מחזירהRouteStatus.OK.

מידע נוסף על השיטה הזו זמין במאמר Navigator.setDestinations.

דוגמה

בדוגמת הקוד הבאה מוצג איך לציין מסלול מתוכנן באמצעות אסימון מסלול.

    ArrayList <Waypoint> destinations = Lists.newArrayList();
    Waypoint waypoint1 =
       Waypoint.builder()
          .setLatLng(10, 20)
          .setTitle("title")
          .setVehicleStopover(true)
          .build();
    destinations.add(waypoint1);
    Waypoint waypoint2 =
       Waypoint.builder()
          .setPlaceId("ChIJYV-J-ziuEmsRIMyoFaMedU4")
          .setTitle("title")
          .setVehicleStopover(true)
           .build()
    destinations.add(waypoint2);

    String routeToken = "route token returned by Routes API";

    CustomRoutesOptions customRoutesOptions =
       CustomRoutesOptions.builder()
          .setRouteToken(routeToken)
          .setTravelMode(TravelMode.DRIVING)
          .build();

    // Existing flow to get a Navigator.
    NavigationApi.getNavigator(...);

    // Existing flow for requesting routes.
    ListenableResultFuture<RouteStatus> routeStatusFuture =
        navigator.setDestinations(destinations, customRoutesOptions);

    // Or with display options.
    DisplayOptions displayOptions = new DisplayOptions();

    ListenableResultFuture<RouteStatus> routeStatusFuture =
        navigator.setDestinations(destinations, customRoutesOptions, displayOptions);

איך פועלת האינטראקציה בין טוקנים של מסלולים לבין Navigation SDK

כך מתבצעת האינטראקציה בין המסלול שנוצר על ידי Navigation SDK לבין המסלול המתוכנן באסימון המסלול:

  • Overrides (החלפה) של כל היעדים שהוגדרו קודם.

  • משתמש במיקום ההתחלתי של הרכב.

  • התאמה לתנאי הדרך והתנועה. למה יכול להיות שלא תהיה התאמה מדויקת בין המסלול המתוכנן לבין המסלול בפועל

  • מתעלם מהאפשרויות הבאות שקשורות לניתוב, כי הן לא נחוצות:

    • avoidsHighways
    • avoidsTolls
    • avoidsFerries
    • licensePlateRestriction
  • עוקבים:

    • אפשרויות שקשורות לציון דרך, כמו העדפה של צד הכביש.

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