Định cấu hình bản đồ

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

Chủ đề này mô tả cách định cấu hình bản đồ đã được thêm vào ứng dụng Android bằng cách sử dụng SDK Maps dành cho Android.

Tổng quan

Ảnh chụp màn hình bản đồ Kyto với các chế độ cài đặt bản đồ đã định cấu hình. Sau khi thêm bản đồ vào ứng dụng, bạn có thể định cấu hình chế độ cài đặt ban đầu và thời gian chạy của bản đồ. Các chế độ cài đặt ban đầu cần được định cấu hình dựa trên việc bạn thêm vùng chứa bản đồ (SupportMapFragment hay MapView) theo cách tĩnh hay động. Nếu vùng chứa bản đồ được thêm ở dạng tĩnh, bạn có thể định cấu hình các chế độ cài đặt bản đồ ban đầu trong tệp bố cục. Nếu đối tượng được thêm vào theo phương thức động, bạn có thể định cấu hình các chế độ cài đặt ban đầu trong lệnh gọi lại OnCreate với đối tượng GoogleMapOptions.

Để biết thông tin chi tiết về việc thêm vùng chứa bản đồ, hãy xem phần Thêm bản đồ.

Cài đặt bản đồ ban đầu bao gồm:

Trong thời gian chạy, bạn có thể định cấu hình các chế độ cài đặt này và một số chế độ cài đặt bổ sung bằng cách cập nhật đối tượng GoogleMap trong lệnh gọi lại onMapReady. Các chế độ cài đặt bổ sung được định cấu hình thông qua các phương thức của lớp GoogleMap, chẳng hạn như các phương thức định cấu hình lớp lưu lượng truy cậpkhoảng đệm bản đồ.

Ví dụ:

Trong mã ví dụ bên dưới và ảnh chụp màn hình ở trên, bản đồ được định cấu hình với các chế độ cài đặt sau.

Các chế độ cài đặt ban đầu được định cấu hình trong tệp bố cục:

  • Bật các chế độ điều khiển thu phóng.
  • Bật các tùy chọn điều khiển cử chỉ xoay.
  • Đặt độ nghiêng bản đồ thành 30.

Chế độ cài đặt thời gian chạy:

  • Căn giữa máy ảnh theo hướng Tokyo Nhật Bản.
  • Bật loại bản đồ kết hợp.
  • Bật lớp giao thông.

Chế độ cài đặt ban đầu


<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    map:uiZoomControls="true"
    map:uiRotateGestures="true"
    map:cameraTilt="30" />
    

Chế độ cài đặt thời gian chạy

package com.example.mapsetup;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    // Update the map configuration at runtime.
    @Override
    public void onMapReady(GoogleMap googleMap) {
        // Set the map coordinates to Kyoto Japan.
        LatLng kyoto = new LatLng(35.00116, 135.7681);
        // Set the map type to Hybrid.
        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        // Add a marker on the map coordinates.
        googleMap.addMarker(new MarkerOptions()
                .position(kyoto)
                .title("Kyoto"));
        // Move the camera to the map coordinates and zoom in closer.
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(kyoto));
        googleMap.moveCamera(CameraUpdateFactory.zoomTo(15));
        // Display traffic.
        googleMap.setTrafficEnabled(true);

    }
}

Trước khi bắt đầu

Trước khi bắt đầu, bạn có thể thiết lập một dự án và thêm bản đồ cơ bản thông qua các lựa chọn sau:

  • Tạo một ứng dụng bằng mẫu Maps dành cho Android Studio. Mẫu Maps tự động định cấu hình dự án của bạn và thêm một bản đồ cơ bản. Mảnh được dùng làm vùng chứa bản đồ và được thêm vào theo phương thức tĩnh. Để biết thông tin chi tiết, hãy xem phần quickstart.

  • Định cấu hình dự án theo cách thủ công cho SDK và thêm bản đồ cơ bản. Điều này cho phép bạn sử dụng bất kỳ mẫu Android nào và thêm bản đồ vào ứng dụng hiện có.

Định cấu hình bản đồ sau khi thêm bản đồ tĩnh

Phần này mô tả cách đặt trạng thái ban đầu của bản đồ nếu bạn đã thêm bản đồ theo cách tĩnh vào tệp bố cục.

SDK bản đồ dành cho Android xác định một tập hợp thuộc tính XML tuỳ chỉnh cho SupportMapFragment hoặc MapView mà bạn có thể sử dụng để định cấu hình trạng thái ban đầu của bản đồ ngay trong tệp bố cục. Các thuộc tính sau hiện đã được xác định:

  • mapType — Loại bản đồ cần hiển thị. Các giá trị hợp lệ bao gồm: none, normal, hybrid, satelliteterrain.

  • cameraTargetLat, cameraTargetLng, cameraZoom, cameraBearing, cameraTilt — Vị trí camera ban đầu. Vui lòng xem hướng dẫn về camera và chế độ xem để biết thông tin chi tiết.

  • uiZoomControls, uiCompass – Chỉ định xem các chế độ điều khiển thu phóng và la bàn có được hiển thị hay không. Hãy xem UiSettings để biết thông tin chi tiết.

  • uiZoomGestures, uiScrollGestures, uiRotateGestures, uiTiltGestures – Chỉ định xem có bật các cử chỉ cụ thể hay không. Hãy xem UiSettings để biết thông tin chi tiết.

  • zOrderOnTop – Cho biết liệu bề mặt của chế độ xem bản đồ có được hiển thị trên đầu cửa sổ bản đồ, các thành phần điều khiển bản đồ và bất kỳ đối tượng nào trong cửa sổ đó hay không. Hãy xem SurfaceView.setZOrderOnTop(boolean) để biết chi tiết.

  • useViewLifecycle – Chỉ hợp lệ với đối tượng SupportMapFragment. Chỉ định xem vòng đời của bản đồ nên liên kết với khung hiển thị của mảnh hay chính mảnh đó. Xem tại đây để biết chi tiết.

  • liteModetrue để bật chế độ thu gọn; nếu không, hãy false.

  • mapColorScheme – Chỉ định bảng phối màu cho bản đồ thông thường và bản đồ địa hình. Các giá trị bao gồm light (mặc định), darkfollow_system, nghĩa là sử dụng chế độ cài đặt hệ thống hiện tại dựa trên chế độ cài đặt của thiết bị cho UI_NIGHT_MODE_MASK. Để biết thêm thông tin, hãy xem phần Bảng phối màu của bản đồ.

Để sử dụng các thuộc tính tuỳ chỉnh này trong tệp bố cục, tệp phải bao gồm nội dung khai báo không gian tên sau đây. Bạn có thể chọn bất kỳ không gian tên nào, không nhất thiết phải là map:

xmlns:map="http://schemas.android.com/apk/res-auto"

Sau đó, bạn có thể thêm các thuộc tính có tiền tố map: vào tệp bố cục.

Tệp bố cục sau đây định cấu hình một đối tượng SupportMapFragment bằng các thuộc tính bản đồ tuỳ chỉnh. Bạn cũng có thể áp dụng các thuộc tính tương tự cho đối tượng MapView.

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:map="http://schemas.android.com/apk/res-auto"
  android:name="com.google.android.gms.maps.SupportMapFragment"
  android:id="@+id/map"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  map:cameraBearing="112.5"
  map:cameraTargetLat="-33.796923"
  map:cameraTargetLng="150.922433"
  map:cameraTilt="30"
  map:cameraZoom="13"
  map:mapType="normal"
  map:mapColorScheme="dark"
  map:uiCompass="false"
  map:uiRotateGestures="true"
  map:uiScrollGestures="false"
  map:uiTiltGestures="true"
  map:uiZoomControls="false"
  map:uiZoomGestures="true"/>

Định cấu hình bản đồ sau khi thêm bản đồ một cách linh động

Phần này mô tả cách đặt trạng thái ban đầu của bản đồ nếu bạn đã thêm bản đồ vào ứng dụng theo cách linh động.

Nếu đã thêm SupportMapFragment hoặc MapView theo phương thức động, thì bạn có thể đặt trạng thái ban đầu của bản đồ trong đối tượng GoogleMapOptions. Các tuỳ chọn có sẵn cũng giống như các tuỳ chọn có trong tệp bố cục. Bạn có thể tạo GoogleMapOptions như sau:

Kotlin



val options = GoogleMapOptions()

      

Java


GoogleMapOptions options = new GoogleMapOptions();

      

Sau đó, hãy định cấu hình thẻ như sau:

Kotlin



options.mapType(GoogleMap.MAP_TYPE_SATELLITE)
    .compassEnabled(false)
    .rotateGesturesEnabled(false)
    .tiltGesturesEnabled(false)

      

Java


options.mapType(GoogleMap.MAP_TYPE_SATELLITE)
    .compassEnabled(false)
    .rotateGesturesEnabled(false)
    .tiltGesturesEnabled(false);

      

Để áp dụng các tùy chọn này khi bạn tạo bản đồ, hãy làm theo một trong những cách sau:

Thiết lập lớp giao thông

Bạn có thể hiển thị dữ liệu giao thông trên bản đồ của mình bằng cách bật lớp giao thông. Bạn có thể bật và tắt lớp lưu lượng truy cập bằng cách gọi phương thức setTrafficEnabled() và có thể xác định xem lớp lưu lượng truy cập hiện có đang bật hay không bằng cách gọi phương thức isTrafficEnabled(). Ảnh chụp màn hình sau đây hiển thị bản đồ có lớp giao thông được bật.

Đặt loại bản đồ

Để đặt loại bản đồ, hãy gọi phương thức setMapType. Ví dụ: để hiển thị bản đồ vệ tinh:

Kotlin



// Sets the map type to be "hybrid"
map.mapType = GoogleMap.MAP_TYPE_HYBRID

      

Java


// Sets the map type to be "hybrid"
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);

      

Hình ảnh sau đây so sánh các loại bản đồ thông thường, kết hợp và địa hình:

So sánh MapType

Thiết lập toà nhà 3D

Nhiều thành phố, khi được xem cận cảnh, sẽ có các toà nhà 3D có thể nhìn thấy, như có thể xem trong hình dưới đây của Vancouver, Canada. Bạn có thể tắt toà nhà 3d bằng cách gọi GoogleMap.setBuildingsEnabled(false).

Bản đồ của Vancouver, Canada

Thiết lập chế độ cài đặt bản đồ trong nhà

Ở mức thu phóng cao, bản đồ hiển thị sơ đồ tầng cho các không gian trong nhà như sân bay, trung tâm mua sắm, cửa hàng bán lẻ lớn và trạm phương tiện công cộng. Các sơ đồ tầng này, được gọi là bản đồ trong nhà, được hiển thị cho các loại bản đồ "bình thường" và "vệ tinh" (GoogleMap.MAP_TYPE_NORMALGoogleMap.MAP_TYPE_SATELLITE). Chúng được tự động bật khi người dùng phóng to và mờ dần khi bản đồ được thu nhỏ.

Thông báo về việc ngừng sử dụng: Trong bản phát hành sau này, bản đồ trong nhà sẽ chỉ có trên loại bản đồ normal. Kể từ bản phát hành sau này, sơ đồ trong nhà sẽ không được hỗ trợ trên bản đồ satellite, terrain hoặc hybrid. Ngay cả khi không hỗ trợ trong nhà, isIndoorEnabled() vẫn sẽ tiếp tục trả về giá trị đã đặt qua setIndoorEnabled() như hiện tại. Theo mặc định, setIndoorEnabledtrue. Ghi chú phát hành sẽ cho bạn biết khi tính năng hỗ trợ trong nhà không hoạt động trên các loại bản đồ đó.

Ví dụ về bản đồ trong nhà

Dưới đây là tóm tắt về chức năng bản đồ trong nhà trong API:

  • Bạn có thể tắt bản đồ trong nhà bằng cách gọi GoogleMap.setIndoorEnabled(false). Bản đồ trong nhà được bật theo mặc định. Bản đồ trong nhà hiển thị trên một bản đồ tại một thời điểm. Theo mặc định, đây là bản đồ đầu tiên được thêm vào ứng dụng của bạn. Để hiển thị bản đồ trong nhà trên một bản đồ khác, hãy tắt các bản đồ này trên bản đồ đầu tiên, sau đó gọi setIndoorEnabled(true) trên bản đồ thứ hai.
  • Để tắt công cụ chọn mức mặc định (bộ chọn tầng), hãy gọi GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false). Để biết thêm thông tin, hãy xem bài viết Tương tác với bản đồ.
  • OnIndoorStateChangeListener – xác định trình nghe có chức năng phát hiện thời điểm một toà nhà xuất hiện hoặc một cấp được kích hoạt trong một toà nhà. Để biết thông tin chi tiết, hãy xem bài viết Tương tác với Bản đồ.
  • getFocusedBuilding – truy xuất toà nhà được lấy tiêu điểm. Sau đó, bạn có thể tìm cấp độ đang hoạt động bằng cách gọi IndoorBuilding.getActiveLevelIndex().
  • Tạo kiểu cho bản đồ cơ sở không ảnh hưởng đến bản đồ trong nhà.

Thiết lập khoảng đệm bản đồ

Video này minh hoạ một ví dụ về khoảng đệm bản đồ.

Bản đồ Google được thiết kế để lấp đầy toàn bộ khu vực được xác định bởi phần tử vùng chứa của nó, thường là MapView hoặc SupportMapFragment. Một số khía cạnh về cách bản đồ xuất hiện và hoạt động được xác định theo kích thước của vùng chứa của bản đồ:

  • Mục tiêu của máy ảnh sẽ phản ánh chính giữa của vùng đệm.
  • Điều khiển bản đồ được đặt tương ứng với các cạnh của bản đồ.
  • Thông tin pháp lý, chẳng hạn như tuyên bố về bản quyền hoặc biểu trưng của Google sẽ xuất hiện dọc theo cạnh dưới của bản đồ.

Bạn có thể thêm khoảng đệm xung quanh các cạnh của bản đồ bằng cách sử dụng GoogleMap.Phương thức setPadding(). Bản đồ sẽ tiếp tục lấp đầy toàn bộ vùng chứa, nhưng văn bản và thành phần điều khiển vị trí, cử chỉ trên bản đồ và chuyển động của máy ảnh sẽ hoạt động như thể được đặt trong một không gian nhỏ hơn. Điều này dẫn đến những thay đổi sau:

  • Chuyển động của máy ảnh thông qua các lệnh gọi API hoặc thao tác nhấn nút (ví dụ: la bàn, vị trí của tôi, nút thu phóng) có liên quan đến vùng đệm.
  • Phương thức getCameraPosition trả về tâm của vùng đệm.
  • Phương thức ProjectiongetVisibleRegion trả về vùng đệm.
  • Các thành phần điều khiển trên giao diện người dùng được bù trừ từ cạnh của vùng chứa theo số lượng pixel đã chỉ định.

Khoảng đệm có thể hữu ích khi thiết kế giao diện người dùng chồng chéo lên một số phần của bản đồ. Trong hình sau, bản đồ được đệm dọc theo các cạnh trên cùng và bên phải. Các thành phần điều khiển bản đồ hiển thị và văn bản pháp lý sẽ hiển thị dọc theo cạnh của khu vực khoảng đệm, được hiển thị bằng màu xanh lục, trong khi bản đồ sẽ tiếp tục lấp đầy toàn bộ vùng chứa, được hiển thị bằng màu xanh dương. Trong ví dụ này, bạn có thể làm nổi một trình đơn ở bên phải bản đồ mà không cần che khuất các thành phần điều khiển trên bản đồ.

Khoảng đệm bản đồ

Bảng phối màu bản đồ

Đối với các bản đồ có kiểu thông thường và địa hình, bạn có thể linh động thiết lập bảng phối màu của bản đồ thành tối, sáng hoặc sử dụng chế độ cài đặt hệ thống hiện tại. Ví dụ: bạn có thể làm tối hoặc làm sáng bảng phối màu của bản đồ dựa trên thời gian trong ngày, việc sử dụng thiết bị trong nhà hay ngoài trời.

Theo mặc định, bản đồ sử dụng chế độ sáng. Giá trị cài đặt hệ thống hiện tại dựa trên chế độ cài đặt của UI_NIGHT_MODE_MASK trên thiết bị.

Kotlin

mapFragment = SupportMapFragment.newInstance(GoogleMapOptions().mapColorScheme(MapColorScheme.DARK).mapId(mapId2))

Java

mapFragment = SupportMapFragment.newInstance(new GoogleMapOptions().mapColorScheme(MapColorScheme.DARK).mapId(mapId2));

Bạn có thể bật/tắt bảng phối màu bằng cách sử dụng phương thức GoogleMap.setMapColorScheme() để đặt kiểu hiện tại thành chế độ tối, chế độ sáng hoặc làm theo chế độ cài đặt hệ thống.

Kotlin

googleMap.setMapColorScheme(MapColorScheme.DARK)
googleMap.setMapColorScheme(MapColorScheme.LIGHT)
googleMap.setMapColorScheme(MapColorScheme.FOLLOW_SYSTEM)

Java

googleMap.setMapColorScheme(MapColorScheme.DARK);
googleMap.setMapColorScheme(MapColorScheme.LIGHT);
googleMap.setMapColorScheme(MapColorScheme.FOLLOW_SYSTEM);