میتوانید تصاویر را بهعنوان «لایه کاشی» روی نقشهتان اضافه کنید. «لایههای کاشی» در سطح بزرگنمایی خاصی روی کاشی نقشه قرار میگیرند. با کاشیهای کافی، میتوانید دادههای نقشه Google را برای کل نقشه در چندین سطح بزرگنمایی تکمیل کنید.

مقدمه
لایههای کاشی، که گاهی اوقات به آنها «برافزایی کاشی» گفته میشود، به شما امکان میدهند
تصاویر را روی کاشیهای نقشه مبنای Google قرار دهید. از این ویژگی برای افزودن دادههایی مثل مکانهای جالب یا اطلاعات ترافیک و تصاویر محلی به برنامهتان استفاده کنید. وقتی لایههای کاشی با نوع نقشه kGMSTypeNone ترکیب میشوند، بهطور مؤثری به شما امکان میدهند دادههای نقشه مبنای Google را با دادههای خودتان جایگزین کنید.
لایههای کاشی زمانی مفید هستند که بخواهید تصاویر گستردهای را به نقشه اضافه کنید، که معمولاً مناطق جغرافیایی بزرگی را پوشش میدهند. درمقابل، پوششهای زمینی زمانی مفید هستند که میخواهید یک تصویر را در یک نقطه روی نقشه ثابت کنید.
مختصات کاشی
Maps API تصاویر را در هر سطح بزرگنمایی به مجموعهای از کاشیهای نقشه مربعی تقسیم میکند که در یک شبکه منظم چیده شدهاند. وقتی نقشه به مکان جدیدی پیمایش میشود یا به سطح بزرگنمایی جدیدی میرود، Maps API تعیین میکند که کدام کاشیها موردنیاز است و آن را به مجموعهای از کاشیها برای بازیابی ترجمه میکند.
در پیادهسازی Google از تصویر مرکاتور، کاشی با مختصات (۰،۰) همیشه در گوشه شمال غربی نقشه قرار دارد، با مقادیر x که از غرب به شرق افزایش مییابند و مقادیر y که از شمال به جنوب افزایش مییابند.
کاشیها بااستفاده از مختصات x,y از آن مبدأ نمایهسازی میشوند. برای مثال، در
سطح بزرگنمایی ۲، وقتی زمین به ۱۶ کاشی تقسیم میشود، هر کاشی را میتوان
با یک جفت x,y یکتا ارجاع داد:

هر کاشی نقشه یک مربع ۲۵۶×۲۵۶ نقطهای است. در سطح بزرگنمایی ۰، کل جهان در یک کاشی واحد پرداز میشود. هر سطح بزرگنمایی، بزرگنمایی را با ضریب دو افزایش میدهد. بنابراین، برای مثال، در سطح بزرگنمایی ۱، نقشه بهصورت یک شبکه ۲×۲ از کاشیها، در سطح بزرگنمایی ۲ بهصورت یک شبکه ۴×۴، و در سطح بزرگنمایی ۳ بهصورت یک شبکه ۸×۸ ارائه میشود. برای ایجاد تصاویر برای لایه کاشی، یک تصویر نقطه ۲۵۶×۲۵۶ برای هر کاشی در هر سطح بزرگنمایی که میخواهید پشتیبانی کنید ایجاد کنید.
افزودن لایه کاشی
- یک شیء
GMSURLTileLayerیا یک زیرکلاس سفارشی ازGMSTileLayerیاGMSSyncTileLayerرا نمونهسازی کنید. - درصورت تمایل، ویژگی
zIndexرا اصلاح کنید تا موقعیت آن را نسبتبه لایههای کاشی دیگر تنظیم کنید. - با تنظیم کردن ویژگی
mapشیءGMSTileLayer، آن را به نقشه اختصاص دهید.
کیت توسعه نرمافزار Google Maps برای iOS سه کلاس ارائه میدهد که میتوان از آنها برای
پیادهسازی لایه کاشی استفاده کرد. با هر کلاس، باید نحوه واکشی کاشی نقشه صحیح را برای مجموعه مختصات {x,y,zoom} مشخص کنید. گزینههای
موجود عبارتاند از:
- زیرکلاس
GMSSyncTileLayer، که پیادهسازیtileForX:y:zoomرا ارائه میدهد که نمونههایUIImageرا برمیگرداند. - زیرکلاس
GMSTileLayer، که پیادهسازی روش ناهمگامrequestTileForX:y:zoomرا ارائه میدهد که بعداً با تصویر کاشی تماس میگیرد. - از کلاس موجود،
GMSURLTileLayer، برای واکشی خودکار کاشیها از نشانیهای وب، با ارائه بلوکGMSTileURLConstructorاستفاده کنید.GMSURLTileLayerکلاس بتنی است که نمیتواند زیرکلاس داشته باشد.
درصورت زیرکلاسبندی GMSSyncTileLayer یا GMSTileLayer، ارائه نتیجه کاشی
nil به «کیت توسعه نرمافزار Google Maps برای iOS» اطلاع میدهد که دادهها
دردسترس نیستند اما ممکن است در آینده دردسترس قرار گیرند. بهطور جایگزین،
kGMSTileLayerNoTile را برگردانید تا نشان دهید که کاشیای در این
مکان وجود ندارد.
برای GMSURLTileLayer، برگرداندن nil از GMSTileURLConstructor
نشان میدهد که هیچ کاشیای در این مکان وجود ندارد.
استفاده از GMSURLTileLayer برای واکشی کاشیها از نشانیهای وب
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
آبجکتیو-سی
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 } } }
آبجکتیو-سی
@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
آبجکتیو-سی
GMSTileLayer *layer = [[TestTileLayer alloc] init]; layer.map = mapView;
کاشیهای DPI بالا برای دستگاههای Retina
میتوانید از تصاویر با DPI بالا با GMSSyncTileLayer
یا GMSURLTileLayer با تنظیم tileSize روی ۵۱۲ استفاده کنید.
ویژگی tileSize تعداد پیکسلهایی را نشان میدهد که تصاویر کاشی برگرداندهشده ترجیح میدهند بهعنوان آن نمایش داده شوند؛ این مقدار بهطور پیشفرض ۲۵۶ است — ابعاد کاشی Google Maps در دستگاه غیرRetina.
اگر کاشیهای DPI معمولی را در دستگاهی با DPI بالا نمایش میدهید، میتوانید با تنظیم tileSize روی ۵۱۲، مقیاس تصاویر را افزایش دهید. توجه داشته باشید که ارتقای مقیاس تصاویر ممکن است کیفیت تصویر را کاهش دهد، بهویژه برای خطوط ظریف یا نوشتار. برای دریافت بهترین نتایج،
tileSize و نقطه در اینچ تصویر را با نمایشگر مطابقت دهید. نقشههای نشاندادهشده در دستگاه Retina
هنگام نمایش تصاویر با DPI بالا با tileSize ۵۱۲ بهترین ظاهر را خواهند داشت؛
درحالیکه نقشههای نشاندادهشده در دستگاه غیرRetina با تصاویر عادی
و tileSize پیشفرض ۲۵۶ عالی بهنظر خواهند رسید.
پاک کردن کاشیهای قدیمی
اگر کاشیهای ارائهشده توسط لایه «کهنه» شوند، باید روش
clearTileCache در لایه فراخوانی شود تا بازآوری اجباری انجام شود. این کار
باعث میشود همه کاشیهای این لایه دوباره بار شود.
Swift
layer.clearTileCache()
آبجکتیو-سی
[layer clearTileCache];