لایه‌های کاشی

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

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

مقدمه

لایه‌های کاشی، که گاهی اوقات به آن‌ها «برافزایی کاشی» گفته می‌شود، به شما امکان می‌دهند تصاویر را روی کاشی‌های نقشه مبنای Google قرار دهید. از این ویژگی برای افزودن داده‌هایی مثل مکان‌های جالب یا اطلاعات ترافیک و تصاویر محلی به برنامه‌تان استفاده کنید. وقتی لایه‌های کاشی با نوع نقشه kGMSTypeNone ترکیب می‌شوند، به‌طور مؤثری به شما امکان می‌دهند داده‌های نقشه مبنای Google را با داده‌های خودتان جایگزین کنید.

لایه‌های کاشی زمانی مفید هستند که بخواهید تصاویر گسترده‌ای را به نقشه اضافه کنید، که معمولاً مناطق جغرافیایی بزرگی را پوشش می‌دهند. درمقابل، پوشش‌های زمینی زمانی مفید هستند که می‌خواهید یک تصویر را در یک نقطه روی نقشه ثابت کنید.

مختصات کاشی

‫Maps API تصاویر را در هر سطح بزرگ‌نمایی به مجموعه‌ای از کاشی‌های نقشه مربعی تقسیم می‌کند که در یک شبکه منظم چیده شده‌اند. وقتی نقشه به مکان جدیدی پیمایش می‌شود یا به سطح بزرگ‌نمایی جدیدی می‌رود، Maps API تعیین می‌کند که کدام کاشی‌ها موردنیاز است و آن را به مجموعه‌ای از کاشی‌ها برای بازیابی ترجمه می‌کند.

در پیاده‌سازی Google از تصویر مرکاتور، کاشی با مختصات (۰،۰) همیشه در گوشه شمال غربی نقشه قرار دارد، با مقادیر x که از غرب به شرق افزایش می‌یابند و مقادیر y که از شمال به جنوب افزایش می‌یابند. کاشی‌ها بااستفاده از مختصات x,y از آن مبدأ نمایه‌سازی می‌شوند. برای مثال، در سطح بزرگ‌نمایی ۲، وقتی زمین به ۱۶ کاشی تقسیم می‌شود، هر کاشی را می‌توان با یک جفت x,y یکتا ارجاع داد:

نقشه جهان به چهار ردیف و چهار ستون کاشی تقسیم شده است.

هر کاشی نقشه یک مربع ۲۵۶×۲۵۶ نقطه‌ای است. در سطح بزرگ‌نمایی ۰، کل جهان در یک کاشی واحد پرداز می‌شود. هر سطح بزرگ‌نمایی، بزرگ‌نمایی را با ضریب دو افزایش می‌دهد. بنابراین، برای مثال، در سطح بزرگ‌نمایی ۱، نقشه به‌صورت یک شبکه ۲×۲ از کاشی‌ها، در سطح بزرگ‌نمایی ۲ به‌صورت یک شبکه ۴×۴، و در سطح بزرگ‌نمایی ۳ به‌صورت یک شبکه ۸×۸ ارائه می‌شود. برای ایجاد تصاویر برای لایه کاشی، یک تصویر نقطه ۲۵۶×۲۵۶ برای هر کاشی در هر سطح بزرگ‌نمایی که می‌خواهید پشتیبانی کنید ایجاد کنید.

افزودن لایه کاشی

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