הגדרת מפה

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

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

סקירה כללית

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

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

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

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

  • מגדירים את הפרויקט באופן ידני ל-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.setMapType(GoogleMap.MAP_TYPE_HYBRID)
map.setIndoorEnabled(true)
val isIndoor = map.isIndoorEnabled()

      

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. גם במקומות שבהם אין תמיכה במיקום בתוך מבנים, 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 מחזירה את מרכז האזור המרופד.
  • השיטות 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);

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

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

כשעובדים במצב כהה או כשעוברים בין תצוגות מפה, יכול להיות שיהיה שימושי להגדיר את צבע הרקע של המפה כברירת מחדל. כדי לעשות את זה, מגדירים את המאפיין 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));

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