Kích hoạt khoanh vùng địa lý phía máy khách để theo dõi nội dung trên thiết bị di động bằng Nav SDK

Tài liệu này mô tả về tính năng khoanh vùng địa lý phía máy khách, thời điểm sử dụng tính năng này và cách áp dụng tính năng này cho các trường hợp sử dụng trong ứng dụng di động. Tài liệu này cũng cho biết cách triển khai ví dụ trên Android bằng SDK điều hướng của Google.

Nav SDK có tính năng phát hiện hàng rào địa lý
SDK điều hướng có tính năng phát hiện khoanh vùng địa lý

Các công ty thường cần biết thời điểm thiết bị di động đi vào hoặc rời khỏi một khu vực cụ thể. Điều này được thực hiện bằng cách duy trì ranh giới địa lý ảo, hay còn gọi là khoanh vùng địa lý, cho phép phần mềm kích hoạt sự kiện khi thiết bị vượt qua ranh giới.

Việc nắm được thời điểm một chiếc xe nhất định đi qua ranh giới là rất quan trọng đối với nhiều trường hợp sử dụng, chẳng hạn như:

  • Tương tác của khách hàng: Doanh nghiệp có thể sử dụng tính năng khoanh vùng địa lý để gửi thông báo đẩy cho người dùng cuối về các ưu đãi đặc biệt, sự kiện hoặc sản phẩm mới.
  • Bảo mật và an toàn: Doanh nghiệp có thể sử dụng tính năng khoanh vùng địa lý để tạo ranh giới ảo xung quanh các khu vực nhạy cảm, chẳng hạn như trung tâm dữ liệu hoặc nhà kho, đồng thời cảnh báo nhân viên bảo mật nếu có người đi vào hoặc rời khỏi khu vực đó.
  • Vận tải: Doanh nghiệp có thể sử dụng tính năng khoanh vùng địa lý để theo dõi vị trí của xe và tối ưu hoá tuyến đường cũng như lịch trình.

Do đó, bạn cần biết cách biểu thị các khu vực đó (đa giác) bên trong ứng dụng dành cho khách hàng. Ứng dụng này phải theo dõi vị trí của thiết bị và kiểm tra xem thiết bị đó có vi phạm một khoanh vùng địa lý nhất định hay không.

Phạm vi

Tài liệu này tập trung vào việc triển khai tính năng khoanh vùng địa lý phía máy khách . Điều đó có nghĩa là ứng dụng phía máy khách phải có:

  1. Các đa giác cần kiểm tra để phát hiện vi phạm;
  2. Vị trí theo thời gian thực của người dùng
  3. Logic để kiểm tra xem vị trí hiện tại có nằm trong hay nằm ngoài bất kỳ đa giác nào hay không.

Hướng dẫn này có các ví dụ trên Android nhưng bạn có thể thực hiện tương tự trên iOS. Dịch vụ vị trí của Android có một cách triển khai tích hợp cho các khoanh vùng địa lý hình tròn mà bạn có thể xem tại đây. Mã tham chiếu và nội dung mô tả bên dưới là điểm xuất phát cho các cách triển khai phức tạp hơn.

Navigation SDK là một thư viện Android / iOS gốc được thêm vào ứng dụng dành cho tài xế. Thư viện này chịu trách nhiệm:

  • Lấy vị trí được điều chỉnh theo đường đi từ ứng dụng đang chạy. Cách này chính xác hơn FusedLocationProvider (FLP) của Android vì cách này sử dụng mạng lưới đường đi của Google để điều chỉnh vị trí theo đoạn đường gần nhất, giúp thời gian đến dự kiến (ETA) chính xác hơn nhiều và các thông tin khác từ FLP.
  • Trải nghiệm từng chặng cho phép tài xế di chuyển hiệu quả từ điểm A đến điểm B, có tính đến tình hình giao thông theo thời gian thực và các hạn chế khác về tuyến đường.
  • Kích hoạt sự kiện thông qua trình nghe sự kiện và lệnh gọi lại đã đăng ký.

Trình nghe

Navigation SDK có nhiều trình nghe mà bạn có thể sử dụng. Sau đây là một vài ví dụ:

  • Thay đổi vị trí thông qua RoadSnappedLocation trình cung cấp.
  • Sự kiện chuyển hướng (người dùng bỏ lỡ lượt quay đầu, rẽ trái, v.v. và đi lệch khỏi tuyến đường được đề xuất) thông qua ReroutingListener.
  • Sự kiện đến (người dùng đến đích đã lên kế hoạch) thông qua ArrivalListener.
  • Sự kiện về khoảng cách còn lại và thời gian đến dự kiến (nhận thông báo khi tài xế sắp đến đích – dựa trên mét, nhận thông báo khi tài xế sắp đến đích – dựa trên thời gian), cả hai đều có sẵn thông qua .RemainingTimeOrDistanceChangedListener

Trong hướng dẫn này, chúng ta chỉ sử dụng RoadSnappedLocationProvider và LocationListener của trình cung cấp này.

Giải pháp khoanh vùng địa lý phía máy khách

Bây giờ, hãy từng bước xây dựng tính năng khoanh vùng địa lý phía máy khách. Trong ví dụ bên dưới, chúng ta có Navigation SDK hoạt động ở chế độ từng bước và một đa giác được xác định trong tuyến đường đại diện cho khoanh vùng địa lý của chúng ta.

Sơ đồ chức năng
Sơ đồ chức năng

  1. Khoanh vùng địa lý được lưu trữ trong BigQuery và được phần phụ trợ của bạn kéo ra.
  2. Phần phụ trợ định kỳ đẩy các khoanh vùng địa lý ra các ứng dụng lái xe.
  3. Tài xế điều hướng và ứng dụng dành cho tài xế thường xuyên kiểm tra các khoanh vùng địa lý để tìm trình kích hoạt.
  4. Ứng dụng dành cho tài xế thông báo cho phần phụ trợ về sự kiện kích hoạt để phần phụ trợ có thể hành động.

Khi xe di chuyển dọc theo tuyến đường, ứng dụng sẽ thường xuyên kiểm tra xem đa giác có bị vi phạm hay không. Khi ứng dụng phát hiện thấy xe đã vượt qua một khoanh vùng địa lý, một thông báo sẽ xuất hiện trên giao diện người dùng với nội dung: Đã vi phạm khoanh vùng địa lý.

Định cấu hình phần phụ thuộc cho Android-Maps-Utils

Giải pháp này sử dụng Android-Maps-Utils, một thư viện nguồn mở chứa các tiện ích hữu ích cho nhiều ứng dụng sử dụng API Android của Google Maps.

Thư viện này ở chế độ công khai và được lưu trữ trên GitHub. Bạn có thể truy cập vào thư viện này tại:

  • Android: https://github.com/googlemaps/android-maps-utils
  • iOS: https://github.com/googlemaps/google-maps-ios-utils

Để đưa thư viện này vào ứng dụng Android (phạm vi của tài liệu này), bạn nên sửa đổi tệp build.gradle để đưa thư viện này vào. Xin lưu ý rằng tệp build.gradle này dành cho mô-đun (ứng dụng) mà bạn đang xây dựng, chứ không phải ở cấp dự án.

dependencies {
   ...
   // Utilities for Maps SDK for Android (requires Google Play Services)
   implementation 'com.google.maps.android:android-maps-utils:2.3.0'
}

Sau đó, sau khi đồng bộ hoá Gradle với tệp build.gradle mới nhất, bạn có thể nhập com.google.maps.android.PolyUtil vào tệp Java:

import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;

Xác định khoanh vùng địa lý

Xin lưu ý rằng ở đây, PolygonOptions cũng đang được nhập. Lý do là vì đây là những gì đang được dùng để biểu thị đa giác:

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);

Như bạn có thể thấy ở trên, ở đây chúng ta đang xác định một đa giác cố định với các cặp toạ độ đã thiết lập trước – (vĩ độ, kinh độ). Tuy nhiên, trong các trường hợp thực tế, những toạ độ và định nghĩa đa giác đó hầu hết sẽ đến từ một điểm cuối phụ trợ và có thể sẽ được tìm nạp từ xa. Điều này có nghĩa là ứng dụng sẽ phải tạo(các) đa giác ngay lập tức.

Để biết thêm thông tin về những nội dung có thể được chỉ định trong PolygonOptions, vui lòng xem tại đây.

Bạn nên xác định(các) đa giác trong quá trình tạo Mảnh hoặc Hoạt động. Ví dụ:

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
}

Nghe thông tin cập nhật về vị trí

Sau khi xác định các khoanh vùng địa lý, bạn chỉ cần tạo một trình nghe thông báo cập nhật vị trí để đăng ký sự kiện đã đề cập ở trên trong Navigation SDK có tên là RoadSnappedLocationProvider. Trình nghe này sẽ trả về vị trí mới nhất của thiết bị.

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) {
   }
};

Sau đó, với Android-Maps-Utils, bạn có thể sử dụng PolyUtil.containsLocation để kiểm tra xem vị trí nhận được có nằm trong đa giác được xác định trước hay không. Trong ví dụ bên dưới, chúng ta sử dụng đa giác được xác định trước (đại diện cho khoanh vùng địa lý), nhưng trong thực tế, bạn có thể có nhiều đa giác và cần có một vòng lặp.

Phương pháp thay thế

Tài liệu này tập trung vào ứng dụng dành cho khách hàng, ứng dụng này kiểm tra xem có vi phạm khoanh vùng địa lý (đa giác) tuỳ chỉnh hay không. Tuy nhiên, có những trường hợp bạn có thể muốn thực hiện các lượt kiểm tra như vậy trên phần phụ trợ.

Điều này có nghĩa là ứng dụng sẽ báo cáo thông tin cập nhật về vị trí cho phần phụ trợ và phần phụ trợ này sau đó sẽ kiểm tra xem xe đó có vi phạm một đa giác nhất định hay không, do đó không phụ thuộc vào ứng dụng phía máy khách để thực hiện quá trình xác thực.

Sau đây là một giải pháp có thể:

[Môi trường thực thi] Cấu trúc khoanh vùng địa lý phía máy chủ

Ví dụ về cấu trúc minh hoạ phương pháp khoanh vùng địa lý phía máy chủ.

Giải pháp phía máy chủ
Giải pháp phía máy chủ

  1. Ứng dụng dành cho tài xế (sử dụng Driver SDK) gửi thông tin cập nhật về vị trí cho Fleet Engine. Thông tin cập nhật về vị trí và tính năng điều hướng trong ứng dụng diễn ra thông qua Navigation SDK.
  2. Fleet Engine xuất những thông tin cập nhật đó sang Cloud Logging hoặc Pub/Sub.
  3. Phần phụ trợ thu thập các tín hiệu vị trí đó.
  4. Khoanh vùng địa lý được lưu trữ trong BigQuery để phần phụ trợ phân tích.
  5. Sau khi kích hoạt khoanh vùng địa lý, hệ thống sẽ gửi cảnh báo đến Ứng dụng dành cho tài xế.

Trong cấu trúc này, chúng ta sử dụng Driver SDK và Fleet Engine. Fleet Engine có thể phát các thông tin cập nhật PubSub và tạo mục nhập nhật ký trong Cloud Logging. Trong cả hai trường hợp, bạn đều có thể truy xuất vị trí của xe.

Sau đó, phần phụ trợ có thể theo dõi hàng đợi PubSub hoặc đọc nhật ký và theo dõi thông tin cập nhật về xe. Sau đó, bất cứ khi nào có thông tin cập nhật (hoặc cứ vài giây, vài phút, tuỳ thuộc vào mức độ quan trọng của thông tin đó), phần phụ trợ có thể gọi các hàm GIS của BigQuery để xác định xem một chiếc xe nhất định có nằm trong hay nằm ngoài khoanh vùng địa lý hay không. Trong trường hợp một hoặc nhiều khoanh vùng địa lý bị vi phạm, phần phụ trợ có thể hành động và kích hoạt các quy trình nội bộ hoặc quy trình công việc có liên quan khác.

Kết luận

Khoanh vùng địa lý là một công cụ mạnh mẽ mà bạn có thể sử dụng cho nhiều mục đích. Doanh nghiệp có thể sử dụng tính năng khoanh vùng địa lý để nhắm mục tiêu đến người dùng cuối bằng các quảng cáo phù hợp và chương trình khuyến mãi, cung cấp các dịch vụ dựa trên vị trí, đồng thời cải thiện tính bảo mật và an toàn.

Navigation SDK cung cấp các trình nghe sự kiện hữu ích có thể phát hiện nhiều thời điểm quan trọng trong hành trình. Các công ty thường yêu cầu khoanh vùng địa lý tuỳ chỉnh cho các trường hợp sử dụng cụ thể. Trong tài liệu này, chúng tôi đã trình bày một cách để đạt được điều này, nhưng bạn có vô số lựa chọn. Chúng tôi rất mong được thấy thành quả của bạn.

Các bước tiếp theo

Đề xuất đọc thêm: