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