אפשר להוסיף תמונות מעל למפה כששכבת אריחים. שכבות אריחים ממוקמות על גבי אריחי מפה ברמה ספציפית של מרחק מתצוגה. כשיש מספיק משבצות, אפשר להשלים את נתוני המפה של 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 לכל משבצת בכל אחת מרמות המרחק מהתצוגה שבה אתם רוצים לתמוך.
הוספה של שכבת אריחים
- יוצרים אובייקט
GMSURLTileLayer
או מחלקה משנית בהתאמה אישית שלGMSSyncTileLayer
/GMSTileLayer
. - אפשר לשנות את המאפיין
zIndex
כדי להתאים את המיקום שלו ביחס לשכבות משבצות אחרות. - צריך להקצות את האובייקט
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];