می توانید تصاویر را در بالای نقشه خود به عنوان لایه کاشی اضافه کنید. لایههای کاشی روی کاشی نقشه در یک سطح بزرگنمایی خاص قرار میگیرند. با کاشیهای کافی، میتوانید دادههای نقشه Google را برای کل نقشه، در سطوح زوم چندگانه تکمیل کنید.
مقدمه
لایههای کاشی (که گاهی اوقات به عنوان پوشش کاشی نیز شناخته میشود) به شما امکان میدهد تصاویر را بر روی کاشیهای نقشه پایه Google قرار دهید. این یک راه عالی برای افزودن داده ها - مانند نقاط مورد علاقه یا اطلاعات ترافیک - و تصاویر محلی به برنامه شما است. وقتی با نوع نقشه kGMSTypeNone
ترکیب میشود، لایههای کاشی به طور موثر به شما امکان میدهند دادههای نقشه پایه Google را با دادههای خود جایگزین کنید.
لایههای کاشی زمانی مفید هستند که بخواهید تصاویر گستردهای را که معمولاً مناطق جغرافیایی بزرگی را پوشش میدهند، به نقشه اضافه کنید. در مقابل، پوششهای زمین زمانی مفید هستند که بخواهید یک تصویر را در یک نقطه از نقشه ثابت کنید.
مختصات کاشی
Maps API تصاویر را در هر سطح بزرگنمایی به مجموعه ای از کاشی های نقشه مربعی تقسیم می کند که در یک شبکه مرتب مرتب شده اند. هنگامی که یک نقشه به یک مکان جدید یا به یک سطح بزرگنمایی جدید پیمایش میکند، Maps API تعیین میکند که کدام کاشیها مورد نیاز است، و آنها را به مجموعهای از کاشیها برای بازیابی ترجمه میکند.
برای اجرای پیشبینی Mercator توسط Google، کاشی با مختصات (0,0) همیشه در گوشه شمال غربی نقشه قرار دارد، با مقادیر x
از غرب به شرق و مقادیر y
از شمال به جنوب افزایش مییابد. کاشی ها با استفاده از مختصات x,y
از آن مبدا نمایه می شوند. به عنوان مثال، در سطح زوم 2، زمانی که زمین به 16 کاشی تقسیم می شود، هر کاشی را می توان با یک جفت x,y
منحصر به فرد ارجاع داد:
هر کاشی نقشه یک مربع نقطه 256x256 است. در سطح زوم 0، کل جهان در یک کاشی واحد نمایش داده می شود. هر سطح زوم بزرگنمایی را دو برابر افزایش می دهد. بنابراین، در سطح زوم 1، نقشه به صورت یک شبکه 2x2 کاشی، یا یک شبکه 4x4 در سطح زوم 2، یک شبکه 8x8 در سطح بزرگنمایی 3 و غیره ارائه می شود. اگر در حال ایجاد تصاویر برای یک لایه کاشی هستید، باید برای هر کاشی در هر سطح بزرگنمایی که می خواهید از آن پشتیبانی کنید، یک تصویر 256x256 نقطه جدید ایجاد کنید.
یک لایه کاشی اضافه کنید
- یک شی
GMSURLTileLayer
یا یک زیر کلاس سفارشی ازGMSTileLayer
یاGMSSyncTileLayer
را نمونه سازی کنید. - به صورت اختیاری ویژگی
zIndex
را تغییر دهید تا موقعیت آن را در رابطه با سایر لایههای کاشی تنظیم کنید. - با تنظیم ویژگی
map
، شیGMSTileLayer
را به نقشه اختصاص دهید.
Maps SDK برای iOS سه کلاس ارائه می دهد که می توان از آنها برای پیاده سازی یک لایه کاشی استفاده کرد. با هر کلاس، باید نحوه واکشی کاشی نقشه صحیح را برای یک مجموعه معین از مختصات {x,y,zoom}
تعریف کنید. گزینه های موجود عبارتند از:
- زیر کلاس
GMSSyncTileLayer
، اجرایtileForX:y:zoom
را ارائه می دهد که نمونه هایUIImage
را برمی گرداند. - زیر کلاس
GMSTileLayer
، اجرای روش ناهمزمانrequestTileForX:y:zoom
ارائه می دهد که بعداً با یک تصویر کاشی دوباره فراخوانی می شود. - از کلاس موجود،
GMSURLTileLayer
برای واکشی خودکار کاشی ها از URL ها استفاده کنید و بلوکGMSTileURLConstructor
را ارائه دهید.GMSURLTileLayer
یک کلاس مشخص است که نمی توان آن را زیر کلاس قرار داد.
در مورد زیر طبقهبندی GMSSyncTileLayer
یا GMSTileLayer
، ارائه یک نتیجه nil
به SDK Maps برای iOS میگوید که دادهها در حال حاضر در دسترس نیستند اما ممکن است در آینده در دسترس باشند. از طرف دیگر، kGMSTileLayerNoTile
برگردانید تا نشان دهید که هیچ کاشی در این مکان وجود ندارد.
برای GMSURLTileLayer
، بازگشت nil
از GMSTileURLConstructor
نشان میدهد که هیچ کاشی در این مکان وجود ندارد.
از GMSURLTileLayer برای واکشی کاشی ها از URL ها استفاده کنید
GMSURLTileLayer
نیازی به زیر کلاس بندی ندارد، اما باید بلوک GMSTileURLConstructor
را پیاده سازی کنید. کد زیر نحوه استفاده از GMSURLTileLayer
را برای نمایش پلان یک ساختمان چند طبقه نشان می دهد.
سویفت
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
هدف-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
ارائه کرد.
سویفت
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 } } }
هدف-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
برای افزودن لایه به نقشه خود، شی را نمونه سازی کنید و ویژگی نقشه آن را تنظیم کنید.
سویفت
let layer = TestTileLayer() layer.map = mapView
هدف-C
GMSTileLayer *layer = [[TestTileLayer alloc] init]; layer.map = mapView;
کاشی های DPI بالا برای دستگاه های شبکیه چشم
با تنظیم tileSize
روی 512 می توانید از تصاویر با DPI بالا tileSize
GMSSyncTileLayer
یا GMSURLTileLayer
استفاده کنید. این به طور پیشفرض روی 256 است - ابعاد کاشی Google Maps در یک دستگاه غیر شبکیه چشم.
اگر کاشیهای DPI معمولی را روی دستگاهی با DPI بالا نمایش میدهید، میتوانید با تنظیم tileSize
روی 512، تصاویر را افزایش دهید. توجه داشته باشید که افزایش مقیاس تصاویر ممکن است کیفیت تصویر را کاهش دهد، مخصوصاً برای خطوط ظریف یا متن. برای بهترین نتیجه، tileSize
و DPI تصویر را با نمایشگر مطابقت دهید. نقشههایی که روی دستگاه رتینا نشان داده میشوند، هنگام نمایش تصاویر با DPI بالا با tileSize
512 بهترین ظاهر را خواهند داشت. در حالی که نقشه های نشان داده شده در دستگاه غیر رتینا با تصاویر معمولی و tileSize
پیش فرض ۲۵۶ عالی به نظر می رسند.
پاکسازی کاشی های کهنه
اگر کاشیهای ارائهشده توسط لایه «بیات» شوند، روش clearTileCache
باید بر روی لایه فراخوانی شود تا مجبور به تازهسازی شود. این باعث می شود که تمام کاشی های این لایه دوباره بارگذاری شوند.
سویفت
layer.clearTileCache()
هدف-C
[layer clearTileCache];