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

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

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

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

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

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

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

ขอบเขต

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

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

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

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

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

Listener

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

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

ในคู่มือนี้ เราใช้เฉพาะผู้ให้บริการ RoadSnappedLocation และ LocationListener เท่านั้น

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

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

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

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

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

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

โซลูชันนี้ใช้ Android Maps-Utills ซึ่งเป็นไลบรารีโอเพนซอร์สที่มียูทิลิตีที่เป็นประโยชน์สำหรับแอปพลิเคชันที่หลากหลายโดยใช้ 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 ให้รวมมันไว้ โปรดทราบว่าไฟล์ create.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.PolyUtill ในไฟล์ 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 คุณจะสามารถใช้ PolyUtil.containsLocation เพื่อตรวจสอบว่าตำแหน่งที่ได้รับอยู่ภายในรูปหลายเหลี่ยมที่กำหนดไว้ล่วงหน้าหรือไม่ ในตัวอย่างด้านล่างมีการใช้รูปหลายเหลี่ยมที่กำหนดไว้ล่วงหน้าซึ่งแสดงเขตพื้นที่เสมือน แต่ในทางปฏิบัติอาจมีรูปหลายเหลี่ยมหลายรูปและจำเป็นต้องใช้ลูป

แนวทางทางเลือก

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

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

วิธีแก้ไขที่เป็นไปได้มีดังนี้

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

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

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

  1. แอปไดรเวอร์ที่ใช้ Driver SDK จะส่งการอัปเดตตำแหน่งไปยัง Fleet Engine การอัปเดตตำแหน่งและการนำทางในแอปจะเกิดขึ้นผ่าน 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 วินาที นาที โดยขึ้นอยู่กับความสําคัญของการอัปเดต) แบ็กเอนด์อาจเรียกใช้ฟังก์ชัน GIS ของ BigQuery เพื่อระบุว่ายานพาหนะนั้นอยู่ภายในหรือนอกเขตพื้นที่เสมือน ในกรณีที่มีการละเมิดเขตพื้นที่เสมือนอย่างน้อย 1 เขต แบ็กเอนด์จะดําเนินการและทริกเกอร์ไปป์ไลน์ภายในหรือเวิร์กโฟลว์อื่นๆ ที่เกี่ยวข้องได้

บทสรุป

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

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

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

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