Karte konfigurieren

Plattform auswählen: Android iOS

Hier wird beschrieben, wie Sie mit dem Maps SDK for Android eine Karte einrichten, die einer Android-App hinzugefügt wurde.

Übersicht

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

Weitere Informationen finden Sie unter Karte hinzufügen.

Zu den Anfangseinstellungen einer Karte gehören:

  • Kameraposition einschließlich Standort, Zoomfaktor, Ausrichtung und Neigung; weitere Informationen zur Positionierung der Kamera finden Sie unter Kamera und Ansicht
  • Kartentyp
  • Anzuzeigende UI-Elemente wie die Zoomschaltflächen und der Kompass
  • Zu aktivierende Touch-Gesten
  • Ob der Lite-Modus aktiviert ist

Diese und weitere Einstellungen können Sie während der Laufzeit konfigurieren. Hierzu muss das GoogleMap-Objekt im onMapReady-Callback aktualisiert werden. Die zusätzlichen Einstellungen, z. B. für die Verkehrsebene und das Versehen der Karte mit einem Innenrand, werden über die Methoden der GoogleMap-Klasse konfiguriert.

Beispiel

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

Anfangseinstellungen in der Layoutdatei:

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

Laufzeiteinstellungen:

  • Kamera auf Kyoto, Japan ausrichten
  • Kartentyp „Hybrid“ aktivieren
  • Verkehrsebene 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);

    }
}

Vorbereitung

Sie können zuerst ein Projekt einrichten und mit einer der folgenden Methoden eine Basiskarte hinzufügen:

  • Sie erstellen 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 finden Sie in der Kurzanleitung.

  • Sie konfigurieren das Projekt manuell für das SDK und fügen eine Basiskarte hinzu. So lässt sich eine beliebige Android-Vorlage verwenden und einer vorhandenen App eine Karte hinzufügen.

Statisch hinzugefügte Karte konfigurieren

In diesem Abschnitt wird beschrieben, wie Sie den Anfangszustand der Karte festlegen, wenn Sie sie der Layoutdatei statisch hinzugefügt haben.

Im Maps SDK for Android ist eine Gruppe benutzerdefinierter XML-Attribute für SupportMapFragment oder MapView definiert, mit denen Sie die Anfangseinstellungen der Karte direkt über die Layoutdatei konfigurieren können. 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 finden Sie unter Kamera und Ansicht.

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

  • uiZoomGestures, uiScrollGestures, uiRotateGestures, uiTiltGestures: Darüber legen Sie fest, ob bestimmte Touch-Gesten aktiviert sind. Weitere Informationen finden Sie 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 finden Sie unter SurfaceView.setZOrderOnTop(boolean).

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

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

Damit diese benutzerdefinierten Attribute in einer Layoutdatei verwendet werden können, muss sie die folgende Namespace-Deklaration enthalten. Dabei kann map als Namespace verwendet werden, ist aber nicht zwingend.

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

Anschließend können Sie 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 konfigurieren

In diesem Abschnitt wird beschrieben, wie Sie die Anfangseinstellungen der Karte festlegen, falls Sie sie einer App dynamisch hinzugefügt haben.

Wenn Sie SupportMapFragment oder MapView dynamisch hinzugefügt haben, können Sie die Anfangseinstellungen der Karte in einem GoogleMapOptions-Objekt festlegen. Die verfügbaren Optionen sind die gleichen wie in der Layoutdatei. So erstellen Sie ein GoogleMapOptions-Objekt:

Kotlin



val options = GoogleMapOptions()

      

Java


GoogleMapOptions options = new GoogleMapOptions();

      

Anschließend wird das Objekt folgendermaßen konfiguriert:

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

      

Um diese Optionen beim Erstellen einer Karte anzuwenden, führen Sie einen der folgenden Schritte aus:

Verkehrsebene einrichten

Wenn Sie die Verkehrsebene aktivieren, werden auf der Karte Daten zum Verkehr angezeigt. Rufen Sie zum Aktivieren und Deaktivieren der Ebene rufen Sie die Methode setTrafficEnabled() auf. Mithilfe der Methode isTrafficEnabled() lässt sich feststellen, ob die Ebene derzeit aktiviert ist. Im folgenden Screenshot ist eine Karte mit aktivierter Verkehrsebene zu sehen.

Kartentyp festlegen

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

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

      

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

MapType-Vergleich

3D-Gebäude einrichten

In vielen Städten sind in der Nahansicht 3D-Gebäude zu sehen, wie zum Beispiel unten im Bild von Vancouver, Kanada. Die 3D-Gebäude können mit GoogleMap.setBuildingsEnabled(false) deaktiviert werden.

Karte von Vancouver, Kanada

Einstellungen für Indoor-Karten festlegen

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 „Standardeinstellung“ 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 der Unterstützung: 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 eingestellt. 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:

  • Indoor-Karten können durch den Aufruf von GoogleMap.setIndoorEnabled(false) deaktiviert werden. Standardmäßig sind Indoor-Karten aktiviert. Indoor-Karten werden immer nur auf einer Karte angezeigt, nicht auf mehreren gleichzeitig. Das ist standardmäßig die erste Karte, die Ihrer App hinzugefügt wird. Wenn Indoor-Karten auf einer anderen Karte erscheinen sollen, müssen sie auf der ersten Karte deaktiviert werden. Dann muss auf der zweiten Karte setIndoorEnabled(true) aufgerufen werden.
  • Um die Standardauswahl für die Ebene (Etagenauswahl) zu deaktivieren, rufen Sie GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false) auf. Weitere Informationen finden Sie unter Mit Karten interagieren.
  • Mit OnIndoorStateChangeListener definieren Sie Listener, die erkennen, wenn ein Gebäude fokussiert oder eine Ebene in einem Gebäude aktiviert wird. Weitere Informationen finden Sie unter Mit Karten interagieren.
  • Mit getFocusedBuilding wird das Gebäude abgerufen, das gerade im Fokus ist. Wenn Sie anschließend IndoorBuilding.getActiveLevelIndex() aufrufen, finden Sie die aktive Ebene.
  • Der Stil der Basiskarte wirkt sich nicht auf Indoor-Karten aus.

Karte mit Innenrand versehen

In diesem Video wird gezeigt, wie Sie eine Karte mit einem Innenrand versehen.

Eine Google-Karte füllt standardmäßig den gesamten Bereich aus, der von ihrem Containerelement – in der Regel ein MapView- oder SupportMapFragment-Element – 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.

Mithilfe von GoogleMap können Sie an der Kartenaußenseite einen Innenrand hinzufügen.setPadding()-Methode. Die Karte füllt weiterhin den gesamten Container aus, aber Touch-Gesten zur Kartensteuerung, Kamerabewegungen und die Positionierung von Text und Steuerelementen 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 kann rechts auf der Karte ein Menü eingeblendet werden, ohne die Kartensteuerelemente zu verdecken.

Mit Innenrand versehene Karte