אפשר להוסיף תמונות מעל המפה כשכבת משבצות. שכבות משבצות ממוקמות מעל משבצת מפה ברמת זום ספציפית. אם תוסיפו מספיק משבצות, תוכלו להשלים את נתוני המפה של Google בכל המפה, במספר רמות זום.
מבוא
שכבות משבצות (שנקראות לפעמים שכבות-על של משבצות) מאפשרות להציג תמונות מעל משבצות המפה הבסיסית של Google. זוהי דרך מצוינת להוסיף לאפליקציה נתונים – כמו נקודות עניין או מידע על תנועה – ותמונות מקומיות. בשילוב עם סוג המפה kGMSTypeNone
, שכבות המשבצות מאפשרות לכם להחליף את נתוני המפה הבסיסית של Google בנתונים משלכם.
שכבות של משבצות שימושיות כשרוצים להוסיף למפה תמונות נרחבות, בדרך כלל שמכסות אזורים גיאוגרפיים גדולים. לעומת זאת, שכבות-על של שטח שימושיות כשרוצים להציב תמונה אחת בנקודה אחת במפה.
קואורדינטות של קטע במפה
ב-Maps API, התמונות מחולקות בכל רמת זום לקבוצה של משבצות מרובעות במפה, שממוינות ברשת מסודרת. כשגוללים במפה למיקום חדש או לרמת זום חדשה, ממשק Maps API קובע אילו משבצות נדרשות וממיר אותן לקבוצת משבצות לאחזור.
בהטמעה של Google של הקרנת Mercator, המשבצת עם הקואורדינטות (0,0) תמיד נמצאת בפינה הצפון-מערבית של המפה, כאשר ערכי x
גדלים ממערב למזרח וערכי y
גדלים מצפון לדרום.
המשבצות מתווספות לאינדקס באמצעות קואורדינטות x,y
מהמקור הזה. לדוגמה, ברמת הזום 2, כשהעולם מחולק ל-16 משבצות, אפשר להפנות לכל משבצת באמצעות זוג x,y
ייחודי:
כל אריח במפה הוא ריבוע של 256x256 נקודות. ברמת הזום 0, כל העולם מעובד באריח אחד. בכל רמת זום, ההגדלה גדלה פי שניים. לכן, ברמת התצוגה 1 המפה תעבור עיבוד כמרשת של משבצות בגודל 2x2, או כמרשת של משבצות בגודל 4x4 ברמת התצוגה 2, כמרשת של משבצות בגודל 8x8 ברמת התצוגה 3 וכן הלאה. אם אתם יוצרים תמונות לשכבת משבצות, תצטרכו ליצור תמונה חדשה של 256x256 פיקסלים לכל משבצת בכל רמת זום שתרצו לתמוך בה.
הוספת שכבת אריחים
- יוצרים אובייקט
GMSURLTileLayer
או קבוצת משנה בהתאמה אישית שלGMSTileLayer
אוGMSSyncTileLayer
. - אפשר לשנות את המאפיין
zIndex
כדי לשנות את המיקום שלו ביחס לשכבות אחרות של משבצות. - כדי להקצות את האובייקט
GMSTileLayer
למפה, מגדירים את המאפייןmap
שלו.
ב-Maps SDK ל-iOS יש שלוש כיתות שאפשר להשתמש בהן כדי להטמיע שכבת משבצות. בכל כיתה תצטרכו להגדיר איך לאחזר את המשבצת הנכונה במפה עבור קבוצה נתונה של קואורדינטות {x,y,zoom}
. האפשרויות הזמינות הן:
- תת-הסוג של
GMSSyncTileLayer
, שמספק את ההטמעה שלtileForX:y:zoom
שמחזירה מכונותUIImage
. - תת-הסוג
GMSTileLayer
, שמספק את ההטמעה של השיטה האסינכרוניתrequestTileForX:y:zoom
, שמפעילה חזרה מאוחר יותר עם תמונה של משבצת. - משתמשים בכיתה הקיימת,
GMSURLTileLayer
, כדי לאחזר משבצות באופן אוטומטי מכתובות URL, ומספקים את הבלוקGMSTileURLConstructor
.GMSURLTileLayer
הוא סוג מוגדר (concrete) שאי אפשר ליצור ממנו תת-סוגים.
במקרה של יצירת תת-סוג של 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) למכשירי Retina
אפשר להשתמש בתמונות עם רזולוציית DPI גבוהה ב-GMSSyncTileLayer
או ב-GMSURLTileLayer
על ידי הגדרת tileSize
לערך 512.
המאפיין tileSize
מציין את מספר הפיקסלים שבו עדיף להציג את התמונות של המשבצות שהוחזרו. ברירת המחדל היא 256 – המאפיין של משבצת במפות Google במכשיר שאינו Retina.
אם אתם מציגים משבצות DPI רגילות במכשיר עם DPI גבוה, תוכלו להגדיל את התמונות על ידי הגדרת הערך tileSize
ל-512. חשוב לזכור ששינוי רזולוציית התמונה לגדולה יותר עלול לגרום לירידה באיכות התמונה, במיוחד אם מדובר בקווים דקים או בטקסט. כדי לקבל את התוצאות הטובות ביותר, כדאי להתאים את הערך של tileSize
ואת רזולוציית המדפסת של התמונה למסך. מפות Google שמוצגות במכשיר עם מסך Retina ייראו במיטבן כשהן מוצגות בתמונות עם DPI גבוה ועם הערך tileSize
של 512. לעומת זאת, מפות Google שמוצגות במכשיר שאינו עם מסך Retina ייראו מצוין בתמונות רגילות ובערך ברירת המחדל של tileSize
, שהוא 256.
ניקוי אריחים לא עדכניים
אם המשבצות שסופקו על ידי השכבה הופכות ל 'לא עדכניות', צריך להפעיל את השיטה clearTileCache
בשכבה כדי לאלץ רענון. הפעולה הזו תגרום לטעינה מחדש של כל המשבצות בשכבה הזו.
Swift
layer.clearTileCache()
Objective-C
[layer clearTileCache];