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:
- GroundOverlay DemoActivity – Java: Các tính năng lớp phủ mặt đất và trình nghe trong Java
- GroundOverlay DemoActivity – Kotlin: Các tính năng lớp phủ mặt đất và trình nghe trong Kotlin
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:
- Tạo thực thể cho đối tượng
GroundOverlayOptions
mới - Chỉ định hình ảnh là
BitmapDescriptor
. - Đặ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)
- Đặt mọi thuộc tính không bắt buộc, chẳng hạn như
transparency
, nếu muốn. - 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 // 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. 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)
.