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

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

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

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

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

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

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

ขอบเขต

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

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

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

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

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

Listener

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

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

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

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

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

แผนภาพการทำงาน
แผนภาพฟังก์ชันการทำงาน

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

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

กำหนดค่า Dependencies สำหรับ 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 กับไฟล์ create.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
}

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

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

เมื่อใช้ Android-Maps-Utils คุณจะใช้ 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 เครื่องมือจัดการฟลีตสามารถส่งการอัปเดต PubSub และสร้างรายการบันทึกใน Cloud Logging คุณจะเรียกดูตำแหน่งของยานพาหนะได้ทั้งใน 2 กรณี

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

บทสรุป

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

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

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

แหล่งข้อมูลอื่นๆ ที่แนะนํา