שכבות אריחים

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

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

מבוא

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

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

קואורדינטות של קטעי המפה

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

בהטמעה של היטל ה-Mercator של Google, המשבצת עם הקואורדינטה (0,0) נמצאת תמיד בפינה הצפון-מערבית של המפה, כאשר ערכי x עולים ממערב למזרח והערכים של y עולים מצפון לדרום. המשבצות מתווספות לאינדקס באמצעות x,y קואורדינטות מהמקור הזה. לדוגמה, בדרגה 2 של שינוי מרחק התצוגה, כשכדור הארץ מחולק ל-16 משבצות, אפשר להפנות לכל משבצת באמצעות זוג x,y ייחודי:

מפת העולם המחולקת לארבע שורות וארבע עמודות של אריחים.

כל אריח מפה הוא ריבוע עם 256x256 נקודות. ברמת זום 0, כל העולם מעובד במשבצת אחת. כל רמת זום מגדילה את ההגדלה בפקטור של שניים. כך, במרחק מתצוגה 1 המפה תוצג כרשת אריחים בגודל 2x2, או רשת בגודל 4x4 ברמת זום 2, רשת 8x8 ברמת זום 3 וכן הלאה. אם אתם יוצרים תמונות לשכבת אריח, עליכם ליצור תמונה חדשה עם נקודות בגודל 256x256 לכל משבצת בכל אחת מרמות המרחק מהתצוגה שבה אתם רוצים לתמוך.

הוספה של שכבת אריחים

  1. יוצרים אובייקט GMSURLTileLayer או מחלקה משנית בהתאמה אישית של GMSSyncTileLayer/GMSTileLayer.
  2. אפשר לשנות את המאפיין zIndex כדי להתאים את המיקום שלו ביחס לשכבות משבצות אחרות.
  3. צריך להקצות את האובייקט GMSTileLayer למפה על ידי הגדרת המאפיין map שלו.

ב-SDK של מפות Google ל-iOS יש שלוש מחלקות שבהן אפשר להשתמש כדי להטמיע שכבת אריח. בכל מחלקה תצטרכו להגדיר איך לאחזר את משבצת המפה הנכונה לקבוצה נתונה של קואורדינטות {x,y,zoom}. האפשרויות הזמינות הן:

  • מחלקה משנית GMSSyncTileLayer, עם הטמעה של tileForX:y:zoom שמחזירה מופעים של UIImage.
  • מחלקה משנית GMSTileLayer, עם ההטמעה של השיטה האסינכרונית requestTileForX:y:zoom שמאוחר יותר קוראת חזרה עם תמונת משבצת.
  • משתמשים במחלקה הקיימת, GMSURLTileLayer, כדי לאחזר משבצות באופן אוטומטי מכתובות URL ומספקת את הבלוק GMSTileURLConstructor. GMSURLTileLayer היא מחלקה קונקרטית שאי אפשר לתת מחלקה משנית.

במקרה של סיווג משנה GMSSyncTileLayer או GMSTileLayer, ציון תוצאת המשבצת nil מיידע את ה-SDK של מפות Google ל-iOS שהנתונים אינם זמינים כרגע, אבל ייתכן שהם יהיו זמינים בעתיד. לחלופין, אפשר להחזיר kGMSTileLayerNoTile כדי לציין שאין משבצת במיקום הזה.

עבור GMSURLTileLayer, החזרה של nil מה-GMSTileURLConstructor תציין שאין משבצת במיקום הזה.

שימוש ב-'GMSURLTileLayer' כדי לאחזר משבצות מכתובות URL

ב-GMSURLTileLayer לא נדרשת סיווג משנה, אבל צריך להטמיע את הבלוק GMSTileURLConstructor. הקוד הבא מראה איך להשתמש ב-GMSURLTileLayer כדי להציג את תוכנית הקומה של בניין רב-קומות.

Swift

let floor = 1

// Implement GMSTileURLConstructor
// Returns a Tile based on the x,y,zoom coordinates, and the requested floor
let urls: GMSTileURLConstructor = { (x, y, zoom) in
  let url = "https://www.example.com/floorplans/L\(floor)_\(zoom)_\(x)_\(y).png"
  return URL(string: url)
}

// Create the GMSTileLayer
let layer = GMSURLTileLayer(urlConstructor: urls)

// Display on the map at a specific zIndex
layer.zIndex = 100
layer.map = mapView
      

Objective-C

NSInteger floor = 1;

// Create the GMSTileLayer
GMSURLTileLayer *layer = [GMSURLTileLayer tileLayerWithURLConstructor:^NSURL * _Nullable(NSUInteger x, NSUInteger y, NSUInteger zoom) {
  NSString *url = [NSString stringWithFormat:@"https://www.example.com/floorplans/L%ld_%lu_%lu_%lu.png",
                   (long)floor, (unsigned long)zoom, (unsigned long)x, (unsigned long)y];
  return [NSURL URLWithString:url];
}];

// Display on the map at a specific zIndex
layer.zIndex = 100;
layer.map = mapView;
      

מחלקה משנית GMSSyncTileLayer כדי להציג משבצות כUIImage

GMSSyncTileLayer ו-GMSTileLayer הם מחלקות מופשטות שמיועדות להיות מחלקות משנה. ניתן להשתמש במחלקות האלה כדי להציג משבצות כמו של UIImage. הדוגמה הבאה מראה איך לעבד תמונה מותאמת אישית על חלק מהמשבצות במפה על ידי סיווג משנה של GMSSyncTileLayer.

Swift

class TestTileLayer: GMSSyncTileLayer {
  override func tileFor(x: UInt, y: UInt, zoom: UInt) -> UIImage? {
    // On every odd tile, render an image.
    if (x % 2 == 1) {
      return UIImage(named: "australia")
    } else {
      return kGMSTileLayerNoTile
    }
  }
}

      

Objective-C

@interface TestTileLayer : GMSSyncTileLayer
@end

@implementation TestTileLayer

- (UIImage *)tileForX:(NSUInteger)x y:(NSUInteger)y zoom:(NSUInteger)zoom {
  // On every odd tile, render an image.
  if (x % 2 == 1) {
    return [UIImage imageNamed:@"australia"];
  } else {
    return kGMSTileLayerNoTile;
  }
}

@end
      

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

Swift

let layer = TestTileLayer()
layer.map = mapView
      

Objective-C

GMSTileLayer *layer = [[TestTileLayer alloc] init];
layer.map = mapView;
      

אריחי DPI גבוה עבור מכשירי Retina

אפשר להשתמש בתמונות DPI גבוה עם GMSSyncTileLayer או GMSURLTileLayer על ידי הגדרת tileSize כ-512. המאפיין tileSize מציין את מספר הפיקסלים שתמונות המשבצת שהוחזרו יעדיפו להציג. ערך ברירת המחדל הוא 256, הערך של משבצת של מפות Google במכשיר שאינו Retina.

אם מציגים אריחי DPI רגיל במכשיר עם DPI גבוה, ניתן להגדיל את קנה המידה של התמונות על ידי הגדרת tileSize ל-512. שימו לב שהגדלת התמונות עשויה לפגוע באיכות התמונה, במיוחד בקווים דקים ובטקסט. כדי לקבל את התוצאות הטובות ביותר, כדאי להתאים את ה-DPI של התמונה ל-tileSize ואת ה-DPI של התמונה למסך. מפות המוצגות במכשיר Retina ייראו במיטבן בעת הצגת תמונות DPI גבוה עם tileSize של 512; בעוד שמפות המוצגות במכשיר שאינו Retina ייראו נהדר עם תמונות רגילות ועם ברירת המחדל tileSize של 256.

ניקוי אריחים לא עדכניים

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

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];