Lớp phủ mặt đất

Chọn nền tảng: Android iOS JavaScript

Lớp phủ mặt đất là các lớp hình ảnh được gắn với vĩ độ/kinh độ để chúng di chuyển khi bạn kéo hoặc thu phóng bản đồ.

Mã mẫu

Kho lưu trữ Apidemos trên GitHub bao gồm một mẫu minh hoạ các lớp trên mặt đất:

Giới thiệu

Lớp phủ mặt đất là hình ảnh được cố định vào bản đồ. Không giống như điểm đánh dấu, mặt đất các lớp phủ này được định hướng dựa vào bề mặt Trái đất chứ không phải màn hình, vì vậy xoay, nghiêng hoặc thu phóng bản đồ sẽ thay đổi hướng của hình ảnh. Lớp phủ mặt đất hữu ích khi bạn muốn sửa một hình ảnh tại một vùng trên bản đồ. Nếu bạn muốn thêm hình ảnh bao quát phần lớn bản đồ, bạn nên xem xét lớp phủ Thẻ thông tin.

Thêm lớp phủ

Để thêm GroundOverlay, hãy tạo một GroundOverlayOptions xác định cả hình ảnh và vị trí. Bạn có thể tuỳ ý chỉ định các chế độ cài đặt bổ sung sẽ ảnh hưởng đến vị trí của hình ảnh trên bản đồ. Sau khi xác định được các tuỳ chọn cần thiết, hãy truyền đối tượng đến GoogleMap.addGroundOverlay() để thêm hình ảnh vào bản đồ. Phương thức addGroundOverlay() trả về một đối tượng GroundOverlay; bạn nên giữ lại tệp tham chiếu đến đối tượng này nếu bạn muốn sửa đổi sau.

Hướng dẫn từng bước:

  1. Tạo thực thể cho đối tượng GroundOverlayOptions mới
  2. Chỉ định hình ảnh là BitmapDescriptor.
  3. Đặt vị trí của hình ảnh bằng một trong các phương pháp có sẵn:
    • position(LatLng location, float width, float height)
    • position(LatLng location, float width)
    • positionFromBounds(LatLngBounds bounds)
  4. Đặt mọi thuộc tính không bắt buộc, chẳng hạn như transparency, nếu muốn.
  5. Gọi GoogleMap.addGroundOverlay() để thêm hình ảnh vào bản đồ.

Ví dụ dưới đây minh hoạ cách thêm lớp phủ mặt đất cho một lớp phủ hiện có Đối tượng GoogleMap.

Kotlin

val newarkLatLng = LatLng(40.714086, -74.228697)
val newarkMap = GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .position(newarkLatLng, 8600f, 6500f)
map.addGroundOverlay(newarkMap)

      

Java

LatLng newarkLatLng = new LatLng(40.714086, -74.228697);

GroundOverlayOptions newarkMap = new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .position(newarkLatLng, 8600f, 6500f);
map.addGroundOverlay(newarkMap);

      

Nếu bạn muốn thay đổi hoặc xoá lớp phủ mặt đất sau khi đã thêm lớp phủ đó vào bản đồ, hãy nhớ giữ đối tượng GroundOverlay. Bạn có thể sửa đổi lớp phủ sau bằng cách thay đổi đối tượng này.

Kotlin

// Add an overlay to the map, retaining a handle to the GroundOverlay object.
val imageOverlay = map.addGroundOverlay(newarkMap)

      

Java

// Add an overlay to the map, retaining a handle to the GroundOverlay object.
GroundOverlay imageOverlay = map.addGroundOverlay(newarkMap);

      

Xoá lớp phủ

Bạn có thể xoá lớp phủ mặt đất bằng Phương thức GroundOverlay.remove().

Kotlin

imageOverlay?.remove()

      

Java

imageOverlay.remove();

      

Thay đổi lớp phủ

Bạn có thể thay đổi hình ảnh lớp phủ mặt đất sau khi nó được thêm vào bản đồ bằng phương thức GroundOverlay.setImage(BitmapDescriptor).

Kotlin

// Update the GroundOverlay with a new image of the same dimension
imageOverlay?.setImage(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))

      

Java

// Update the GroundOverlay with a new image of the same dimension
imageOverlay.setImage(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922));

      

Phương thức setImage() sẽ thay thế hình ảnh hiện tại bằng một hình ảnh khác của có cùng phương diện.

Định vị Lớp phủ Mặt đất

Có hai cách để chỉ định vị trí của lớp phủ mặt đất:

  • Sử dụng LatLng để căn giữa lớp phủ và các kích thước tính bằng mét để chỉ định kích thước của hình ảnh.
  • Sử dụng LatLngBounds để chỉ định các góc đông bắc và tây nam của hình ảnh.

Bạn phải chỉ định vị trí của lớp phủ mặt đất trước khi nó được thêm vào bản đồ.

Sử dụng vị trí để định vị hình ảnh

Khi thêm hình ảnh, bạn chỉ định LatLng mà neo sẽ được cố định và chiều rộng của lớp phủ (tính bằng mét). Chiến lược phát hành đĩa đơn Theo mặc định, anchor sẽ nằm chính giữa hình ảnh. Bạn có thể tuỳ ý cung cấp chiều cao của lớp phủ (tính bằng mét). Nếu bạn không cung cấp chiều cao của lớp phủ, nó sẽ tự động được tính toán để duy trì tỷ lệ hình ảnh.

Đoạn mã dưới đây đặt một hình ảnh tại vị trí 40.714086, -74.228697 rộng 8,6 km và cao 6,5 km. Hình ảnh được neo vào phía dưới cùng bên trái.

Kotlin

val newarkMap = GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .anchor(0f, 1f)
    .position(LatLng(40.714086, -74.228697), 8600f, 6500f)

      

Java

GroundOverlayOptions newarkMap = new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .anchor(0, 1)
    .position(new LatLng(40.714086, -74.228697), 8600f, 6500f);

      

Sử dụng LatLngBounds để định vị hình ảnh

Bạn cung cấp LatLngBounds chứa hình ảnh đó. Chiến lược phát hành đĩa đơn LatLngBounds đặt góc đông bắc và tây nam của hình ảnh. Thời gian hình ảnh được vẽ trên bản đồ, hình ảnh sẽ được xoay cho vừa với ranh giới. Nếu giới hạn không khớp với tỷ lệ khung hình gốc, hình ảnh sẽ bị lệch.

Mã dưới đây đặt một hình ảnh trên bản đồ với góc Tây Nam giáp với 40.712216,-74.22655 và góc Đông Bắc giáp với 40.773941, -74.12544.

Kotlin

val newarkBounds = LatLngBounds(
    LatLng(40.712216, -74.22655),  // South west corner
    LatLng(40.773941, -74.12544)   // North east corner
)
val newarkMap = GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .positionFromBounds(newarkBounds)

      

Java

LatLngBounds newarkBounds = new LatLngBounds(
    new LatLng(40.712216, -74.22655),       // South west corner
    new LatLng(40.773941, -74.12544));      // North east corner
GroundOverlayOptions newarkMap = new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .positionFromBounds(newarkBounds);

      

Liên kết dữ liệu với lớp phủ mặt đất

Bạn có thể gọi GroundOverlay.setTag() để lưu trữ một đối tượng dữ liệu tuỳ ý có lớp phủ mặt đất và truy xuất dữ liệu bằng GroundOverlay.getTag().

Mã mẫu sau đây lưu trữ nội dung mô tả chuỗi có lớp phủ mặt đất:

Kotlin

val sydneyGroundOverlay = map.addGroundOverlay(
    GroundOverlayOptions()
        .image(BitmapDescriptorFactory.fromResource(R.drawable.harbour_bridge))
        .position(LatLng(-33.873, 151.206), 100f)
        .clickable(true)
)
sydneyGroundOverlay?.tag = "Sydney"

      

Java

GroundOverlay sydneyGroundOverlay = map.addGroundOverlay(new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.harbour_bridge))
    .position(new LatLng(-33.873, 151.206), 100)
    .clickable(true));

sydneyGroundOverlay.setTag("Sydney");

      

Dưới đây là một số ví dụ về các trường hợp hữu ích trong việc lưu trữ và truy xuất dữ liệu có lớp phủ mặt đất:

  • Ứng dụng của bạn có thể phục vụ cho các lớp phủ mặt đất khác nhau và bạn muốn xử lý chúng theo cách khác nhau khi người dùng nhấp vào chúng.
  • Bạn có thể đang tiếp xúc với một hệ thống có mã nhận dạng bản ghi duy nhất, nơi các lớp phủ biểu thị các bản ghi cụ thể trong hệ thống đó.
  • Dữ liệu lớp phủ có thể cho biết mức độ ưu tiên để xác định chỉ mục z cho lớp phủ.

Xử lý sự kiện lớp phủ mặt đất

Theo mặc định, các lớp trên mặt đất được không thể nhấp vào. Bạn có thể bật và tắt khả năng nhấp bằng cách gọi GroundOverlay.setClickable(boolean).

Sử dụng OnGroundOverlayClickListener để nghe các sự kiện nhấp chuột trên lớp phủ mặt đất có thể nhấp. Để bật trình nghe này bản đồ, gọi GoogleMap.setOnGroundOverlayClickListener(OnGroundOverlayClickListener). Khi người dùng nhấp vào lớp phủ trên mặt đất, bạn sẽ nhận được Lệnh gọi lại onGroundOverlayClick(GroundOverlay).