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ả tính năng khoanh vùng địa lý phía máy khách là gì, khi nào nên sử dụng và cách áp dụng tính năng này vào các trường hợp sử dụng trong ứng dụng dành cho thiết bị di động. Bài viết này cũng trình bày cách triển khai một ví dụ trên Android bằng SDK Điều hướng của Google.

SDK điều hướng có tính năng phát hiện khoanh vùng đị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 khi nào một thiết bị di động đi vào hoặc rời khỏi một khu vực cụ thể. Việc 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 các sự kiện khi một thiết bị vượt quá ranh giới.

Trong nhiều trường hợp sử dụng như:

  • Mức độ tương tác của khách hàng: Các doanh nghiệp có thể sử dụng tính năng khoanh vùng địa lý để gửi thông báo đẩy tới người dùng cuối về các ưu đãi, sự kiện hoặc sản phẩm mới đặc biệt.
  • An ninh và an toàn: Các doanh nghiệp có thể sử dụng tính năng khoanh vùng địa lý để tạo vành đai ả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 cho nhân viên an ninh nếu có người đi vào hoặc rời khỏi khu vực.
  • Giao thông: Các 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, cũng như tối ưu hoá tuyến đường và lịch biểu.

Do đó, điều quan trọng là bạn phải biết cách thể hiện các vùng (đ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 vị trí của 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 khách phải có:

  1. Đa giác mà nền tảng cần kiểm tra để xem có vi phạm hay không;
  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 nằm bên trong hay bên ngoài hình đa giác.

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

SDK điều hướng là một thư viện gốc dành cho Android / iOS được thêm vào ứng dụng trình điều khiển. SDK này chịu trách nhiệm:

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

Người nghe

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

  • Các thay đổi về vị trí thông qua nhà cung cấp RoadSnappedLocation.
  • Các sự kiện định tuyến lại (người dùng bỏ lỡ ngã rẽ, rẽ trái, v.v. và đi chệch khỏi tuyến đường được đề xuất) qua ReroutingListener.
  • Sự kiện đến (người dùng đến điểm đến theo kế hoạch) qua ArrivalListener.
  • Khoảng cách còn lại và các sự kiện ETA (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 điểm đến - dựa trên thời gian) đều có sẵn qua .RemainingTimeOrDistanceChangedListener

Trong hướng dẫn này, chỉ sử dụng Nhà cung cấp RoadSnappedLocation và LocationListener của nó.

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

Bây giờ, hãy cùng 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 tôi có SDK Điều hướng hoạt động ở chế độ từng chặng 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 tôi.

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

  1. Tính năng Khoanh vùng địa lý được lưu trữ trong BigQuery và do chương trình phụ trợ của bạn kéo.
  2. Máy chủ phụ trợ định kỳ đẩy khoanh vùng địa lý ra các ứng dụng trên Drive.
  3. Trình điều hướng và ứng dụng trình điều khiển sẽ thường xuyên kiểm tra khoanh vùng địa lý để tìm ra điều kiện kích hoạt.
  4. Ứng dụng trình điều khiển sẽ thông báo cho phần phụ trợ về sự kiện kích hoạt để ứng dụng đó 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ị xuyên thủng hay không. Khi ứng dụng phát hiện đã vượt qua 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: Khoa vùng địa lý bị vi phạm.

Đị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 công khai và được lưu trữ trên GitHub và có thể được truy cập 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 là 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'
}

Tiếp theo, 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 trong tệp Java của mình:

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

Xác định tính năng Khoanh vùng địa lý

Xin lưu ý rằng PolygonOptions cũng đang được nhập. Lý do là vì những gì đang được dùng để biểu diễn đ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ạ độ được thiết lập sẵn – (vĩ độ, kinh độ). Tuy nhiên, trong các tình huống thực tế, các toạ độ và định nghĩa đa giác đó hầu hết sẽ xuất phát 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 nhanh(các) đa giác.

Để biết thêm chi tiết 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ị trí

Sau khi xác định khoanh vùng địa lý, bạn chỉ cần tạo một trình nghe thông tin cập nhật vị trí để đăng ký sự kiện nêu trên trong SDK điều hướng 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) {
   }
};

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

Phương pháp thay thế

Tài liệu này tập trung vào một ứng dụng dành cho máy khách để kiểm tra phạm vi khoanh vùng địa lý tuỳ chỉnh (đa giác). Tuy nhiên, có những trường hợp bạn có thể cần kiểm tra 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ị trí cho một phần phụ trợ và hệ thống phụ trợ này 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 khách để xác thực.

Giải pháp khả thi như sau:

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

Một cấu trúc mẫu 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 trình điều khiển (sử dụng SDK trình điều khiển) gửi thông tin cập nhật vị trí cho Fleet Engine. Cập nhật vị trí và điều hướng trong ứng dụng diễn ra thông qua SDK Điều hướng.
  2. Fleet Engine sẽ xuất những bản cập nhật đó lên Cloud Logging hoặc Pub/Sub.
  3. Phần phụ trợ sẽ thu thập các tín hiệu vị trí đó.
  4. Khoanh vùng địa lý được lưu trữ trong Big Query để phân tích bởi chương trình phụ trợ.
  5. Khi kích hoạt khoanh vùng địa lý, cảnh báo sẽ được gửi đến Ứng dụng trình điều khiển.

Trong cấu trúc này, SDK trình điều khiển và Fleet Engine được sử dụng. Fleet Engine có thể phát hành bản cập nhật PubSub và tạo mục nhập nhật ký trong tính năng Ghi nhật ký trên đám mây. Trong cả hai trường hợp, bạn đều có thể truy xuất thông tin 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ó cập nhật (hoặc cứ vài giây, vài phút một lần, tuỳ thuộc vào mức độ quan trọng của việc cập nhật), phần phụ trợ có thể gọi các chức năng GIS của BigQuery để xác định xem một xe nhất định có nằm trong hoặc 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ể hoạt động và kích hoạt các quy trình nội bộ hoặc các quy trình làm việc liên quan khác.

Kết luận

Khoanh vùng địa lý là một công cụ mạnh mẽ có thể dùng cho nhiều mục đích. Các doanh nghiệp có thể sử dụng tính năng khoanh vùng địa lý để nhắm đến người dùng cuối bằng các quảng cáo và chương trình khuyến mãi phù hợp, cung cấp 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.

SDK điều hướng cung cấp trình nghe sự kiện hữu ích có thể phát hiện nhiều khoảnh khắc 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 đã minh hoạ cách đạt được điều này, nhưng khả năng là vô hạn. Chúng tôi rất mong được thấy ý kiến của bạn.

Hành động tiếp theo

Tài liệu đọc thêm được đề xuất: