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, thời điểm sử dụng 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 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ý
Nav SDK 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 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ì các ranh giới địa lý ảo hoặc khoanh vùng địa lý, cho phép phần mềm kích hoạt các sự kiện khi thiết bị vượt qua ranh giới.

Việc hiểu được thời điểm một chiếc xe nhất định vượt qua một 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 mức độ 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, 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 tính năng khoanh vùng địa lý để tạo các phạm vi ả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 kho hàng, đồng thời cảnh báo nhân viên bảo vệ nếu có người vào hoặc rời khỏi khu vực đó.
  • Giao thông: 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 đó, đ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 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 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. Các đa giác cần kiểm tra để phát hiện lỗi 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 bao gồm các ví dụ trên Android, nhưng cũng có các 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 sẵn cho khoanh vùng địa lý hình tròn. Bạn có thể xem tính năng này 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 phương thức 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 trình điều khiển. Thư viện 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. Tính năng này chính xác hơn FusedLocationProvider (FLP) của Android vì sử dụng mạng lưới đường của Google để chụp vị trí của đoạn đường gần nhất, giúp thời gian đến chính xác hơn nhiều và cung cấp các thông tin khác từ FLP.
  • Trải nghiệm từng chặng giúp tài xế di chuyển hiệu quả từ điểm A đến điểm B, đồng thời tính đến lưu lượng truy cập theo thời gian thực và các quy định 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. Một số ví dụ:

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

Trong hướng dẫn này, chúng ta chỉ sử dụng Trình cung cấp RoadSnappedLocation 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 cùng tìm hiểu cách tạo 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 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 ta.

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

  1. Ranh giới địa lý được lưu trữ trong BigQuery và được phần phụ trợ của bạn lấy.
  2. Phần phụ trợ định kỳ đẩy khoanh vùng địa lý đến các ứng dụng lái xe.
  3. Trình điều khiển điều hướng và ứng dụng trình điều khiển thường xuyên kiểm tra các khoanh vùng địa lý để tìm đ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ề một sự kiện kích hoạt để 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 rằng 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ượt qua 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 là 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 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 trong 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ý

Lưu ý rằng ở đây cũng nhập PolygonOptions. Lý do là đây là nội dung đ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 toạ độ được thiết lập trước – các cặp (vĩ độ, kinh độ). Tuy nhiên, trong các tình huống thực tế, những toạ độ và định nghĩa đa giác đó thường sẽ đến từ một điểm cuối phụ trợ và có thể đượ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 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
}

Theo dõi thông tin cập nhật về vị trí

Sau khi xác định khoanh vùng địa lý, bạn chỉ cần tạo trình nghe 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. 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ể sử dụng PolyUtil.containsLocation để kiểm tra xem vị trí nhận được có nằm bên 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à 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 dành cho khách hàng, ứng dụng này sẽ kiểm tra lỗi vi phạm khoanh vùng địa lý tuỳ chỉnh (đa giác). Tuy nhiên, có một số 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 phần phụ trợ và sau đó, phần 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.

Một giải pháp có thể áp dụng như sau:

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

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

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, sẽ gửi thông tin cập nhật về vị trí đến Công cụ quản lý đội xe. Thông tin cập nhật vị trí và tính năng chỉ đường trong ứng dụng diễn ra thông qua Navigation SDK.
  2. Công cụ của Fleet sẽ xuất các bản cập nhật đó đế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. Vùng khoanh vùng địa lý được lưu trữ trong BigQuery để phần phụ trợ phân tích.
  5. Khi kích hoạt khoanh vùng địa lý, thông báo sẽ được gửi đến Ứng dụng dành cho tài xế.

Trong cấu trúc này, Driver SDK và Fleet Engine được sử dụng. Công cụ của Fleet có thể phát hành thông tin 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 đó, phần phụ trợ có thể theo dõi hàng đợi PubSub hoặc đọc nhật ký và xem thông tin 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), phần phụ trợ có thể gọi các hàm GIS BigQuery để xác định xem một xe cụ thể có nằm trong hay 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 quy trình nội bộ hoặc các quy trình công việc có liên quan khác.

Kết luận

Tính năng khoanh vùng địa lý là một công cụ mạnh mẽ có thể được 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 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.

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 một 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ạ một cách để đạt được điều này, nhưng có vô vàn khả năng khác. Chúng tôi rất mong được xem thành quả của bạn.

Hành động tiếp theo

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