Lớp phủ mặt đất

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

Lớp phủ mặt đất là lớp phủ hình ảnh được gắn với tọa độ vĩ độ/kinh độ, vì vậy lớp phủ sẽ 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 phủ 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, lớp phủ mặt đất được định hướng dựa trên nền tảng của Earth thay vì màn hình, vì vậy, việc 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 sẽ hữu ích khi bạn muốn sửa một hình ảnh tại một khu vực trên bản đồ. Nếu bạn muốn thêm hình ảnh mở rộng bao phủ phần lớn bản đồ, bạn nên xem xét Lớp phủ ô.

Thêm lớp phủ

Để thêm một GroundOverlay, hãy tạo một đối tượng 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 bạn xác định được các tùy chọn cần thiết, hãy truyền đối tượng đến phương thức GoogleMap.addGroundOverlay() để thêm hình ảnh vào bản đồ. Phương thức addGroundOverlay() trả về đối tượng GroundOverlay; bạn nên giữ lại tệp tham chiếu đến đối tượng này nếu muốn sửa đổi sau này.

Từng bước:

  1. Tạo bản sao của đối tượng GroundOverlayOptions mới
  2. Hãy chỉ định hình ảnh dưới dạng BitmapDescriptor.
  3. Đặt vị trí của hình ảnh bằng một trong những phương thức có sẵn:
    • position(LatLng location, float width, float height)
    • position(LatLng location, float width)
    • positionFromBounds(LatLngBounds bounds)
  4. Đặt bất kỳ thuộc tính tùy chọn nào, 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ụ bên dưới minh hoạ cách thêm lớp phủ mặt đất vào đối tượng GoogleMap hiện có.

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);

      

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)

      

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

Java


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

      

Kotlin


// Add an overlay to the map, retaining a handle to the GroundOverlay object.
val 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().

Java


imageOverlay.remove();

      

Kotlin


imageOverlay?.remove()

      

Thay đổi lớp phủ

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

Java


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

      

Kotlin


// Update the GroundOverlay with a new image of the same dimension

// 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 có bằng một hình ảnh khác có cùng kích thước.

Đị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à đo kích thước 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 phía đô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 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 một LatLng để neo cố định vào và chiều rộng của lớp phủ (tính bằng mét). anchor được đặt ở giữa của hình ảnh theo mặc định. Bạn có thể tùy ý 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ủ, hệ thống sẽ tự động tính toán chiều cao để giữ nguyên tỷ lệ của hình ảnh.

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

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);

      

Kotlin


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

      

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

Bạn cung cấp một LatLngBounds chứa hình ảnh. LatLngBounds đặt góc đông bắc và tây nam của hình ảnh. Khi được vẽ trên bản đồ, hình ảnh sẽ được xoay cho vừa với ranh giới. Nếu các 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 đồ có góc Tây Nam giới hạn với 40.712216,-74.22655 và góc Đông Bắc của nó được giới hạn với 40.773941, -74.12544.

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);

      

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)

      

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 đối tượng dữ liệu đó bằng GroundOverlay.getTag().

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

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");

      

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"

      

Dưới đây là một số ví dụ về các tình huống mà bạn nên lưu trữ và truy xuất dữ liệu bằng lớp phủ mặt đất:

  • Ứng dụng của bạn có thể phân phát cho các lớp phủ trên mặt đất khác nhau và bạn muốn xử lý chúng theo nhiều cách khi người dùng nhấp vào các lớp phủ đó.
  • Bạn có thể giao tiếp với một hệ thống có các giá trị nhận dạng bản ghi duy nhất, trong đó các lớp phủ thể hiện các bản ghi cụ thể trong hệ thống đó.
  • Dữ liệu lớp phủ có thể cho thấy 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 phủ mặt đất 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 để theo dõi các sự kiện nhấp chuột trên lớp phủ mặt đất có thể nhấp. Để thiết lập trình nghe này trên bản đồ, hãy gọi GoogleMap.setOnGroundOverlayClickListener(OnGroundOverlayClickListener). Khi người dùng nhấp vào lớp phủ mặt đất, bạn sẽ nhận được lệnh gọi lại onGroundOverlayClick(GroundOverlay).