הגדרת מפה

בחירת פלטפורמה: Android iOS

בנושא הזה נסביר איך להגדיר מפה שנוספה לאפליקציה ל-Android באמצעות ה-SDK של מפות Google ל-Android.

סקירה

צילום מסך של מפה של קיטו שבו נקבעו הגדרות המפה. אחרי שמוסיפים מפה לאפליקציה, אפשר לקבוע את ההגדרות הראשוניות ואת זמן הריצה של המפה. צריך לקבוע את ההגדרות הראשוניות בהתאם להוספה של מאגר המפה (SupportMapFragment או MapView) באופן סטטי או דינמי. אם מאגר המפה נוסף באופן סטטי, אפשר לקבוע את ההגדרות הראשוניות של המפה בקובץ הפריסה. אם הוא נוסף באופן דינמי, אפשר לקבוע את ההגדרות הראשוניות בקריאה החוזרת (callback) של OnCreate באמצעות האובייקט GoogleMapOptions.

לפרטים על הוספת מאגר תגים של מפות, ניתן לעיין במאמר הוספת מפה.

ההגדרות הראשוניות של המפה כוללות את הדברים הבאים:

בזמן הריצה אפשר לקבוע את ההגדרות האלה והגדרות נוספות מסוימות על ידי עדכון האובייקט GoogleMap בקריאה החוזרת (callback) של onMapReady. ההגדרות הנוספות נקבעות באמצעות השיטות של המחלקה GoogleMap, כמו ההגדרות שקובעות את שכבת תעבורת הנתונים והמרווח הפנימי של המפה.

דוגמה

בקוד לדוגמה שבהמשך ובצילום המסך שלמעלה, המפה מוגדרת לפי ההגדרות הבאות.

ההגדרות הראשוניות נקבעות בקובץ הפריסה:

  • מפעילים את אמצעי הבקרה לשינוי מרחק התצוגה.
  • הפעלת הסיבוב של פקדי התנועות.
  • מגדירים את הטיית המפה ל-30.

הגדרות זמן הריצה:

  • מציבים את המצלמה במרכז של קיוטו יפן.
  • הפעלת סוג המפה ההיברידית.
  • הפעל את השכבה 'תנועה'.

הגדרות ראשוניות


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

הגדרות זמן ריצה

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

    }
}

לפני שמתחילים

לפני שמתחילים, אפשר להגדיר פרויקט ולהוסיף מפה בסיסית באמצעות האפשרויות הבאות:

  • יוצרים אפליקציה באמצעות התבנית של מפות Google ל-Android Studio. התבנית של מפות Google מגדירה את הפרויקט באופן אוטומטי ומוסיפה מפה בסיסית. מקטע משמש כקונטיינר המפה והוא מתווסף באופן סטטי. למידע נוסף עיינו בquickstart.

  • מגדירים ידנית את הפרויקט בשביל ה-SDK ומוסיפים מפה בסיסית. כך תוכלו להשתמש בכל תבנית של Android ולהוסיף מפה לאפליקציה קיימת.

הגדרת מפה אחרי הוספה שלה באופן סטטי

בקטע הזה מוסבר איך להגדיר את המצב הראשוני של המפה אם הוספתם אותה באופן סטטי לקובץ הפריסה.

ב-SDK של מפות Google ל-Android מוגדר קבוצה של מאפייני XML מותאמים אישית בשביל SupportMapFragment או MapView, שאפשר להשתמש בהם כדי להגדיר את המצב הראשוני של המפה ישירות מקובץ הפריסה. המאפיינים הבאים מוגדרים כרגע:

  • mapType – סוג המפה להצגה. הערכים החוקיים כוללים: none, normal, hybrid, satellite ו-terrain.

  • cameraTargetLat, cameraTargetLng, cameraZoom, cameraBearing, cameraTilt – המיקום הראשוני של המצלמה. למידע נוסף, עיינו במדריך בנושא המצלמה והתצוגות.

  • uiZoomControls, uiCompass – מציין אם יוצגו אמצעי בקרה לשינוי מרחק התצוגה והמצפן. פרטים נוספים זמינים בכתובת UiSettings.

  • uiZoomGestures, uiScrollGestures, uiRotateGestures, uiTiltGestures — ההגדרה קובעת אם תנועות ספציפיות מופעלות. למידע נוסף, ראו UiSettings.

  • zOrderOnTop – מציין אם פני השטח של תצוגת המפה מוצגים מעל חלון המפה, לחצני המפה ואובייקט כלשהו בחלון. פרטים נוספים זמינים בכתובת SurfaceView.setZOrderOnTop(boolean).

  • useViewLifecycle – בתוקף רק עם אובייקט SupportMapFragment. מציינת אם מחזור החיים של המפה צריך להיות מקושר לתצוגת המקטע או למקטע עצמו. כאן יש פרטים נוספים.

  • liteModetrue כדי להפעיל את מצב Lite. אחרת, false.

  • mapColorScheme — מציין את ערכת הצבעים של מפת רגילה ומפת פני שטח. הערכים כוללים את light (ברירת המחדל), dark ו-follow_system, כלומר משתמשים בהגדרת המערכת הנוכחית על סמך הגדרת המכשיר ל-UI_NIGHT_MODE_MASK. למידע נוסף, ראו ערכת צבעים במפה.

כדי להשתמש במאפיינים המותאמים אישית האלה בקובץ הפריסה, צריך לכלול את הצהרת מרחב השמות הבאה. אפשר לבחור כל מרחב שמות, הוא לא חייב להיות map:

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

לאחר מכן אפשר להוסיף את המאפיינים עם קידומת map: לקובץ הפריסה.

קובץ הפריסה הבא מגדיר אובייקט SupportMapFragment עם מאפייני מפה מותאמים אישית. אפשר להחיל את אותם מאפיינים גם על אובייקט 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"/>

הגדרת מפה אחרי הוספה שלה באופן דינמי

בקטע הזה מוסבר איך להגדיר את המצב הראשוני של המפה אם הוספתם אותה לאפליקציה באופן דינמי.

אם מוסיפים SupportMapFragment או MapView באופן דינמי, אפשר להגדיר את המצב הראשוני של המפה באובייקט GoogleMapOptions. האפשרויות הזמינות הן אותן האפשרויות שזמינות בקובץ הפריסה. אפשר ליצור GoogleMapOptions באופן הבא:

Kotlin



val options = GoogleMapOptions()

      

Java


GoogleMapOptions options = new GoogleMapOptions();

      

ואז מגדירים אותו באופן הבא:

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

      

כדי להחיל את האפשרויות האלה כשיוצרים מפה, מבצעים את אחת מהפעולות הבאות:

הגדרת שכבת התנועה

ניתן להציג נתוני תנועה במפה על ידי הפעלת שכבת התנועה. אפשר להפעיל ולהשבית את שכבת תעבורת הנתונים באמצעות קריאה ל-method setTrafficEnabled(), ולקבוע אם שכבת תעבורת הנתונים פועלת כרגע על ידי קריאה לשיטה isTrafficEnabled(). בצילום המסך הבא מוצגת מפה שבה שכבת התנועה מופעלת.

הגדרת סוג המפה

כדי להגדיר את סוג המפה, קוראים לשיטה setMapType. לדוגמה, כדי להציג מפת לוויין:

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

      

התמונה הבאה משווה בין סוגי המפה הרגילה, ההיברידית ומפת פני השטח:

השוואת MapType

הגדרת בניינים בתלת ממד

בערים רבות, כשמסתכלים מקרוב, ניתן לראות בניינים בתלת ממד, כפי שניתן לראות בתמונה למטה של ונקובר, קנדה. אפשר להשבית את יצירת התלת-ממד באמצעות קריאה ל-GoogleMap.setBuildingsEnabled(false).

מפה של ונקובר, קנדה

קביעת הגדרות של מפת הפנים

כשהמרחק מהתצוגה גבוה, מוצגים במפה תוכניות קומה של אזורים פנימיים כמו נמלי תעופה, מרכזי קניות, חנויות קמעונאיות גדולות ותחנות תחבורה ציבורית. תוכניות הקומה האלה, שנקראות מפות פנים, מוצגות לסוגי המפה ה 'רגילים' וה 'לוויין' (GoogleMap.MAP_TYPE_NORMAL ו-GoogleMap.MAP_TYPE_SATELLITE). הן מופעלות באופן אוטומטי כשהמשתמש מגדיל את התצוגה, והן נעלמות כשהמפה מוקטנת.

הודעה על הוצאה משימוש: בגרסה עתידית, מפות פנים יהיו זמינות רק מסוג המפה normal. החל מגרסה הזו, לא תהיה תמיכה במפות פנים במפות satellite, terrain או hybrid. גם במקומות שבהם אין תמיכה במקומות סגורים, isIndoorEnabled() ימשיך להחזיר את הערך שהוגדר דרך setIndoorEnabled(), כמו שהוא עושה עכשיו. כברירת מחדל, הערך של setIndoorEnabled הוא true. נתוני הגרסה יודיעו לך שהתמיכה בפנים באזור לא תהיה זמינה בסוגי המפות האלה.

דוגמה למפת פנים

הנה סיכום של הפונקציונליות של מפות פנים ב-API:

  • אפשר להשבית את מפות הפנים באמצעות GoogleMap.setIndoorEnabled(false). מפות הפנים מופעלות כברירת מחדל. מפות הפנים מוצגות במפה אחת בכל פעם. כברירת מחדל, זוהי המפה הראשונה שנוספה לאפליקציה שלכם. כדי להציג מפות פנים במפה אחרת, צריך להשבית אותן במפה הראשונה ואז להפעיל את setIndoorEnabled(true) במפה השנייה.
  • כדי להשבית את הכלי לבחירת רמת ברירת מחדל (כלי לבחירת רצפה), מפעילים את הפונקציה GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false). למידע נוסף, ראו אינטראקציה עם המפה.
  • OnIndoorStateChangeListener — מגדיר מאזינים שמזהים מתי בניין מסוים נמצא בפוקוס או מופעל רמה במבנה. לפרטים נוספים, ראו אינטראקציה עם המפה.
  • getFocusedBuilding – אחזור הבניין שנמצא במיקוד. כדי למצוא את הרמה הפעילה, צריך לשלוח קריאה אל IndoorBuilding.getActiveLevelIndex().
  • עיצוב מפת הבסיס לא משפיע על מפות פנים.

הגדרת מרווח פנימי במפה

בסרטון הזה מוצגת דוגמה למרווח פנימי במפה.

מפת Google תוכננה למלא את כל האזור שמוגדר על ידי רכיב הקונטיינר שלו, בדרך כלל MapView או SupportMapFragment. יש כמה היבטים במראה ובהתנהגות של המפה שמוגדרים לפי מידות הקונטיינר שלה:

  • יעד המצלמה ישקף את מרכז האזור המרופד.
  • פקדי המפה ממוקמים ביחס לקצוות של המפה.
  • מידע משפטי, כמו הצהרות על זכויות יוצרים או הלוגו של Google, מופיע בחלק התחתון של המפה.

אפשר להוסיף מרווח פנימי סביב שולי המפה באמצעות GoogleMap.setPadding(). המפה תמשיך למלא את כל הקונטיינר, אבל הטקסט והמיקום, תנועות המפה ותנועות המצלמה יפעלו כאילו היא מוצבת במקום קטן יותר. כתוצאה מכך, יתרחשו השינויים הבאים:

  • תנועות המצלמה באמצעות קריאות API או לחיצות על לחצנים (למשל, מצפן, המיקום שלי, לחצני זום) הן ביחס לאזור המרופד.
  • ה-method getCameraPosition מחזירה את המרכז של האזור המרופד.
  • באמצעות ה-method Projection ו-getVisibleRegion מוחזרות האזור הריק.
  • הפקדים של ממשק המשתמש מיסטים מהקצה של הקונטיינר לפי מספר הפיקסלים שצוין.

הריפוד יכול להיות שימושי כשמתכננים ממשקי משתמש שחופפים לחלק מסוים מהמפה. בתמונה הבאה המפה מרופדת לאורך הקצה העליון והקצה הימני. פקדי מפה וטקסט משפטי גלויים יוצגו בקצוות של האזור המרופד בירוק, ואילו המפה תמשיך למלא את כל המאגר ומוצג בכחול. בדוגמה הזו, ניתן לצף תפריט מעל הצד הימני של המפה בלי להסתיר את פקדי המפה.

מרווח פנימי במפה

ערכת הצבעים של המפה

במפות מסוג 'נורמלי' ו'פני שטח', אפשר להגדיר את ערכת הצבעים של המפה באופן דינמי לכהה או בהיר, או להשתמש בהגדרת המערכת הנוכחית. לדוגמה, תוכלו להכהות או להבהיר את ערכת הצבעים של המפה בהתאם לשעה ביום או לשימוש במכשיר פנים או חוץ.

כברירת מחדל, המפה משתמשת במצב בהיר. הערך הנוכחי של הגדרת המערכת מבוסס על הגדרת המכשיר של UI_NIGHT_MODE_MASK.

Kotlin

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

Java

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

אפשר להחליף את המצב של ערכת הצבעים באמצעות method GoogleMap.setMapColorScheme() כדי להגדיר את הסגנון הנוכחי למצב כהה או בהיר, או לפעול לפי הגדרות המערכת.

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