Konfigurowanie mapy

Wybierz platformę: Android iOS

W tym temacie opisujemy, jak skonfigurować mapę dodaną do aplikacji na Androida za pomocą pakietu SDK Map Google na Androida.

Przegląd

Zrzut ekranu mapy Kito ze skonfigurowanymi ustawieniami mapy.Po dodaniu mapy do aplikacji możesz skonfigurować jej ustawienia początkowe i czasowe. Początkowe ustawienia musisz skonfigurować w zależności od tego, czy kontener mapy (SupportMapFragment lub MapView) został dodany statycznie czy dynamicznie. Jeśli kontener mapy został dodany statycznie, możesz skonfigurować początkowe ustawienia mapy w pliku układu. Jeśli zostało dodane dynamicznie, możesz skonfigurować ustawienia początkowe w wywołaniu zwrotnym OnCreate za pomocą obiektu GoogleMapOptions.

Więcej informacji o dodawaniu kontenera mapy znajdziesz w sekcji Dodawanie mapy.

Początkowe ustawienia mapy obejmują:

  • Pozycja kamery, w tym: lokalizacja, powiększenie, kierunek i pochylenie kamery. Szczegółowe informacje o pozycjonowaniu kamery znajdziesz w sekcji Aparat i widok.
  • Typ mapy.
  • Komponenty interfejsu, które mają być wyświetlane, np. przyciski powiększenia i kompas.
  • Gesty, które mają zostać włączone.
  • Określa, czy wersja uproszczona jest włączona.

Te ustawienia i niektóre dodatkowe ustawienia możesz skonfigurować w środowisku wykonawczym, aktualizując obiekt GoogleMap w wywołaniu zwrotnym onMapReady. Dodatkowe ustawienia konfiguruje się za pomocą metod klasy GoogleMap, np. tych, które konfiguruje warstwę ruchu i dopełnienie mapy.

Przykład

W przykładowym kodzie poniżej i na zrzucie ekranu powyżej mapa jest skonfigurowana z tymi ustawieniami.

Początkowe ustawienia konfiguruje się w pliku układu:

  • Włącz elementy sterujące powiększeniem.
  • Włącz sterowanie gestami obracania.
  • Ustaw pochylenie mapy na 30.

Ustawienia środowiska wykonawczego:

  • Wyśrodkuj aparat na Kioto, Japonia.
  • Włącz typ mapy hybrydowej.
  • Włącz warstwę natężenia ruchu.

Ustawienia początkowe


<?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" />
    

Ustawienia środowiska wykonawczego

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

    }
}

Zanim zaczniesz

Zanim zaczniesz, możesz skonfigurować projekt i dodać mapę podstawową, korzystając z tych opcji:

  • Utwórz aplikację, korzystając z szablonu Map dla Android Studio. Szablon Map automatycznie konfiguruje projekt i dodaje podstawową mapę. Fragment jest używany jako kontener mapy i jest dodawany statycznie. Więcej informacji znajdziesz w quickstart.

  • Ręcznie skonfiguruj projekt na potrzeby pakietu SDK i dodaj mapę podstawową. Dzięki temu możesz użyć dowolnego szablonu na Androida i dodać mapę do istniejącej aplikacji.

Konfigurowanie mapy po jej statycznej dodaniu

W tej sekcji opisujemy, jak ustawić początkowy stan mapy, jeśli został on dodany statycznie do pliku układu.

Pakiet SDK Map Google na Androida definiuje zestaw niestandardowych atrybutów XML dla obiektów SupportMapFragment lub MapView, których możesz użyć do skonfigurowania początkowego stanu mapy bezpośrednio w pliku układu. Obecnie zdefiniowane są te atrybuty:

  • mapType – typ mapy do wyświetlenia. Prawidłowe wartości to none, normal, hybrid, satellite i terrain.

  • cameraTargetLat, cameraTargetLng, cameraZoom, cameraBearing, cameraTilt – początkowa pozycja kamery. Szczegółowe informacje znajdziesz w przewodniku dotyczącym aparatu i widoków.

  • uiZoomControls, uiCompass – określa, czy mają być wyświetlane elementy sterujące powiększeniem i kompas. Więcej informacji: UiSettings.

  • uiZoomGestures, uiScrollGestures, uiRotateGestures, uiTiltGestures – określa, czy są włączone określone gesty. Więcej informacji znajdziesz w sekcji UiSettings.

  • zOrderOnTop – wskazuje, czy powierzchnia widoku mapy jest wyświetlana u góry okna mapy, elementów sterujących mapy i dowolnego obiektu w oknie. Więcej informacji znajdziesz w sekcji SurfaceView.setZOrderOnTop(boolean).

  • useViewLifecycle – prawidłowy tylko z obiektem SupportMapFragment. Określa, czy cykl życia mapy powinien być powiązany z widokiem fragmentu, czy z samym fragmentem. Szczegółowe informacje znajdziesz tutaj.

  • liteModetrue, aby włączyć wersję uproszczoną. W przeciwnym razie false.

Aby można było używać atrybutów niestandardowych w pliku układu, musi on zawierać poniższą deklarację przestrzeni nazw. Możesz wybrać dowolną przestrzeń nazw. Nie musi to być map:

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

Potem możesz dodać atrybuty z prefiksem map: do pliku układu.

Poniższy plik układu konfiguruje obiekt SupportMapFragment z niestandardowymi atrybutami mapy. Te same atrybuty można też stosować do obiektu 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:uiCompass="false"
  map:uiRotateGestures="true"
  map:uiScrollGestures="false"
  map:uiTiltGestures="true"
  map:uiZoomControls="false"
  map:uiZoomGestures="true"/>

Konfigurowanie mapy po dynamicznym dodaniu

W tej sekcji dowiesz się, jak ustawić początkowy stan mapy, jeśli została ona dodana do aplikacji dynamicznie.

Jeśli właściwość SupportMapFragment lub MapView została dodana dynamicznie, możesz ustawić początkowy stan mapy w obiekcie GoogleMapOptions. Dostępne opcje są takie same jak w pliku układu. GoogleMapOptions możesz utworzyć w ten sposób:

Kotlin



val options = GoogleMapOptions()

      

Java


GoogleMapOptions options = new GoogleMapOptions();

      

Następnie skonfiguruj go w ten sposób:

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

      

Aby zastosować te opcje podczas tworzenia mapy, wykonaj jedną z tych czynności:

Konfigurowanie warstwy natężenia ruchu

Dane o natężeniu ruchu można wyświetlać na mapie, włączając warstwę natężenia ruchu. Warstwa ruchu możesz włączać i wyłączać, wywołując metodę setTrafficEnabled(). Aby sprawdzić, czy warstwa ruchu jest obecnie włączona, wywołaj metodę isTrafficEnabled(). Poniższy zrzut ekranu przedstawia mapę z włączoną warstwą natężenia ruchu.

Ustawianie typu mapy

Aby ustawić typ mapy, wywołaj metodę setMapType. Na przykład, aby wyświetlić mapę satelitarną:

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

      

Poniższa ilustracja przedstawia porównanie map zwykłych, hybrydowych i terenowych:

Porównanie typu mapy

Konfigurowanie budynków 3D

W wielu miastach z bliska widać budynki 3D, co widać na poniższym zdjęciu Vancouver w Kanadzie. Budynki 3D możesz wyłączyć, wywołując GoogleMap.setBuildingsEnabled(false).

Mapa Vancouver w Kanadzie

Konfigurowanie ustawień mapy obiektu

Przy dużym powiększeniu mapa pokazuje plany pięter budynków wewnątrz budynków, takich jak lotniska, centra handlowe, duże sklepy i stacje transportu publicznego. Te plany pięter, nazywane mapami obiektów, są wyświetlane w przypadku typów map „normalnych” i „satelitarnych” (GoogleMap.MAP_TYPE_NORMAL i GoogleMap.MAP_TYPE_SATELLITE). Są włączane automatycznie, gdy użytkownik powiększa widok, i znikają, gdy mapa jest pomniejszona.

Powiadomienie o wycofaniu: w kolejnej wersji mapy obiektów będą dostępne tylko na mapie typu normal. Od przyszłej wersji mapy obiektów nie będą obsługiwane na mapach w systemie satellite, terrain ani hybrid. Nawet jeśli funkcja wewnątrz nie jest obsługiwana, isIndoorEnabled() będzie nadal zwracać wartość ustawioną za pomocą metody setIndoorEnabled() tak jak obecnie. Domyślnie setIndoorEnabled ma wartość true. Informacje o wersji poinformują Cię, gdy obsługa obiektów we wnętrzach przestanie być dostępna w przypadku tych typów map.

Przykład mapy obiektu

Oto podsumowanie funkcji map obiektów dostępnych w interfejsie API:

  • Mapy obiektów możesz wyłączyć, dzwoniąc pod numer GoogleMap.setIndoorEnabled(false). Domyślnie mapy obiektów są włączone. Mapy obiektów są wyświetlane na jednej mapie naraz. Domyślnie jest to pierwsza mapa dodana do Twojej aplikacji. Aby wyświetlać mapy obiektu na innej mapie, wyłącz je na pierwszej mapie, a następnie zadzwoń pod numer setIndoorEnabled(true) na drugiej mapie.
  • Aby wyłączyć domyślny selektor poziomów (selektor pięter), wywołaj metodę GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false). Więcej informacji znajdziesz w artykule Korzystanie z mapy.
  • OnIndoorStateChangeListener – definiuje detektory, które wykrywają, kiedy budynek znajduje się w centrum uwagi lub gdy w budynku aktywuje się poziom. Więcej informacji znajdziesz w sekcji Korzystanie z mapy.
  • getFocusedBuilding – pobiera budynek, który jest zaznaczony. Następnie możesz znaleźć aktywny poziom, wywołując IndoorBuilding.getActiveLevelIndex().
  • Styl mapy podstawowej nie wpływa na mapy obiektów.

Konfigurowanie dopełnienia mapy

Ten film pokazuje przykład dopełnienia mapy.

Mapa Google została zaprojektowana w taki sposób, aby wypełnić cały region zdefiniowany przez jej element kontenera, zwykle MapView lub SupportMapFragment. Niektóre aspekty wyglądu i działania mapy zależą od wymiarów jej kontenera:

  • Cel kamery będzie odbijać środek wyściełanego obszaru.
  • Elementy sterujące mapy są ustawiane względem krawędzi mapy.
  • Informacje prawne, takie jak deklaracje dotyczące praw autorskich lub logo Google, wyświetlają się przy dolnej krawędzi mapy.

Możesz dodać dopełnienie wokół krawędzi mapy za pomocą komponentu GoogleMap.setPadding(). Mapa będzie nadal wypełniać cały kontener, ale jej pozycjonowanie, gesty i ruchy kamery działają tak, jakby została umieszczona w mniejszej przestrzeni. Powoduje to następujące zmiany:

  • Ruch kamery za pomocą wywołań interfejsu API lub naciśnięć przycisków (np. kompasu, lokalizacji, przycisków powiększenia) zależy od obszaru wyściełanego.
  • Metoda getCameraPosition zwraca środek dopełnionego regionu.
  • Metody Projection i getVisibleRegion zwracają dopełniony region.
  • elementy sterujące interfejsu są odsunięte od krawędzi kontenera o określoną liczbę pikseli.

Dopełnienie może być przydatne przy projektowaniu interfejsów, które nakładają się na pewien fragment mapy. Na ilustracji poniżej mapa jest dopełniona wzdłuż górnej i prawej krawędzi. Wzdłuż krawędzi dopełnionego obszaru będą wyświetlane widoczne elementy sterujące mapą i informacje prawne, które są zaznaczone na zielono, a mapa nadal będzie wypełniać cały kontener (kolor niebieski). W tym przykładzie możesz umieścić menu po prawej stronie mapy, nie zasłaniając jej elementów sterujących.

Dopełnienie mapy