הגדרת מפה

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

במאמר הזה מוסבר איך להגדיר מפה שנוספה לאפליקציה ל-Android באמצעות ה-SDK של מפות ל-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 מגדירה את הפרויקט באופן אוטומטי ומוסיפה מפה בסיסית. קטע משמש כמכל המפה והוא נוסף באופן סטטי. לפרטים נוספים, ראו את המדריך למתחילים.

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

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

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

ב-SDK של מפות ל-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. מציין אם מחזור החיים של המפה צריך להיות קשור לתצוגה של החלק או לחלק עצמו. פרטים נוספים זמינים במאמרי העזרה.

  • ‫liteMode – true כדי להפעיל את המצב הבסיסי, אחרת 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);

      

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

התאמת המפה לשוק המקומי

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

defaultConfig {
    resConfigs "en", "fr", "es", "zh", "de", "ja", "ru", "ko", "pt", "in"
}

מידע נוסף על התאמה לשוק המקומי של אפליקציה ל-Android

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

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

שכבת התנועה

הגדרת שכבת התחבורה הציבורית

כדי להציג נתוני תחבורה ציבורית במפה, צריך להפעיל את שכבת התחבורה הציבורית. כדי להפעיל ולהשבית את שכבת התחבורה הציבורית, קוראים ל-method‏ setTransitEnabled(). כדי לקבוע אם שכבת התחבורה הציבורית מופעלת, קוראים ל-method‏ isTransitEnabled(). בצילום המסך הבא מוצגת מפה שבה שכבת התחבורה הציבורית מופעלת.

שכבת תחבורה ציבורית

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

כדי להגדיר את סוג המפה, מפעילים את ה-method‏ 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);

      

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

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

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

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

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

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

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

הודעה על הוצאה משימוש: בגרסה עתידית, מפות פנימיות יהיו זמינות רק בסוג המפה normal. החל מהגרסה העתידית הזו, לא תהיה תמיכה במפות פנים במפות satellite, terrain או hybrid. גם במקומות שבהם אין תמיכה ב-indoor, הפונקציה 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 או לחיצות על כפתורים (למשל, מצפן, המיקום שלי, כפתורי זום) הן ביחס לאזור המרופד.
  • השיטה getCameraPosition מחזירה את מרכז האזור המרופד.
  • השיטות Projection ו-getVisibleRegion מחזירות את האזור המרופד.
  • הרכיבים האינטראקטיביים מוסטים מקצה המאגר במספר הפיקסלים שצוין.

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

שוליים של המפה

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

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

החל מגרסה 20.1.0 של SDK של מפות ל-Android, המפה פועלת בהתאם להגדרת המערכת הנוכחית כברירת מחדל. בגרסאות קודמות, המפה מוצגת במצב בהיר כברירת מחדל. ערך הגדרת המערכת הנוכחי מבוסס על הגדרת המכשיר של 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);

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

הגדרת צבע הרקע

כשעובדים במצב כהה או עוברים בין תצוגות מפה, כדאי להגדיר את צבע הרקע של המפה כברירת מחדל. כדי לעשות את זה, מגדירים את המאפיין backgroundColor של אפשרויות המפה.

Kotlin

private val googleMapOptions: GoogleMapOptions =
    GoogleMapOptions().backgroundColor(Color.argb(255, 255, 0, 0));

Java

private GoogleMapOptions options = new GoogleMapOptions().backgroundColor(Color.argb(255, 255, 0, 0));

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