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ả hàng rào địa lý phía máy khách, thời điểm sử dụng và cách áp dụng hàng rào địa lý này cho các trường hợp sử dụng trong một ứng dụng di động. Hướng dẫn này cũng cho biết cách triển khai một ví dụ trên Android bằng Google Navigation SDK.

Nav SDK có tính năng phát hiện hàng rào địa lý
Nav SDK có tính năng phát hiện hàng rào địa lý

Các công ty thường cần biết thời điểm một 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à hàng rào đị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 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 với khách hàng: Doanh nghiệp có thể sử dụng hàng rào đị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: Các doanh nghiệp có thể sử dụng hàng rào địa lý để tạo ra các 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 an ninh nếu có người ra vào khu vực đó.
  • Giao thông vận tải: Các doanh nghiệp có thể sử dụng hàng rào đị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 vùng (đa giác) đó trong một ứng dụng dành cho khách hàng. Ứng dụng này sẽ theo dõi vị trí của thiết bị và kiểm tra xem thiết bị có vi phạm một hàng rào đị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 hàng rào địa lý phía máy khách . Điều này có nghĩa là ứng dụng khách phải có:

  1. Các đa giác mà hệ thống cần kiểm tra để phát hiện các trường hợp 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 bên trong hay bên ngoài bất kỳ đa giác nào.

Hướng dẫn này có các ví dụ trên Android, nhưng bạn có thể thực hiện việc này theo cách tương tự trên iOS. Dịch vụ vị trí của Android có một chế độ triển khai tích hợp cho hàng rào địa lý dạng 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 bắt đầu cho các hoạt động triển khai phức tạp hơn.

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

  • Lấy vị trí được điều chỉnh cho khớp với đường từ ứng dụng đang chạy. Dịch vụ này chính xác hơn FusedLocationProvider (FLP) của Android vì sử dụng mạng lưới đường bộ của Google để gắn vị trí vào đoạn đường gần nhất, giúp thời gian đến dự kiến chính xác hơn nhiều, cũng như các thông tin khác từ FLP.
  • Trải nghiệm chỉ đường từng chặng giú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 các sự kiện thông qua trình nghe sự kiện và lệnh gọi lại đã đăng ký.

Trình xử lý

Navigation SDK có nhiều trình nghe mà bạn có thể sử dụng. Ví dụ:

  • Thay đổi về vị trí thông qua nhà cung cấp RoadSnappedLocation.
  • Định tuyến lại các sự kiện (người dùng bỏ lỡ đường vòng, 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 đến đã lên kế hoạch) thông qua ArrivalListener.
  • Cả sự kiện 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 đến – dựa trên mét, nhận thông báo khi tài xế sắp đến đích đến – dựa trên thời gian) đều có sẵn thông qua .RemainingTimeOrDistanceChangedListener

Trong hướng dẫn này, chỉ có RoadSnappedLocationProvider và LocationListener của nó được dùng.

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

Bây giờ, hãy cùng tìm hiểu cách xây dựng chức năng hàng rào đị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ế độ chỉ đường từng chặng và một đa giác được xác định trong tuyến đường đại diện cho hàng rào địa lý của chúng ta.

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

  1. Hàng rào địa lý được lưu trữ trong BigQuery và do phần phụ trợ của bạn kéo.
  2. Phụ trợ định kỳ đẩy hàng rào địa lý ra các ứng dụng lái xe.
  3. Người lái xe điều hướng và ứng dụng dành cho người lái xe thường xuyên kiểm tra các hàng rào địa lý để tìm một điều kiện kích hoạt.
  4. Ứng dụng dành cho tài xế sẽ thông báo cho phần phụ trợ về một 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 ứng dụng đã vượt qua một hàng rào địa lý, một thông báo sẽ xuất hiện trên giao diện người dùng cho biết: Đã vượt qua hàng rào địa lý.

Định cấu hình các 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 mã nguồn mở chứa các tiện ích hữu ích cho nhiều ứng dụng sử dụng Google Maps Android API.

Thư viện này là công khai, được lưu trữ trên GitHub và có thể 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 dành cho mô-đun (ứng dụng) mà bạn đang tạo, 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 hàng rào đị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ạ độ (vĩ độ, kinh độ) được thiết lập sẵn. Tuy nhiên, trong các tình huống thực tế, những toạ độ và định nghĩa đa giác này 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à(các) đa giác sẽ phải được ứng dụng tạo ngay lập tức.

Để biết thêm thông tin về những nội dung có thể 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 hàng rào đị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 Navigation SDK có tên là RoadSnappedLocationProvider. Sự kiện 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ể 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, đa giác được xác định trước (đại diện cho hàng rào địa lý) được sử dụng, nhưng trên thực tế, bạn có thể có nhiều đa giác và cần có một vòng lặp.

Một phương pháp thay thế

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

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

[Execution Environment] Cấu trúc hàng rào địa lý phía máy chủ

Một 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) sẽ gửi thông tin cập nhật về vị trí đến Fleet Engine. Thông tin cập nhật về vị trí và chế độ chỉ đường trong ứng dụng diễn ra thông qua Navigation SDK.
  2. Fleet Engine xuất những nội dung cập nhật đó sang Cloud Logging hoặc Pub/Sub.
  3. Phần phụ trợ sẽ thu thập những tín hiệu vị trí đó.
  4. Hàng rào địa lý được lưu trữ trong BigQuery để phân tích bằng phần phụ trợ.
  5. Khi bạn kích hoạt hàng rào đị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, Driver SDK và Fleet Engine được dùng. Fleet Engine có thể phát các bản cập nhật PubSub và tạo các 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 đó, hệ thống phụ trợ có thể giám sát hàng đợi PubSub hoặc đọc nhật ký và theo dõi các bản cập nhật về xe. Sau đó, bất cứ khi nào có bản 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 bản cập nhật), hệ thống phụ trợ có thể gọi các hàm GIS của BigQuery để xác định xem một chiếc xe cụ thể có nằm trong hay ngoài hàng rào địa lý hay không. Trong trường hợp một hoặc nhiều hàng rào đị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 quy trình công việc có liên quan khác.

Kết luận

Hàng rào địa lý là một công cụ mạnh mẽ có thể được sử dụng cho nhiều mục đích. Các doanh nghiệp có thể sử dụng hàng rào địa lý để nhắm đến người dùng cuối bằng những quảng cáo và chương trình khuyến mãi phù hợp, 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 khoảnh khắc quan trọng trong hành trình. Các công ty thường yêu cầu hàng rào đị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ạ 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 xem những tác phẩm của bạn.

Hành động tiếp theo

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