Theo dõi đội xe của bạn bằng Thư viện theo dõi nhóm JavaScript

Thư viện theo dõi đội xe JavaScript cho phép bạn trực quan hoá vị trí của xe trong đội xe theo thời gian gần thực. Thư viện này sử dụng On Request and Deliveries API (API Đi xe và giao hàng theo yêu cầu) để cho phép trực quan hoá thông tin về phương tiện di chuyển cũng như các chuyến đi. Thư viện theo dõi nhóm JavaScript chứa một thành phần bản đồ JavaScript. Đây là thành phần thay thế cho thực thể google.maps.Map tiêu chuẩn và các thành phần dữ liệu để kết nối với Fleet Engine.

Thành phần

Thư viện theo dõi nhóm JavaScript cung cấp các thành phần để trực quan hoá thông tin về xe và điểm tham chiếu chuyến đi, cũng như nguồn cấp dữ liệu thô cho ETA hoặc quãng đường còn lại của chuyến đi.

Chế độ xem bản đồ Theo dõi đội tàu

Thành phần chế độ xem bản đồ Theo dõi đội xe trực quan hoá vị trí của xe và điểm tham chiếu chuyến đi. Nếu đã biết tuyến đường của một chiếc xe, thì thành phần chế độ xem bản đồ sẽ tạo ảnh động cho chiếc xe đó khi chiếc xe đó di chuyển dọc theo đường dẫn dự đoán.

Ví dụ về chế độ xem bản đồ
Theo dõi nhóm thiết bị

Nhà cung cấp dịch vụ vị trí

Trình cung cấp vị trí làm việc với thông tin lưu trữ trong Fleet Engine để gửi thông tin vị trí của các đối tượng được theo dõi đến bản đồ chia sẻ hành trình.

Nhà cung cấp dịch vụ vị trí xe

Nhà cung cấp dịch vụ vị trí xe hiển thị thông tin vị trí của một chiếc xe. Ứng dụng này có thông tin về vị trí của xe và chuyến đi hiện tại được chỉ định cho xe.

Nhà cung cấp vị trí cho nhóm thiết bị

Nhà cung cấp vị trí đội xe hiển thị thông tin vị trí của nhiều xe. Bạn có thể lọc để cho thấy một chiếc xe cụ thể và vị trí của xe đó, hoặc bạn có thể hiển thị vị trí của xe cho toàn bộ nhóm thiết bị.

Kiểm soát chế độ hiển thị của vị trí được theo dõi

Quy tắc chế độ hiển thị xác định thời điểm một đối tượng vị trí được theo dõi xuất hiện trên Bản đồ cho trình cung cấp vị trí của Fleet Engine. Lưu ý – Việc sử dụng trình cung cấp vị trí tuỳ chỉnh hoặc phát sinh có thể thay đổi các quy tắc hiển thị.

Phương tiện vận tải

Bạn sẽ nhìn thấy xe ngay khi được tạo trong Fleet Engine, đồng thời sẽ xuất hiện khi xe_state là Online. Tức là bạn có thể nhìn thấy xe ngay cả khi không có chuyến đi hiện tại nào được chỉ định cho xe đó.

Điểm đánh dấu vị trí tham chiếu

Điểm đánh dấu vị trí điểm tham chiếu cho biết các điểm trên hành trình của xe bắt đầu từ điểm xuất phát và kết thúc từ điểm đến cuối cùng. Bạn có thể xác định điểm đánh dấu vị trí điểm tham chiếu như sau:

  • Điểm xuất phát – cho biết vị trí bắt đầu của chuyến đi của xe
  • Trung cấp – cho biết điểm dừng cho chuyến đi của xe
  • Điểm đến – cho biết vị trí cuối cùng của chuyến đi

Các điểm tham chiếu của xe theo kế hoạch sẽ xuất hiện trên bản đồ dưới dạng điểm đánh dấu điểm xuất phát, điểm đánh dấu trung gian và điểm đến.

Bắt đầu sử dụng Thư viện theo dõi nhóm JavaScript

Trước khi sử dụng Thư viện theo dõi nhóm JavaScript, hãy đảm bảo bạn đã quen thuộc với Fleet Engine và nhận khoá API. Sau đó, hãy tạo thông tin xác nhận quyền sở hữu mã chuyến đi và mã phương tiện.

Tạo thông báo xác nhận quyền sở hữu mã chuyến đi và mã xe

Để theo dõi các phương tiện bằng nhà cung cấp vị trí xe, hãy tạo một Mã thông báo web JSON (JWT) có mã chuyến đi và mã xác nhận quyền sở hữu mã xe.

Để tạo tải trọng JWT, hãy thêm một thông báo xác nhận quyền sở hữu bổ sung vào phần uỷ quyền bằng các khoá tripidvehicleid, đồng thời đặt value của mỗi khoá thành *. Bạn phải tạo mã thông báo bằng vai trò IAM của Cloud Người dùng cao cấp dịch vụ Fleet Engine. Xin lưu ý rằng việc này cấp quyền truy cập rộng rãi để tạo, đọc và sửa đổi các thực thể của Fleet Engine, đồng thời bạn chỉ nên chia sẻ quyền này với những người dùng đáng tin cậy.

Ví dụ sau cho biết cách tạo mã thông báo để theo dõi bằng xe và tác vụ:

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_consumer_service_account"
}
.
{
  "iss": "superuser@yourgcpproject.iam.gserviceaccount.com",
  "sub": "superuser@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "scope": "https://www.googleapis.com/auth/xapi",
  "authorization": {
    "tripid": "*",
    "vehicleid": "*",
  }
}

Tạo trình tìm nạp mã thông báo xác thực

Thư viện theo dõi nhóm JavaScript yêu cầu một mã thông báo bằng cách sử dụng trình tìm nạp mã thông báo xác thực khi bất kỳ trường hợp nào sau đây xảy ra:

  • Giao diện này không có mã thông báo hợp lệ, chẳng hạn như khi chưa gọi trình tìm nạp trong một lần tải trang mới hoặc khi trình tìm nạp không trả về mã thông báo.
  • Mã thông báo mà tính năng này tìm nạp trước đó đã hết hạn.
  • Mã thông báo mà nó tìm nạp trước đó sẽ hết hạn trong vòng một phút.

Nếu không, thư viện sẽ sử dụng mã thông báo vẫn hợp lệ và đã phát hành trước đó và không gọi trình tìm nạp.

Bạn có thể tạo trình tìm nạp mã thông báo xác thực để truy xuất một mã thông báo được tạo bằng các xác nhận quyền sở hữu thích hợp trên máy chủ bằng cách sử dụng chứng chỉ tài khoản dịch vụ cho dự án của bạn. Bạn chỉ được tạo mã thông báo trên máy chủ và không bao giờ chia sẻ chứng chỉ của mình trên bất kỳ ứng dụng nào. Nếu không, bạn có thể xâm phạm tính bảo mật của hệ thống.

Trình tìm nạp phải trả về một cấu trúc dữ liệu với hai trường, được gói trong một Promise:

  • Một chuỗi token.
  • Số expiresInSeconds. Mã thông báo sẽ hết hạn trong khoảng thời gian này sau khi tìm nạp.

Ví dụ sau đây cho thấy cách tạo trình tìm nạp mã thông báo xác thực:

JavaScript

function authTokenFetcher(options) {
  // options is a record containing two keys called
  // serviceType and context. The developer should
  // generate the correct SERVER_TOKEN_URL and request
  // based on the values of these fields.
  const response = await fetch(SERVER_TOKEN_URL);
  if (!response.ok) {
    throw new Error(response.statusText);
  }
  const data = await response.json();
  return {
    token: data.Token,
    expiresInSeconds: data.ExpiresInSeconds
  };
}

TypeScript

function authTokenFetcher(options: {
  serviceType: google.maps.journeySharing.FleetEngineServiceType,
  context: google.maps.journeySharing.AuthTokenContext,
}): Promise<google.maps.journeySharing.AuthToken> {
  // The developer should generate the correct
  // SERVER_TOKEN_URL based on options.
  const response = await fetch(SERVER_TOKEN_URL);
  if (!response.ok) {
    throw new Error(response.statusText);
  }
  const data = await response.json();
  return {
    token: data.token,
    expiresInSeconds: data.expiration_timestamp_ms - Date.now(),
  };
}

Khi triển khai điểm cuối phía máy chủ để đúc mã thông báo, hãy lưu ý những điều sau:

  • Điểm cuối phải trả về thời gian hết hạn cho mã thông báo; trong ví dụ trên, điểm cuối được cung cấp là data.ExpiresInSeconds.
  • Trình tìm nạp mã thông báo xác thực phải chuyển thời gian hết hạn (tính bằng giây, kể từ thời điểm tìm nạp) cho thư viện, như minh hoạ trong ví dụ.
  • SERVER_TOKEN_URL phụ thuộc vào cách triển khai phần phụ trợ của bạn. Sau đây là các URL ví dụ:
    • https://SERVER_URL/token/driver/VEHICLE_ID
    • https://SERVER_URL/token/consumer/TRIP_ID
    • https://SERVER_URL/token/fleet_reader

Tải bản đồ từ HTML

Ví dụ sau đây cho thấy cách tải thư viện Chia sẻ hành trình JavaScript từ một URL đã chỉ định. Tham số callback thực thi hàm initMap sau khi API tải. Thuộc tính defer (trì hoãn) cho phép trình duyệt tiếp tục kết xuất phần còn lại của trang trong khi API tải.

 <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap&libraries=journeySharing&v=beta" defer></script>

Đi theo xe

Phần này cho biết cách sử dụng Thư viện theo dõi nhóm JavaScript để theo dõi một xe. Hãy nhớ tải thư viện từ hàm callback được chỉ định trong thẻ tập lệnh trước khi chạy mã.

Tạo thực thể cho nhà cung cấp thông tin vị trí xe

Thư viện theo dõi nhóm JavaScript xác định trước một nhà cung cấp vị trí cho OnDemand Rides and Deliveries API. Sử dụng mã dự án và tham chiếu đến nhà máy mã thông báo của bạn để tạo thực thể.

JavaScript

locationProvider =
    new google.maps.journeySharing
        .FleetEngineVehicleLocationProvider({
          projectId,
          authTokenFetcher,

          // Optionally, you may specify
          // vehicleId to immediately start
          // tracking.
          vehicleId: 'your-vehicle-id',
});

TypeScript

locationProvider =
    new google.maps.journeySharing
        .FleetEngineVehicleLocationProvider({
          projectId,
          authTokenFetcher,

          // Optionally, you may specify
          // vehicleId to immediately start
          // tracking.
          vehicleId: 'your-vehicle-id',
});

Khởi chạy chế độ xem bản đồ

Sau khi tải thư viện Chia sẻ hành trình JavaScript, hãy khởi chạy chế độ xem bản đồ và thêm chế độ xem đó vào trang HTML. Trang của bạn phải chứa một phần tử <div> chứa chế độ xem bản đồ. Phần tử <div> được đặt tên là map_canvas trong ví dụ dưới đây.

JavaScript

const mapView = new
    google.maps.journeySharing.JourneySharingMapView({
  element: document.getElementById('map_canvas'),
  locationProviders: [locationProvider],
  // Styling customizations; see below.
  vehicleMarkerSetup: vehicleMarkerSetup,
  anticipatedRoutePolylineSetup:
      anticipatedRoutePolylineSetup,
  // Any undefined styling options will use defaults.
});

// If you did not specify a vehicle ID in the
// location provider constructor, you may do so here.
// Location tracking will start as soon as this is set.
locationProvider.vehicleId
                        = 'your-vehicle-id';

// Give the map an initial viewport to allow it to
// initialize; otherwise the 'ready' event above may
// not fire. The user also has access to the mapView
// object to customize as they wish.
mapView.map.setCenter('Times Square, New York, NY');
mapView.map.setZoom(14);

TypeScript

const mapView = new
    google.maps.journeySharing.JourneySharingMapView({
  element: document.getElementById('map_canvas'),
  locationProviders: [locationProvider],
  // Styling customizations; see below.
  anticipatedRoutePolylineSetup:
      anticipatedRoutePolylineSetup,
  // Any undefined styling options will use defaults.
});

// If you did not specify a vehicle ID in the
// location provider constructor, you may do so here.
// Location tracking will start as soon as this is set.
locationProvider.vehicleId = 'your-vehicle-id';

// Give the map an initial viewport to allow it to
// initialize; otherwise the 'ready' event above may
// not fire. The user also has access to the mapView
// object to customize as they wish.
mapView.map.setCenter('Times Square, New York, NY');
mapView.map.setZoom(14);

Theo dõi các sự kiện thay đổi

Bạn có thể truy xuất thông tin meta về một chiếc xe từ đối tượng vehicle bằng cách sử dụng trình cung cấp vị trí. Thông tin meta bao gồm giờ đến dự kiến và quãng đường còn lại trước lần đón hoặc trả xe tiếp theo. Các thay đổi đối với thông tin meta sẽ kích hoạt sự kiện update. Ví dụ sau cho biết cách theo dõi các sự kiện thay đổi này.

JavaScript

locationProvider.addListener('update', e => {
  // e.vehicle contains data that may be
  // useful to the rest of the UI.
  if (e.vehicle) {
    console.log(e.vehicle.vehicleState);
  }
});

TypeScript

locationProvider.addListener('update',
    (e: google.maps.journeySharing.FleetEngineVehicleLocationProviderUpdateEvent) => {
  // e.vehicle contains data that may be useful to the rest of the UI.
  if (e.vehicle) {
    console.log(e.vehicle.vehicleState);
  }
});

Nghe lỗi

Các lỗi phát sinh không đồng bộ khi yêu cầu các sự kiện lỗi kích hoạt thông tin xe. Ví dụ sau cho biết cách theo dõi những sự kiện này để xử lý lỗi.

JavaScript

locationProvider.addListener('error', e => {
  // e.error is the error that triggered the event.
  console.error(e.error);
});

TypeScript

locationProvider.addListener('error', (e: google.maps.ErrorEvent) => {
  // e.error is the error that triggered the event.
  console.error(e.error);
});

Dừng theo dõi

Để ngăn trình cung cấp vị trí theo dõi xe, hãy xoá mã xe khỏi trình cung cấp vị trí.

JavaScript

locationProvider.vehicleId = '';

TypeScript

locationProvider.vehicleId = '';

Xóa trình cung cấp vị trí khỏi chế độ xem bản đồ

Ví dụ sau đây cho thấy cách xoá một nhà cung cấp vị trí khỏi chế độ xem bản đồ.

JavaScript

mapView.removeLocationProvider(locationProvider);

TypeScript

mapView.removeLocationProvider(locationProvider);

Xem đội xe

Phần này cho biết cách sử dụng thư viện Chia sẻ hành trình JavaScript để xem nhóm xe. Hãy nhớ tải thư viện từ hàm callback được chỉ định trong thẻ tập lệnh trước khi chạy mã.

Tạo thực thể cho nhà cung cấp vị trí nhóm xe

Thư viện theo dõi đội xe JavaScript xác định trước một trình cung cấp vị trí để tìm nạp nhiều xe từ API Gọi xe và giao hàng theo yêu cầu. Sử dụng mã dự án cũng như tệp tham chiếu đến trình tìm nạp mã thông báo để tạo thực thể cho dự án đó.

JavaScript

locationProvider =
    new google.maps.journeySharing
        .FleetEngineFleetLocationProvider({
          projectId,
          authTokenFetcher,

          // Optionally, specify location bounds to
          // limit which vehicles are
          // retrieved and immediately start tracking.
          locationRestriction: {
            north: 37.3,
            east: -121.8,
            south: 37.1,
            west: -122,
          },
          // Optionally, specify a filter to limit
          // which vehicles are retrieved.
          vehicleFilter:
            'attributes.foo = "bar" AND attributes.baz = "qux"',
        });

TypeScript

locationProvider =
    new google.maps.journeySharing
        .FleetEngineFleetLocationProvider({
          projectId,
          authTokenFetcher,

          // Optionally, specify location bounds to
          // limit which vehicles are
          // retrieved and immediately start tracking.
          locationRestriction: {
            north: 37.3,
            east: -121.8,
            south: 37.1,
            west: -122,
          },
          // Optionally, specify a filter to limit
          // which vehicles are retrieved.
          vehicleFilter:
            'attributes.foo = "bar" AND attributes.baz = "qux"',
        });

vehicleFilter chỉ định một truy vấn dùng để lọc các xe xuất hiện trên bản đồ. Bộ lọc này được chuyển trực tiếp đến Fleet Engine. Hãy xem ListVehiclesRequest để biết các định dạng được hỗ trợ.

locationRestriction giới hạn khu vực hiển thị phương tiện di chuyển trên bản đồ. Chế độ này cũng kiểm soát việc tính năng theo dõi vị trí có đang hoạt động hay không. Tính năng theo dõi vị trí sẽ không bắt đầu cho đến khi bạn đặt tùy chọn này.

Sau khi tạo trình cung cấp vị trí, hãy khởi động chế độ xem bản đồ.

Đặt giới hạn vị trí bằng cách sử dụng khung nhìn bản đồ

Các giới hạn locationRestriction có thể được định cấu hình để khớp với khu vực hiển thị trong chế độ xem bản đồ.

JavaScript

google.maps.event.addListenerOnce(
  mapView.map, 'bounds_changed', () => {
    const bounds = mapView.map.getBounds();
    if (bounds) {
      // If you did not specify a location restriction in the
      // location provider constructor, you may do so here.
      // Location tracking will start as soon as this is set.
      locationProvider.locationRestriction = bounds;
    }
  });

TypeScript

google.maps.event.addListenerOnce(
  mapView.map, 'bounds_changed', () => {
    const bounds = mapView.map.getBounds();
    if (bounds) {
      // If you did not specify a location restriction in the
      // location provider constructor, you may do so here.
      // Location tracking will start as soon as this is set.
      locationProvider.locationRestriction = bounds;
    }
  });

Theo dõi các sự kiện thay đổi

Bạn có thể truy xuất thông tin meta về nhóm thiết bị từ đối tượng vehicles bằng cách sử dụng trình cung cấp vị trí. Thông tin meta bao gồm các thuộc tính xe như trạng thái điều hướng, khoảng cách đến điểm tham chiếu tiếp theo và các thuộc tính tuỳ chỉnh; xem tài liệu tham khảo để biết thêm thông tin chi tiết. Việc thay đổi thông tin meta sẽ kích hoạt sự kiện cập nhật. Ví dụ sau cho thấy cách theo dõi các sự kiện thay đổi này.

JavaScript

locationProvider.addListener('update', e => {
  // e.vehicles contains data that may be
  // useful to the rest of the UI.
  if (e.vehicles) {
    for (vehicle of e.vehicles) {
      console.log(vehicle.navigationStatus);
    }
  }
});

TypeScript

locationProvider.addListener('update',
    (e: google.maps.journeySharing.FleetEngineFleetLocationProviderUpdateEvent) => {
  // e.vehicles contains data that may be useful to the rest of the UI.
  if (e.vehicles) {
    for (vehicle of e.vehicles) {
      console.log(vehicle.navigationStatus);
    }
  }
});

Nghe lỗi

Lỗi phát sinh không đồng bộ khi yêu cầu thông tin về nhóm xe kích hoạt các sự kiện lỗi. Để xem ví dụ minh hoạ cách theo dõi những sự kiện này, hãy tham khảo bài viết Nghe lỗi.

Dừng theo dõi

Để ngăn trình cung cấp vị trí theo dõi nhóm thiết bị, hãy đặt các giới hạn của trình cung cấp vị trí thành rỗng.

JavaScript

locationProvider.locationRestriction = null;

TypeScript

locationProvider.locationRestriction = null;

Xóa trình cung cấp vị trí khỏi chế độ xem bản đồ

Ví dụ sau đây cho thấy cách xoá một nhà cung cấp vị trí khỏi chế độ xem bản đồ.

JavaScript

mapView.removeLocationProvider(locationProvider);

TypeScript

mapView.removeLocationProvider(locationProvider);

Tuỳ chỉnh giao diện của bản đồ cơ sở

Để tuỳ chỉnh giao diện của thành phần bản đồ, hãy tạo kiểu cho bản đồ bằng công cụ trên đám mây hoặc bằng cách đặt các tuỳ chọn ngay trong mã.

Sử dụng kiểu bản đồ dựa trên đám mây

Định kiểu bản đồ dựa trên đám mây cho phép bạn tạo và chỉnh sửa kiểu bản đồ cho bất kỳ ứng dụng nào sử dụng Google Maps từ bảng điều khiển Google Cloud mà không yêu cầu thay đổi mã. Các kiểu bản đồ được lưu dưới dạng mã bản đồ trong dự án Cloud của bạn. Để áp dụng một kiểu cho bản đồ Theo dõi nhóm JavaScript, hãy chỉ định mapId khi bạn tạo JourneySharingMapView. Bạn không thể thay đổi hoặc thêm trường mapId sau khi tạo thực thể cho JourneySharingMapView. Ví dụ sau đây cho thấy cách bật kiểu bản đồ đã tạo trước đó bằng mã bản đồ.

JavaScript

const mapView = new google.maps.journeySharing.JourneySharingMapView({
  element: document.getElementById('map_canvas'),
  locationProviders: [locationProvider],
  mapOptions: {
    mapId: 'YOUR_MAP_ID'
  }
});

TypeScript

const mapView = new google.maps.journeySharing.JourneySharingMapView({
  element: document.getElementById('map_canvas'),
  locationProviders: [locationProvider],
  mapOptions: {
    mapId: 'YOUR_MAP_ID'
  }
});

Sử dụng kiểu bản đồ dựa trên mã

Một cách khác để tuỳ chỉnh kiểu bản đồ là đặt mapOptions khi bạn tạo JourneySharingMapView.

JavaScript

const mapView = new google.maps.journeySharing.JourneySharingMapView({
  element: document.getElementById('map_canvas'),
  locationProviders: [locationProvider],
  mapOptions: {
    styles: [
      {
        "featureType": "road.arterial",
        "elementType": "geometry",
        "stylers": [
          { "color": "#CCFFFF" }
        ]
      }
    ]
  }
});

TypeScript

const mapView = new google.maps.journeySharing.JourneySharingMapView({
  element: document.getElementById('map_canvas'),
  locationProviders: [locationProvider],
  mapOptions: {
    styles: [
      {
        "featureType": "road.arterial",
        "elementType": "geometry",
        "stylers": [
          { "color": "#CCFFFF" }
        ]
      }
    ]
  }
});

Thay đổi kiểu và chế độ hiển thị của các tuyến đường

Để định cấu hình kiểu và chế độ hiển thị của các tuyến đã chụp và dự kiến, hãy sử dụng các tuỳ chọn định kiểu tuỳ chỉnh. Để biết thêm thông tin, hãy xem phần Giao diện PolylineOptions.

Ví dụ sau đây cho thấy cách định cấu hình định kiểu và chế độ hiển thị của các tuyến dự kiến. Để định cấu hình kiểu và chế độ hiển thị của các tuyến đường đã đi, hãy sử dụng takenRoutePolylineSetup thay vì anticipatedRoutePolylineSetup.

JavaScript

// This function is specified in the
// JourneySharingMapView constructor's options
// parameter.
function anticipatedRoutePolylineSetup({
    defaultPolylineOptions, defaultVisible}) {
  // If this function is not specified, the
  // PolylineOptions object contained in
  // defaultPolylineOptions is used to render the
  // anticipated route polyline. visible property sets the
  // polyline's visibility. Modify this object and
  // pass it back to customize the style of the map.
  defaultPolylineOptions.strokeOpacity = 0.5;
  defaultPolylineOptions.strokeColor = 'red';
  return {
    polylineOptions: defaultPolylineOptions,
    visible: true
  };
}

// As an alternative, set static PolylineOptions to
// use for the anticipated route.
const anticipatedRoutePolylineOptionsSetup = {
  polylineOptions: {
    strokeOpacity: 0.5,
    strokeColor: 'red',
    …
  },
  visible: true,
};

TypeScript

// This function is specified in the
// JourneySharingMapView constructor's options
// parameter.
function anticipatedRoutePolylineSetup(options: {
  defaultPolylineOptions: google.maps.PolylineOptions,
  visible: boolean,
}): {
  polylineOptions: google.maps.PolylineOptions,
  visible: boolean,
} {
  // If this function is not specified, the
  // PolylineOptions object contained in
  // defaultPolylineOptions is used to render the
  // anticipated route polyline. visible property sets the
  // polyline's visibility. Modify this object and
  // pass it back to customize the style of the map.
  options.defaultPolylineOptions.strokeOpacity = 0.5;
  options.defaultPolylineOptions.strokeColor = 'red';
  return {
    polylineOptions: options.defaultPolylineOptions,
    visible: true
  };
}

// As an alternative, set static PolylineOptions to
// use for the anticipated route.
const anticipatedRoutePolylineSetup = {
  polylineOptions: {
    strokeOpacity: 0.5,
    strokeColor: 'red',
    …
  },
  visible: true,
};

Sử dụng các tuỳ chỉnh điểm đánh dấu

Với Thư viện theo dõi nhóm JavaScript, bạn có thể tuỳ chỉnh giao diện của các điểm đánh dấu được thêm vào bản đồ. Bạn thực hiện việc này bằng cách chỉ định các cách tuỳ chỉnh điểm đánh dấu. Thư viện theo dõi đội xe sẽ áp dụng điểm đánh dấu này trước khi thêm điểm đánh dấu vào bản đồ và trong mỗi lần cập nhật điểm đánh dấu.

Bạn có thể tạo một tuỳ chỉnh đơn giản bằng cách chỉ định một đối tượng MarkerOptions để áp dụng cho tất cả các điểm đánh dấu cùng loại. Các thay đổi đã chỉ định trong đối tượng sẽ được áp dụng sau khi mỗi điểm đánh dấu được tạo, ghi đè mọi tuỳ chọn mặc định.

Bạn có thể chỉ định một hàm tuỳ chỉnh là lựa chọn nâng cao hơn. Các hàm tuỳ chỉnh cho phép tạo kiểu cho điểm đánh dấu dựa trên dữ liệu, cũng như thêm tính tương tác vào điểm đánh dấu, chẳng hạn như xử lý lượt nhấp. Cụ thể, tính năng Theo dõi nhóm sẽ truyền dữ liệu sang chức năng tuỳ chỉnh về loại đối tượng mà điểm đánh dấu đại diện: xe, điểm dừng hoặc nhiệm vụ. Nhờ vậy, kiểu điểm đánh dấu có thể thay đổi dựa trên trạng thái hiện tại của chính phần tử đánh dấu đó; ví dụ: số điểm dừng còn lại hoặc loại tác vụ. Bạn thậm chí có thể kết hợp dữ liệu từ các nguồn bên ngoài Fleet Engine và tạo kiểu cho điểm đánh dấu dựa trên thông tin đó.

Ngoài ra, bạn có thể dùng các chức năng tuỳ chỉnh để lọc chế độ hiển thị điểm đánh dấu. Để thực hiện việc này, hãy gọi setVisible(false) trên điểm đánh dấu.

Tuy nhiên, vì lý do hiệu suất, bạn nên lọc bằng bộ lọc gốc trong trình cung cấp vị trí, chẳng hạn như FleetEngineFleetLocationProvider.vehicleFilter. Tuy nhiên, khi cần thêm chức năng lọc, bạn có thể áp dụng lọc bằng cách sử dụng chức năng tuỳ chỉnh.

Thư viện Theo dõi nhóm vận chuyển cung cấp các thông số tuỳ chỉnh sau:

Thay đổi kiểu của điểm đánh dấu bằng MarkerOptions

Ví dụ sau đây cho thấy cách định cấu hình kiểu của điểm đánh dấu xe bằng đối tượng MarkerOptions. Hãy làm theo mẫu này để tuỳ chỉnh kiểu của mọi điểm đánh dấu bằng cách sử dụng bất kỳ tham số tuỳ chỉnh điểm đánh dấu nào nêu trên.

JavaScript

vehicleMarkerCustomization = {
  cursor: 'grab'
};

TypeScript

vehicleMarkerCustomization = {
  cursor: 'grab'
};

Sử dụng các hàm tuỳ chỉnh để thay đổi kiểu của điểm đánh dấu

Ví dụ sau đây cho thấy cách định cấu hình kiểu của điểm đánh dấu xe. Hãy làm theo mẫu này để tuỳ chỉnh kiểu của một điểm đánh dấu bất kỳ bằng cách sử dụng bất kỳ thông số tuỳ chỉnh điểm đánh dấu nào nêu trên.

JavaScript

vehicleMarkerCustomization =
  (params) => {
    var remainingWaypoints = params.vehicle.waypoints.length;
    params.marker.setLabel(`${remainingWaypoints}`);
  };

TypeScript

vehicleMarkerCustomization =
  (params: VehicleMarkerCustomizationFunctionParams) => {
    var remainingWaypoints = params.vehicle.waypoints.length;
    params.marker.setLabel(`${remainingWaypoints}`);
  };

Thêm hoạt động xử lý lượt nhấp vào điểm đánh dấu

Ví dụ sau đây cho thấy cách thêm thao tác nhấp vào điểm đánh dấu xe. Hãy làm theo mẫu này để thêm thao tác xử lý lượt nhấp vào bất kỳ điểm đánh dấu nào bằng cách sử dụng bất kỳ tham số tuỳ chỉnh điểm đánh dấu nào nêu trên.

JavaScript

vehicleMarkerCustomization =
  (params) => {
    if (params.isNew) {
      params.marker.addListener('click', () => {
        // Perform desired action.
      });
    }
  };

TypeScript

vehicleMarkerCustomization =
  (params: VehicleMarkerCustomizationFunctionParams) => {
    if (params.isNew) {
      params.marker.addListener('click', () => {
        // Perform desired action.
      });
    }
  };

Lọc điểm đánh dấu có thể nhìn thấy

Ví dụ sau đây cho thấy cách lọc những điểm đánh dấu xe có thể nhìn thấy. Hãy làm theo mẫu này để lọc mọi điểm đánh dấu bằng cách sử dụng bất kỳ thông số tuỳ chỉnh điểm đánh dấu nào nêu trên.

JavaScript

vehicleMarkerCustomization =
  (params) => {
    var remainingWaypoints = params.vehicle.remainingWaypoints.length;
      if (remainingWaypoints > 10) {
        params.marker.setVisible(false);
      }
  };

TypeScript

vehicleMarkerCustomization =
  (params: VehicleMarkerCustomizationFunctionParams) => {
    var remainingWaypoints = params.vehicle.remainingWaypoints.length;
    if (remainingWaypoints > 10) {
      params.marker.setVisible(false);
    }
  };

Hiện InfoWindow cho xe hoặc điểm đánh dấu vị trí

Bạn có thể sử dụng InfoWindow để hiện thêm thông tin về xe hoặc điểm đánh dấu vị trí.

Ví dụ sau đây cho biết cách tạo InfoWindow và đính kèm mã này vào điểm đánh dấu xe.

JavaScript

// 1. Create an info window.
const infoWindow = new google.maps.InfoWindow(
    {disableAutoPan: true});

// (Assumes a vehicle location provider.)
locationProvider.addListener('update', e => {
  if (e.vehicle) {
    const distance =
          e.vehicle.remainingDistanceMeters;
    infoWindow.setContent(
        `Your vehicle is ${distance}m away from the next drop-off point.`);

    // 2. Attach the info window to a vehicle marker.
    // This property can return multiple markers.
    const marker = mapView.vehicleMarkers[0];
    infoWindow.open(mapView.map, marker);
  }
});

// 3. Close the info window.
infoWindow.close();

TypeScript

// 1. Create an info window.
const infoWindow = new google.maps.InfoWindow(
    {disableAutoPan: true});

// (Assumes a vehicle location provider.)
locationProvider.addListener('update', (e: google.maps.journeySharing.FleetEngineVehicleLocationProviderUpdateEvent) => {
  if (e.vehicle) {
    const distance =
          e.vehicle.remainingDistanceMeters;
    infoWindow.setContent(
        `Your vehicle is ${distance}m away from the next drop-off.`);
    // 2. Attach the info window to a vehicle marker.
    // This property can return multiple markers.
    const marker = mapView.vehicleMarkers[0];
    infoWindow.open(mapView.map, marker);
  }
});

// 3. Close the info window.
infoWindow.close();

Tắt tính năng tự động điều chỉnh

Bạn có thể ngăn bản đồ tự động điều chỉnh khung nhìn với xe và tuyến đường dự kiến bằng cách tắt tính năng tự động điều chỉnh. Ví dụ sau cho thấy cách tắt tính năng tự động điều chỉnh khi bạn định cấu hình chế độ xem bản đồ chia sẻ hành trình.

JavaScript

const mapView = new
    google.maps.journeySharing.JourneySharingMapView({
  element: document.getElementById('map_canvas'),
  locationProviders: [locationProvider],
  automaticViewportMode:
      google.maps.journeySharing
          .AutomaticViewportMode.NONE,
  ...
});

TypeScript

const mapView = new
    google.maps.journeySharing.JourneySharingMapView({
  element: document.getElementById('map_canvas'),
  locationProviders: [locationProvider],
  automaticViewportMode:
      google.maps.journeySharing
          .AutomaticViewportMode.NONE,
  ...
});

Thay thế bản đồ hiện tại

Bạn có thể thay thế bản đồ hiện có bao gồm các điểm đánh dấu hoặc các yếu tố tuỳ chỉnh khác mà không làm mất các yếu tố tuỳ chỉnh đó.

Ví dụ: giả sử bạn có một trang web có thực thể google.maps.Map chuẩn hiển thị điểm đánh dấu:

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* Set the size of the div element that contains the map */
      #map {
        height: 400px; /* The height is 400 pixels */
        width: 100%; /* The width is the width of the web page */
      }
    </style>
  </head>
  <body>
    <h3>My Google Maps Demo</h3>
    <!--The div element for the map -->
    <div id="map"></div>
    <script>
      // Initialize and add the map
      function initMap() {
        // The location of Oracle Park Stadium
        var oraclePark = { lat: 37.780087547237365, lng: -122.38948437884427 };,
        // The map, initially centered at Mountain View, CA.
        var map = new google.maps.Map(document.getElementById("map"));
        map.setOptions({ center: { lat: 37.424069, lng: -122.0916944 }, zoom: 14 });

        // The marker, now positioned at Oracle Park
        var marker = new google.maps.Marker({ position: oraclePark, map: map });
      }
    </script>
    <!-- Load the API from the specified URL.
      * The async attribute allows the browser to render the page while the API loads.
      * The key parameter will contain your own API key (which is not needed for this tutorial).
      * The callback parameter executes the initMap() function.
    -->
    <script
      defer
      src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
    ></script>
  </body>
</html>

Cách thêm thư viện Chia sẻ hành trình JavaScript, bao gồm cả tính năng Theo dõi nhóm thiết bị:

  1. Thêm mã cho nhà máy mã thông báo xác thực.
  2. Khởi động trình cung cấp vị trí trong hàm initMap().
  3. Khởi động chế độ xem bản đồ trong hàm initMap(). Khung hiển thị này sẽ chứa bản đồ.
  4. Di chuyển phần tuỳ chỉnh vào hàm callback để khởi chạy chế độ xem bản đồ.
  5. Thêm thư viện vị trí vào trình tải API.

Ví dụ sau đây cho thấy các thay đổi cần thực hiện:

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* Set the size of the div element that contains the map */
      #map {
        height: 400px; /* The height is 400 pixels */
        width: 100%; /* The width is the width of the web page */
      }
    </style>
  </head>
  <body>
    <h3>My Google Maps Demo</h3>
    <!--The div element for the map -->
    <div id="map"></div>
    <script>
      let locationProvider;

      // (1) Authentication Token Fetcher
      function authTokenFetcher(options) {
        // options is a record containing two keys called
        // serviceType and context. The developer should
        // generate the correct SERVER_TOKEN_URL and request
        // based on the values of these fields.
        const response = await fetch(SERVER_TOKEN_URL);
            if (!response.ok) {
              throw new Error(response.statusText);
            }
            const data = await response.json();
            return {
              token: data.Token,
              expiresInSeconds: data.ExpiresInSeconds
            };
      }

      // Initialize and add the map
      function initMap() {
        // (2) Initialize location provider. Use FleetEngineVehicleLocationProvider
        // as appropriate.
        locationProvider = new google.maps.journeySharing.FleetEngineVehicleLocationProvider({
          YOUR_PROVIDER_ID,
          authTokenFetcher,
        });

        // (3) Initialize map view (which contains the map).
        const mapView = new google.maps.journeySharing.JourneySharingMapView({
          element: document.getElementById('map'),
          locationProviders: [locationProvider],
          // any styling options
        });

      mapView.addListener('ready', () => {
        locationProvider.vehicleId = VEHICLE_ID;

          // (4) Add customizations like before.

          // The location of Oracle Park
          var oraclePark = {lat: 37.77995187146094, lng: -122.38957020952795};
          // The map, initially centered at Mountain View, CA.
          var map = mapView.map;
          map.setOptions({center: {lat: 37.424069, lng: -122.0916944}, zoom: 14});
          // The marker, now positioned at Oracle Park
          var marker = new google.maps.Marker({position: oraclePark, map: map});
        };
      }
    </script>
    <!-- Load the API from the specified URL
      * The async attribute allows the browser to render the page while the API loads
      * The key parameter will contain your own API key (which is not needed for this tutorial)
      * The callback parameter executes the initMap() function
      *
      * (5) Add the journey sharing library to the API loader, which includes Fleet Tracking functionality.
    -->
    <script
      defer
      src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap&libraries=journeySharing&v=beta"
    ></script>
  </body>
</html>

Nếu bạn vận hành một phương tiện có mã nhận dạng đã chỉ định ở gần Oracle Park, thì phương tiện đó sẽ kết xuất trên bản đồ.