שכבות אריחים

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

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

מבוא

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

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

קואורדינטות של משבצות

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

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

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

כל אריח מפה הוא ריבוע בגודל 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 תיידע את Maps SDK ל-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 גבוה למכשירי רטינה

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

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

מתבצעת מחיקה של משבצות לא עדכניות

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

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];