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

บริษัทต่างๆ มักต้องการทราบเมื่ออุปกรณ์เคลื่อนที่เข้าหรือออกจากพื้นที่หนึ่งๆ ซึ่งทำได้โดยการกำหนดขอบเขตทางภูมิศาสตร์เสมือนหรือรั้วภูมิศาสตร์ เพื่อให้ซอฟต์แวร์ทริกเกอร์เหตุการณ์เมื่ออุปกรณ์ข้ามขอบเขต
การทำความเข้าใจเมื่อยานพาหนะบางคันข้ามขอบเขตเป็นสิ่งสำคัญสำหรับกรณีการใช้งานต่างๆ เช่น
- การมีส่วนร่วมของลูกค้า: ธุรกิจสามารถใช้ Geofencing เพื่อส่งข้อความ Push ไปยังผู้ใช้ปลายทางเกี่ยวกับข้อเสนอพิเศษ กิจกรรม หรือผลิตภัณฑ์ใหม่
- ความปลอดภัย: ธุรกิจสามารถใช้รั้วเสมือนเพื่อสร้างขอบเขตเสมือนรอบพื้นที่ที่ละเอียดอ่อน เช่น ศูนย์ข้อมูลหรือคลังสินค้า และแจ้งเตือนเจ้าหน้าที่รักษาความปลอดภัยหากมีผู้เข้าหรือออกจากพื้นที่
- การขนส่ง: ธุรกิจสามารถใช้รั้วภูมิศาสตร์เพื่อติดตามตำแหน่งของยานพาหนะและเพิ่มประสิทธิภาพเส้นทางและตารางเวลา
ดังนั้นคุณจึงควรทราบวิธีแสดงโซน (รูปหลายเหลี่ยม) เหล่านั้นภายในแอปที่หันหน้าไปทางไคลเอ็นต์ แอปนี้ควรติดตามตำแหน่งของอุปกรณ์และตรวจสอบว่าละเมิดรั้วภูมิศาสตร์ที่กำหนดหรือไม่
ขอบเขต
เอกสารนี้มุ่งเน้นที่การติดตั้งใช้งาน Geofencing ฝั่งไคลเอ็นต์ ซึ่งหมายความว่าแอปไคลเอ็นต์ต้องมีสิ่งต่อไปนี้
- รูปหลายเหลี่ยมที่ต้องตรวจสอบการละเมิด
- ตำแหน่งแบบเรียลไทม์ของผู้ใช้
- ตรรกะในการตรวจสอบว่าตำแหน่งปัจจุบันอยู่ภายในหรือภายนอกรูปหลายเหลี่ยม
คู่มือนี้มีตัวอย่างใน Android แต่ก็มีวิธีที่เทียบเท่ากันในการดำเนินการนี้ใน iOS บริการตำแหน่งของ Android มีการติดตั้งใช้งานรั้วภูมิศาสตร์แบบวงกลมในตัว ซึ่งดูได้ที่นี่ รหัสอ้างอิงและคำอธิบายด้านล่างเป็นจุดเริ่มต้นสำหรับการติดตั้งใช้งานที่ซับซ้อนยิ่งขึ้น
Navigation SDK
Navigation SDK เป็นไลบรารี Android / iOS แบบเนทีฟที่เพิ่มลงในแอปคนขับ โดยมีหน้าที่ดังนี้
- การรับตำแหน่งที่สแนปกับถนนจากแอปที่เรียกใช้ ซึ่งมีความแม่นยำมากกว่า FusedLocationProvider (FLP) ของ Android เนื่องจากใช้เครือข่ายถนนของ Google เพื่อปรับตำแหน่งให้ตรงกับส่วนของถนนที่ใกล้ที่สุด ซึ่งจะทำให้เวลาถึงโดยประมาณแม่นยำมากขึ้น รวมถึงข้อมูลอื่นๆ จาก FLP
- ประสบการณ์การนำทางแบบเลี้ยวต่อเลี้ยวที่ช่วยให้ผู้ขับขี่เดินทางจากจุด ก. ไปยังจุด ข. ได้อย่างมีประสิทธิภาพ โดยคำนึงถึงสภาพการจราจรแบบเรียลไทม์และข้อจำกัดอื่นๆ ของเส้นทาง
- ทริกเกอร์เหตุการณ์ผ่าน Listener เหตุการณ์และ Callback ที่ลงทะเบียน
ผู้ฟัง
Navigation SDK มี Listener มากมายที่คุณใช้ได้ ตัวอย่างเช่น
- การเปลี่ยนแปลงตำแหน่งผ่านผู้ให้บริการ RoadSnappedLocation
- เปลี่ยนเส้นทางกิจกรรม (ผู้ใช้เลี้ยวซ้าย เลี้ยวขวา ฯลฯ และเบี่ยงเบนจากเส้นทางที่แนะนำ) ผ่าน ReroutingListener
- เหตุการณ์การมาถึง (ผู้ใช้มาถึงจุดหมายที่วางแผนไว้) ผ่าน ArrivalListener
- เหตุการณ์ระยะทางที่เหลือและเวลาที่คาดว่าจะถึง (รับการแจ้งเตือนเมื่อคนขับกำลังจะถึงจุดหมาย - อิงตามระยะทาง รับการแจ้งเตือนเมื่อคนขับกำลังจะถึงจุดหมาย - อิงตามเวลา) ทั้ง 2 อย่างพร้อมใช้งานผ่าน RemainingTimeOrDistanceChangedListener
ในคู่มือนี้จะใช้เฉพาะ RoadSnappedLocationProvider และ LocationListener
โซลูชันการกำหนดรั้วภูมิศาสตร์ฝั่งไคลเอ็นต์
ตอนนี้มาดูขั้นตอนการสร้างความสามารถในการกำหนดขอบเขตทางภูมิศาสตร์ฝั่งไคลเอ็นต์กัน ในตัวอย่างด้านล่าง เรามี Navigation SDK ที่ทำงานในโหมดการนำทางแบบเลี้ยวต่อเลี้ยว และรูปหลายเหลี่ยมที่กำหนดไว้ในเส้นทางซึ่งแสดงถึงรั้วภูมิศาสตร์ของเรา
- ระบบจะจัดเก็บรั้วภูมิศาสตร์ไว้ใน BigQuery และดึงข้อมูลโดยแบ็กเอนด์
- แบ็กเอนด์จะพุชรั้วภูมิศาสตร์ไปยังแอปไดรฟ์เป็นระยะๆ
- คนขับจะนำทางและแอปคนขับจะตรวจสอบรั้วภูมิศาสตร์เป็นประจำเพื่อหาทริกเกอร์
- แอปคนขับจะแจ้งเตือนเหตุการณ์ทริกเกอร์ไปยังแบ็กเอนด์เพื่อให้ดำเนินการได้
ขณะที่รถเคลื่อนที่ไปตามเส้นทาง แอปจะตรวจสอบเป็นประจำว่ามีการละเมิดรูปหลายเหลี่ยมหรือไม่ เมื่อแอปตรวจพบว่าได้ข้ามเขตพื้นที่เสมือนแล้ว ข้อความจะแสดงใน UI โดยระบุว่าละเมิดเขตพื้นที่เสมือน
กำหนดค่าการขึ้นต่อกันสำหรับ 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
จะได้รับการนำเข้าด้วย เนื่องจากมีการใช้ข้อมูลต่อไปนี้เพื่อแสดงรูปหลายเหลี่ยม
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
}
ฟังการอัปเดตตำแหน่ง
หลังจากกำหนด Geofence แล้ว คุณเพียงแค่ต้องสร้างเครื่องมือฟังการอัปเดตตำแหน่งเพื่อติดตามเหตุการณ์ที่กล่าวถึงข้างต้นใน 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
เพื่อตรวจสอบว่าตำแหน่งที่ได้รับอยู่ภายในรูปหลายเหลี่ยมที่กำหนดไว้ล่วงหน้าหรือไม่ ในตัวอย่างด้านล่างนี้ เราใช้รูปหลายเหลี่ยมที่กำหนดไว้ล่วงหน้าซึ่งแสดงถึงรั้วภูมิศาสตร์ แต่ในทางปฏิบัติ คุณอาจมีรูปหลายเหลี่ยมหลายรูปและต้องใช้ลูป
แนวทางอื่น
เอกสารนี้มุ่งเน้นที่แอปพลิเคชันที่หันหน้าไปทางไคลเอ็นต์ซึ่งตรวจสอบการละเมิดรั้วภูมิศาสตร์ (รูปหลายเหลี่ยม) ที่กำหนดเอง อย่างไรก็ตาม มีบางสถานการณ์ที่คุณอาจต้องการตรวจสอบดังกล่าวในแบ็กเอนด์
ซึ่งหมายความว่าแอปจะรายงานการอัปเดตตำแหน่งไปยังแบ็กเอนด์ และแบ็กเอนด์จะตรวจสอบว่ายานพาหนะละเมิดรูปหลายเหลี่ยมที่กำหนดหรือไม่ จึงไม่ต้องพึ่งพาแอปไคลเอ็นต์ในการตรวจสอบ
วิธีแก้ปัญหาที่ทำได้มีดังนี้
สถาปัตยกรรม Geofencing ฝั่งเซิร์ฟเวอร์ [สภาพแวดล้อมการดำเนินการ]
ตัวอย่างสถาปัตยกรรมที่แสดงแนวทางฝั่งเซิร์ฟเวอร์ในการกำหนดขอบเขตทางภูมิศาสตร์

- แอปคนขับจะใช้ Driver SDK เพื่อส่งข้อมูลอัปเดตตำแหน่งไปยัง Fleet Engine การอัปเดตตำแหน่งและการนำทางในแอปจะเกิดขึ้นผ่าน Navigation SDK
- Fleet Engine จะส่งออกข้อมูลอัปเดตเหล่านั้นไปยัง Cloud Logging หรือ Pub/Sub
- แบ็กเอนด์จะรวบรวมสัญญาณตำแหน่งเหล่านั้น
- ระบบจะจัดเก็บรั้วภูมิศาสตร์ใน BigQuery เพื่อให้แบ็กเอนด์วิเคราะห์
- เมื่อมีการเรียกใช้รั้วภูมิศาสตร์ ระบบจะส่งการแจ้งเตือนไปยังแอปคนขับ
ในสถาปัตยกรรมนี้จะใช้ Driver SDK และ Fleet Engine Fleet Engine สามารถส่งการอัปเดต PubSub และสร้างรายการบันทึกใน Cloud Logging ได้ ในทั้ง 2 กรณี คุณจะดึงข้อมูลตำแหน่งของยานพาหนะได้
จากนั้นแบ็กเอนด์จะตรวจสอบคิว PubSub หรืออ่านบันทึกและดูการอัปเดตยานพาหนะ จากนั้นเมื่อใดก็ตามที่มีการอัปเดต (หรือทุกๆ 2-3 วินาทีหรือนาที ขึ้นอยู่กับความสำคัญ) แบ็กเอนด์จะเรียกใช้ฟังก์ชัน BigQuery GIS เพื่อพิจารณาว่ายานพาหนะที่ระบุอยู่ภายในหรือภายนอกรั้วภูมิศาสตร์ ในกรณีที่มีการละเมิดรั้วภูมิศาสตร์อย่างน้อย 1 รายการ แบ็กเอนด์จะดำเนินการและทริกเกอร์ไปป์ไลน์ภายในหรือเวิร์กโฟลว์อื่นๆ ที่เกี่ยวข้อง
บทสรุป
รั้วภูมิศาสตร์เป็นเครื่องมือที่มีประสิทธิภาพซึ่งใช้ได้กับวัตถุประสงค์ที่หลากหลาย ธุรกิจสามารถใช้ Geofencing เพื่อกำหนดเป้าหมายผู้ใช้ปลายทางด้วยโฆษณาและโปรโมชันที่เกี่ยวข้อง ให้บริการตามตำแหน่ง และปรับปรุงความปลอดภัย
Navigation SDK มีเครื่องมือฟังเหตุการณ์ที่มีประโยชน์ซึ่งตรวจจับช่วงเวลาสำคัญหลายอย่างระหว่างการเดินทางได้ บริษัทต่างๆ มักกำหนดให้ต้องมีรั้วภูมิศาสตร์ที่กำหนดเองสำหรับกรณีการใช้งานที่เฉพาะเจาะจง ในเอกสารนี้ เราได้แสดงวิธีบรรลุเป้าหมายนี้ แต่ความเป็นไปได้นั้นมีไม่สิ้นสุด เราหวังว่าจะได้เห็นผลงานของคุณ
การดำเนินการถัดไป
- ดูวิดีโอสัมมนาทางเว็บสำรวจ เรียนรู้ และรับแรงบันดาลใจจากสิ่งที่เป็นไปได้ด้วย Google Maps Platform
อ่านเพิ่มเติมที่แนะนำ