لایه های کاشی

پلتفرم را انتخاب کنید: Android iOS JavaScript

می توانید تصاویر را در بالای نقشه خود به عنوان لایه کاشی اضافه کنید. لایه‌های کاشی روی کاشی نقشه در یک سطح بزرگنمایی خاص قرار می‌گیرند. با کاشی‌های کافی، می‌توانید داده‌های نقشه 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 نقطه جدید ایجاد کنید.

یک لایه کاشی اضافه کنید

  1. یک شی GMSURLTileLayer یا یک زیر کلاس سفارشی از GMSTileLayer یا GMSSyncTileLayer را نمونه سازی کنید.
  2. به صورت اختیاری ویژگی zIndex را تغییر دهید تا موقعیت آن را در رابطه با سایر لایه‌های کاشی تنظیم کنید.
  3. با تنظیم ویژگی 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];