Vorhandene Karte einrichten

Hier erfährst du, wie du mit dem Maps SDK for Android eine Karte einrichtest, die einer Android-App hinzugefügt wurde.

Übersicht

Screenshot einer Karte von Kyoto mit konfigurierten Karteneinstellungen Nachdem du der App eine Karte hinzugefügt hast, kannst du die Anfangs- und die Laufzeiteinstellungen konfigurieren. Die Konfiguration der Anfangseinstellungen hängt davon ab, ob du den Kartencontainer (SupportMapFragment oder MapView) statisch oder dynamisch hinzugefügt hast. Wenn der Kartencontainer statisch hinzugefügt wurde, kannst du die Anfangseinstellungen der Karte in der Layoutdatei konfigurieren. Wurde der Container dynamisch hinzugefügt, konfigurierst du sie mit einem GoogleMapOptions-Objekt im OnCreate-Callback.

Weitere Informationen findest du unter Karte hinzufügen.

Zu den Anfangseinstellungen einer Karte gehören:

Während der Laufzeit kannst du diese und weitere Einstellungen konfigurieren. Hierzu musst du das GoogleMap-Objekt im onMapReady-Callback aktualisieren. Die zusätzlichen Einstellungen, z. B. für die Verkehrslagenebene und das Versehen der Karte mit einem Innenrand, werden über die Methoden der GoogleMap-Klasse konfiguriert.

Beispiel

Im Beispielcode unten und dem Screenshot oben wurde die Karte mit den folgenden Einstellungen konfiguriert.

Anfangseinstellungen sind in der Layoutdatei:

  • Zoomsteuerelemente aktivieren
  • Touch-Gesten für Drehbewegungen aktivieren
  • Kartenneigung auf 30 einstellen

Laufzeiteinstellungen:

  • Kamera auf Kyoto, Japan ausrichten
  • Kartentyp „Hybrid“ aktivieren
  • Verkehrslagenebene aktivieren

Anfangseinstellungen


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

Laufzeiteinstellungen

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

    }
}

Hinweis

Du kannst zuerst ein Projekt einrichten und mit einer der folgenden Methoden eine Basiskarte hinzufügen:

  • Du erstellst eine App mit der Maps-Vorlage für Android Studio. Dadurch wird das Projekt automatisch konfiguriert und eine Basiskarte hinzugefügt. Als Kartencontainer wird ein Fragment verwendet und statisch hinzugefügt. Weitere Informationen findest du in der Kurzanleitung.

  • Du konfigurierst das Projekt manuell für das SDK und fügst eine Basiskarte hinzu. So kannst du eine beliebige Android-Vorlage verwenden und einer vorhandenen App eine Karte hinzufügen.

Statisch hinzugefügte Karte einrichten

In diesem Abschnitt wird beschrieben, wie du den Anfangszustand der Karte festlegst, wenn du sie statisch einer Layoutdatei hinzugefügt hast.

Im Google Maps SDK for Android ist eine Gruppe benutzerdefinierter XML-Attribute für SupportMapFragment oder MapView definiert, mit denen du den Anfangszustand der Karte direkt über die Layoutdatei konfigurieren kannst. Folgende Attribute sind derzeit definiert:

  • mapType: Damit wird der anzuzeigende Kartentyp festgelegt. Zulässige Werte sind: none, normal, hybrid, satellite und terrain.

  • cameraTargetLat, cameraTargetLng, cameraZoom, cameraBearing, cameraTilt: Darüber wird die Anfangsposition der Kamera angegeben. Weitere Informationen findest du unter Kamera und Ansichten.

  • uiZoomControls, uiCompass: Damit wird definiert, ob die Zoomsteuerelemente und der Kompass angezeigt werden. Weitere Informationen findest du unter UiSettings.

  • uiZoomGestures, uiScrollGestures, uiRotateGestures, uiTiltGestures: Darüber legst du fest, ob bestimmte Touch-Gesten aktiviert sind. Weitere Informationen findest du unter UiSettings.

  • zOrderOnTop: Damit wird festgelegt, ob die Oberfläche der Kartenansicht über dem Kartenfenster, den Kartensteuerelementen und allen Objekten im Fenster angezeigt wird. Weitere Informationen findest du unter SurfaceView.setZOrderOnTop(boolean).

  • useViewLifecycle: Nur gültig mit einem SupportMapFragment-Objekt. So gibst du an, ob der Lebenszyklus der Karte an die Ansicht des Fragments oder an das Fragment selbst gebunden sein soll. Weitere Informationen findest du hier.

  • liteMode: Mit true wird der Lite-Modus aktiviert. Mit false ist er deaktiviert.

Damit du diese benutzerdefinierten Attribute in einer Layoutdatei verwenden kannst, muss sie die folgende Namespace-Deklaration enthalten. Dabei ist map als Namespace nicht zwingend.

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

Anschließend kannst du die Attribute mit dem Präfix map: der Layoutdatei hinzufügen.

In der folgenden Layoutdatei ist ein SupportMapFragment-Objekt mit benutzerdefinierten Kartenattributen definiert. Dieselben Attribute können auch für ein MapView-Objekt verwendet werden.

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

Dynamisch hinzugefügte Karte einrichten

In diesem Abschnitt wird beschrieben, wie du den Anfangszustand der Karte festlegst, wenn du sie dynamisch einer App hinzugefügt hast.

Wenn du SupportMapFragment oder MapView dynamisch hinzugefügt hast, kannst du den Anfangszustand der Karte in einem GoogleMapOptions-Objekt festlegen. Die verfügbaren Optionen sind die gleichen wie in der Layoutdatei. So erstellst du ein GoogleMapOptions-Objekt:

Java

GoogleMapOptions options = new GoogleMapOptions();
      

Kotlin

val options = GoogleMapOptions()
      

Anschließend konfigurierst du das Objekt so:

Java

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

Kotlin

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

Führe einen der folgenden Schritte aus, um mithilfe dieser Optionen eine Karte zu erstellen:

Verkehrslagenebene einrichten

Wenn du die Verkehrslagenebene aktivierst, werden auf der Karte Daten zum Verkehr angezeigt. Rufe zum Aktivieren und zum Deaktivieren die setTrafficEnabled()-Methode auf. Mithilfe der isTrafficEnabled()-Methode kannst du feststellen, ob die Verkehrslagenebene derzeit aktiviert ist. Im folgenden Screenshot ist eine Karte mit aktivierter Verkehrslagenebene zu sehen.

Kartentyp festlegen

Der Kartentyp wird mit der setMapType-Methode festgelegt. So wird z. B. eine Satellitenkarte angezeigt:

Java

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

Kotlin

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

In der folgenden Abbildung siehst du die Kartentypen „Normal“, „Hybrid“ und „Gelände“ im Vergleich:

MapType-Vergleich

Indoor-Karteneinstellungen einrichten

Bei einem hohen Zoomfaktor sind auf der Karte Gebäudepläne für Innenbereiche wie z. B. Flughäfen, Einkaufszentren, große Geschäfte und Bahnhöfe zu sehen. Diese sogenannten Indoor-Karten werden für die Kartentypen „Normal“ und „Satellit“ (GoogleMap.MAP_TYPE_NORMAL und GoogleMap.MAP_TYPE_SATELLITE) angezeigt. Sie werden automatisch aktiviert, wenn Nutzer heranzoomen, und ausgeblendet, wenn sie wieder herauszoomen.

Hinweis zur Einstellung: In einem zukünftigen Release werden Indoor-Karten nur für den Kartentyp normal verfügbar sein. Indoor-Karten vom Typ satellite, terrain und hybrid werden dann nicht mehr unterstützt. Auch wenn sie nicht unterstützt werden, wird isIndoorEnabled() weiterhin den Wert zurückgeben, der über setIndoorEnabled() festgelegt wurde. Standardmäßig ist setIndoorEnabled auf true festgelegt. Ab wann die Unterstützung für Indoor-Karten dieser Typen eingestellt wird, werden wir in den Versionshinweisen mitteilen.

Beispiel für eine Indoor-Karte

Die API bietet für Indoor-Karten folgende Funktionen:

  • Du kannst Indoor-Karten durch den Aufruf von GoogleMap.setIndoorEnabled(false) deaktivieren. Standardmäßig sind Indoor-Karten aktiviert. Indoor-Karten werden jeweils auf einer Karte angezeigt. Das ist normalerweise die erste Karte, die deiner App hinzugefügt wurde. Wenn Indoor-Karten auf einer anderen Karte erscheinen sollen, deaktiviere sie auf der ersten Karte und rufe setIndoorEnabled(true) auf der zweiten Karte auf.
  • Um die Standardauswahl für die Ebene (Etagenauswahl) zu deaktivieren, rufst du GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false) auf. Weitere Informationen findest du unter Mit Karten interagieren.
  • Mit OnIndoorStateChangeListener definierst du Listener, die erkennen, wenn ein Gebäude fokussiert oder eine Ebene in einem Gebäude aktiviert wird. Weitere Informationen findest du unter Mit der Karte interagieren.
  • Mit getFocusedBuilding wird das Gebäude abgerufen, das gerade im Fokus ist. Wenn du anschließend IndoorBuilding.getActiveLevelIndex() aufrufst, findest du die aktive Ebene.
  • Der Stil der Basiskarte wirkt sich nicht auf Indoor-Karten aus.

Karte mit Innenrand versehen

In diesem Video siehst du, wie sich ein Karteninnenrand hinzufügen lässt.

Eine Google-Karte füllt standardmäßig den gesamten Bereich aus, der von ihrem Containerelement – in der Regel eine MapView oder ein SupportMapFragment – definiert wird. Verschiedene Aspekte der Darstellung und des Verhaltens der Karte werden durch die Abmessungen des Kartencontainers definiert:

  • Das Ziel der Kamera entspricht der Mitte des abgesetzten Bereichs.
  • Kartensteuerelemente werden relativ zu den Rändern der Karte positioniert.
  • Rechtliche Informationen wie Urheberrechtsangaben oder das Google-Logo werden am unteren Rand der Karte angezeigt.

Du kannst mithilfe von GoogleMap an der Kartenaußenseite einen Innenrand hinzufügen.setPadding()-Methode. Die Karte füllt weiterhin den gesamten Container aus, aber die Positionierung von Text und Steuerelementen, Touch-Gesten für die Kartensteuerung und Kamerabewegung verhalten sich so, als wäre die Karte in einem kleineren Bereich platziert worden. Das führt zu folgenden Änderungen:

  • Kamerabewegungen über API-Aufrufe oder die Betätigung von Schaltflächen (z. B. der Kompassschaltfläche, der Schaltfläche „Mein Standort“ oder der Zoomschaltflächen) erfolgen relativ zum abgesetzten Bereich.
  • Die Methode getCameraPosition gibt den Mittelpunkt des abgesetzten Bereichs zurück.
  • Die Methoden Projection und getVisibleRegion geben den abgesetzten Bereich zurück.
  • UI-Steuerelemente werden um die angegebene Anzahl von Pixeln vom Rand des Containers verschoben.

Ein Innenrand kann beim Entwerfen von UI-Elementen hilfreich sein, die sich mit einem Teil der Karte überschneiden. In der folgenden Abbildung hat die Karte entlang des oberen und rechten Rands einen Innenrand. Sichtbare Kartensteuerelemente und rechtliche Informationen werden entlang der Ränder des abgesetzten Bereichs (grün) angezeigt. Die Karte füllt aber weiterhin den gesamten Container (blau) aus. In diesem Beispiel kannst du rechts auf der Karte ein Menü einblenden, ohne die Kartensteuerelemente zu verdecken.

Karte mit Innenrand versehen