ทริกเกอร์เขตพื้นที่เสมือนฝั่งไคลเอ็นต์เพื่อติดตามเนื้อหาบนอุปกรณ์เคลื่อนที่ด้วย Nav SDK

เอกสารนี้อธิบายว่าการกำหนดขอบเขตเสมือนฝั่งไคลเอ็นต์คืออะไร เมื่อใดควรใช้ และวิธีนำไปใช้กับกรณีการใช้งานในแอปพลิเคชันบนอุปกรณ์เคลื่อนที่ นอกจากนี้ยังแสดงวิธีใช้ตัวอย่างใน Android โดยใช้ Google Navigation SDK

Nav SDK ที่มีการตรวจหา Geofence
Nav SDK พร้อมการตรวจหาขอบเขตเสมือน

บริษัทต่างๆ มักต้องการทราบเมื่ออุปกรณ์เคลื่อนที่เข้าหรือออกจากพื้นที่หนึ่งๆ ซึ่งทำได้โดยการกำหนดขอบเขตทางภูมิศาสตร์เสมือนหรือขอบเขตเสมือนไว้ เพื่อให้ซอฟต์แวร์ทริกเกอร์เหตุการณ์เมื่ออุปกรณ์ข้ามขอบเขต

การทำความเข้าใจว่ายานพาหนะหนึ่งๆ ข้ามขอบเขตเมื่อใดมีความสำคัญต่อกรณีการใช้งานหลายกรณี เช่น

  • การมีส่วนร่วมของลูกค้า: ธุรกิจสามารถใช้การกำหนดขอบเขตเสมือนเพื่อส่งการแจ้งเตือนแบบพุชไปยังผู้ใช้ปลายทางเกี่ยวกับข้อเสนอพิเศษ กิจกรรม หรือผลิตภัณฑ์ใหม่
  • ความปลอดภัย: ธุรกิจสามารถใช้การกำหนดขอบเขตเสมือนเพื่อสร้างขอบเขตเสมือนรอบๆ พื้นที่ที่ละเอียดอ่อน เช่น ศูนย์ข้อมูลหรือคลังสินค้า และแจ้งเตือนเจ้าหน้าที่รักษาความปลอดภัยหากมีคนเข้าหรือออกจากพื้นที่
  • การขนส่ง: ธุรกิจสามารถใช้การกำหนดขอบเขตเสมือนเพื่อติดตามตำแหน่งของยานพาหนะ รวมถึงเพิ่มประสิทธิภาพเส้นทางและกำหนดการ

ดังนั้น คุณจึงต้องทราบวิธีแสดงโซน (รูปหลายเหลี่ยม) เหล่านั้นภายในแอปที่ให้บริการแก่ลูกค้า โดยแอปนี้ควรติดตามตำแหน่งของอุปกรณ์และตรวจสอบว่าอุปกรณ์ละเมิดขอบเขตเสมือนหนึ่งๆ หรือไม่

ขอบเขต

เอกสารนี้มุ่งเน้นที่การใช้การกำหนดขอบเขตเสมือนฝั่งไคลเอ็นต์ ซึ่งหมายความว่าแอปไคลเอ็นต์ต้องมีสิ่งต่อไปนี้

  1. รูปหลายเหลี่ยมที่ต้องตรวจสอบการละเมิด
  2. ตำแหน่งแบบเรียลไทม์ของผู้ใช้
  3. ตรรกะในการตรวจสอบว่าตำแหน่งปัจจุบันอยู่ภายในหรือภายนอกรูปหลายเหลี่ยม

คู่มือนี้มีตัวอย่างใน Android แต่ก็มีวิธีที่เทียบเท่ากันในการดำเนินการนี้ใน iOS บริการตำแหน่งของ Android มีการใช้งานในตัวสำหรับการกำหนดขอบเขตเสมือนแบบวงกลม ซึ่งดูได้ที่นี่ ที่นี่ โค้ดอ้างอิงและคำอธิบายด้านล่างเป็นจุดเริ่มต้นสำหรับการใช้งานที่ซับซ้อนมากขึ้น

Navigation SDK เป็นไลบรารี Android / iOS แบบเนทีฟที่เพิ่มลงในแอปของคนขับ โดยมีหน้าที่ดังนี้

  • รับตำแหน่งที่ปรับให้ตรงกับถนนจากแอปที่เรียกใช้ ซึ่งมีความแม่นยำมากกว่า FusedLocationProvider (FLP) ของ Android เนื่องจากใช้เครือข่ายถนนของ Google เพื่อปรับตำแหน่งให้ตรงกับส่วนของถนนที่ใกล้ที่สุด ซึ่งทำให้เวลาถึงโดยประมาณมีความแม่นยำมากขึ้น รวมถึงข้อมูลอื่นๆ จาก FLP
  • ประสบการณ์การนำทางแบบเลี้ยวต่อเลี้ยว ซึ่งช่วยให้คนขับเดินทางจากจุด A ไปยังจุด B ได้อย่างมีประสิทธิภาพ โดยพิจารณาจากการจราจรแบบเรียลไทม์และข้อจำกัดอื่นๆ ของเส้นทาง
  • ทริกเกอร์เหตุการณ์ผ่าน Listener เหตุการณ์และการเรียกกลับที่ลงทะเบียนไว้

Listener

Navigation SDK มี Listener มากมายที่คุณใช้ได้ ตัวอย่างเช่น

  • การเปลี่ยนแปลงตำแหน่งผ่านผู้ให้บริการ RoadSnappedLocation
  • เหตุการณ์เปลี่ยนเส้นทาง (ผู้ใช้เลี้ยวผิดพลาด เช่น ไม่ได้เลี้ยวกลับรถ ไม่ได้เลี้ยวซ้าย ฯลฯ และเบี่ยงเบนจากเส้นทางที่แนะนำ) ผ่าน ReroutingListener
  • เหตุการณ์ถึงจุดหมาย (ผู้ใช้ถึงจุดหมายที่วางแผนไว้) ผ่าน ArrivalListener
  • เหตุการณ์ระยะทางที่เหลือและเวลาถึงโดยประมาณ (รับการแจ้งเตือนเมื่อคนขับกำลังจะถึงจุดหมายโดยอิงตามระยะทางเป็นเมตร และรับการแจ้งเตือนเมื่อคนขับกำลังจะถึงจุดหมายโดยอิงตามเวลา) ทั้ง 2 อย่างนี้ใช้ได้ผ่าน .RemainingTimeOrDistanceChangedListener

ในคู่มือนี้ เราจะใช้เฉพาะ RoadSnappedLocationProvider และ LocationListener ของ RoadSnappedLocationProvider

โซลูชันการกำหนดขอบเขตเสมือนฝั่งไคลเอ็นต์

ตอนนี้เรามาดูขั้นตอนการสร้างความสามารถในการกำหนดขอบเขตเสมือนฝั่งไคลเอ็นต์กัน ในตัวอย่างด้านล่าง เรามี Navigation SDK ที่ทำงานในโหมดเลี้ยวต่อเลี้ยว และรูปหลายเหลี่ยมที่กำหนดไว้ในเส้นทางซึ่งแสดงถึงขอบเขตเสมือน

แผนภาพการทำงาน
แผนภาพการทำงาน

  1. ระบบจะจัดเก็บขอบเขตเสมือนไว้ใน BigQuery และแบ็กเอนด์จะดึงข้อมูลขอบเขตเสมือนเหล่านั้น
  2. แบ็กเอนด์จะส่งขอบเขตเสมือนไปยังแอปของคนขับเป็นระยะ
  3. คนขับนำทางและแอปของคนขับจะตรวจสอบขอบเขตเสมือนเพื่อหาทริกเกอร์เป็นประจำ
  4. แอปของคนขับจะแจ้งให้แบ็กเอนด์ทราบถึงเหตุการณ์ทริกเกอร์เพื่อให้แบ็กเอนด์ดำเนินการได้

เมื่อยานพาหนะเคลื่อนที่ไปตามเส้นทาง แอปจะตรวจสอบเป็นประจำว่ามีการละเมิดรูปหลายเหลี่ยมหรือไม่ เมื่อแอปตรวจพบว่ายานพาหนะข้ามขอบเขตเสมือนแล้ว ระบบจะแสดงข้อความใน UI ว่า มีการละเมิดขอบเขตเสมือน

กำหนดค่าทรัพยากร Dependency สำหรับ Android-Maps-Utils

โซลูชันนี้ใช้ Android-Maps-Utils ซึ่งเป็นไลบรารีโอเพนซอร์สที่มีเครื่องมืออรรถประโยชน์ที่ใช้ได้กับแอปพลิเคชันที่หลากหลายซึ่งใช้ Google Maps Android API

ไลบรารีนี้เป็นแบบสาธารณะและโฮสต์อยู่ใน 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 ด้วย เนื่องจากเราใช้ `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 หรือ Activity เช่น

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
}

ฟังการอัปเดตตำแหน่ง

หลังจากกำหนดขอบเขตเสมือนแล้ว คุณเพียงแค่สร้าง Listener การอัปเดตตำแหน่งเพื่อสมัครรับข้อมูลเหตุการณ์ที่กล่าวถึงข้างต้นใน 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) {
   }
};

จากนั้นคุณสามารถใช้ PolyUtil.containsLocation กับ Android-Maps-Utils เพื่อตรวจสอบว่าตำแหน่งที่ได้รับอยู่ภายในรูปหลายเหลี่ยมที่กำหนดไว้ล่วงหน้าหรือไม่ ในตัวอย่างด้านล่าง เราใช้รูปหลายเหลี่ยมที่กำหนดไว้ล่วงหน้าซึ่งแสดงถึงขอบเขตเสมือน แต่ในทางปฏิบัติ คุณอาจมีรูปหลายเหลี่ยมหลายรูปและต้องใช้ลูป

แนวทางอื่น

เอกสารนี้มุ่งเน้นที่แอปพลิเคชันที่ให้บริการแก่ลูกค้าซึ่งตรวจสอบการละเมิดขอบเขตเสมือน (รูปหลายเหลี่ยม) ที่กำหนดเอง อย่างไรก็ตาม คุณอาจต้องการทำการตรวจสอบดังกล่าวในแบ็กเอนด์ในบางสถานการณ์

ซึ่งหมายความว่าแอปจะรายงานการอัปเดตตำแหน่งไปยังแบ็กเอนด์ จากนั้นแบ็กเอนด์จะตรวจสอบว่ายานพาหนะละเมิดรูปหลายเหลี่ยมหนึ่งๆ หรือไม่ จึงไม่ขึ้นอยู่กับแอปไคลเอ็นต์ในการตรวจสอบ

โซลูชันที่เป็นไปได้มีดังนี้

[สภาพแวดล้อมการดำเนินการ] สถาปัตยกรรมการกำหนดขอบเขตเสมือนฝั่งเซิร์ฟเวอร์

ตัวอย่างสถาปัตยกรรมที่แสดงแนวทางฝั่งเซิร์ฟเวอร์ในการกำหนดขอบเขตเสมือน

โซลูชันฝั่งเซิร์ฟเวอร์
โซลูชันฝั่งเซิร์ฟเวอร์

  1. แอปของคนขับจะส่งการอัปเดตตำแหน่งไปยัง Fleet Engine โดยใช้ Driver SDK การอัปเดตตำแหน่งและการนำทางในแอปเกิดขึ้นผ่าน Navigation SDK
  2. Fleet Engine จะส่งออกการอัปเดตเหล่านั้นไปยัง Cloud Logging หรือ Pub/Sub
  3. แบ็กเอนด์จะรวบรวมสัญญาณตำแหน่งเหล่านั้น
  4. ระบบจะจัดเก็บขอบเขตเสมือนไว้ใน BigQuery เพื่อให้แบ็กเอนด์วิเคราะห์
  5. เมื่อมีการทริกเกอร์ขอบเขตเสมือน ระบบจะส่งการแจ้งเตือนไปยังแอปของคนขับ

ในสถาปัตยกรรมนี้ เราจะใช้ Driver SDK และ Fleet Engine Fleet Engine สามารถส่งการอัปเดต PubSub และสร้างรายการบันทึกใน Cloud Logging ทั้ง 2 กรณีนี้สามารถดึงข้อมูลตำแหน่งของยานพาหนะได้

จากนั้นแบ็กเอนด์จะตรวจสอบคิว PubSub หรืออ่านบันทึกและดูการอัปเดตยานพาหนะ จากนั้นเมื่อมีการอัปเดต (หรือทุกๆ 2-3 วินาทีหรือทุกๆ 2-3 นาที ทั้งนี้ขึ้นอยู่กับความสำคัญ) แบ็กเอนด์จะเรียกใช้ฟังก์ชัน BigQuery GIS เพื่อพิจารณาว่ายานพาหนะหนึ่งๆ อยู่ภายในหรือภายนอกขอบเขตเสมือน ในกรณีที่มีการละเมิดขอบเขตเสมือนอย่างน้อย 1 รายการ แบ็กเอนด์จะดำเนินการและทริกเกอร์ไปป์ไลน์ภายในหรือเวิร์กโฟลว์อื่นๆ ที่เกี่ยวข้อง

บทสรุป

การกำหนดขอบเขตเสมือนเป็นเครื่องมือที่มีประสิทธิภาพซึ่งใช้ได้กับวัตถุประสงค์ต่างๆ ธุรกิจสามารถใช้การกำหนดขอบเขตเสมือนเพื่อกำหนดเป้าหมายผู้ใช้ปลายทางด้วยโฆษณาและโปรโมชันที่เกี่ยวข้อง ให้บริการตามตำแหน่ง รวมถึงปรับปรุงความปลอดภัย

Navigation SDK มี Listener เหตุการณ์ที่เป็นประโยชน์ซึ่งตรวจจับช่วงเวลาสำคัญต่างๆ ระหว่างการเดินทางได้ บริษัทต่างๆ มักต้องการขอบเขตเสมือนที่กำหนดเองสำหรับกรณีการใช้งานที่เฉพาะเจาะจง ในเอกสารนี้ เราได้แสดงวิธีดำเนินการนี้ แต่ความเป็นไปได้นั้นไม่มีที่สิ้นสุด เราหวังว่าจะได้เห็นผลงานของคุณ

การดำเนินการถัดไป

อ่านเพิ่มเติมที่แนะนำ