שכבות אריחים

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

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

מבוא

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

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

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

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

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

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

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

הוספת שכבה של משבצות

  1. יצירת אובייקט GMSURLTileLayer או קטגוריית משנה מותאמת אישית של GMSTileLayer מתוך GMSSyncTileLayer.
  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 גבוה למכשירי רטינה

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

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

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

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

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];