टाइल की लेयर

प्लैटफ़ॉर्म चुनें: Android iOS JavaScript

आपके पास टाइल लेयर के तौर पर, अपने मैप पर इमेज जोड़ने का विकल्प होता है. टाइल लेयर, किसी खास ज़ूम लेवल पर मैप की टाइल के ऊपर रखी जाती हैं. ज़्यादा टाइलें होने पर, आपके पास कई ज़ूम लेवल पर पूरे मैप के लिए, Google के मैप डेटा को सप्लीमेंट करने का विकल्प होता है.

परिचय

टाइल लेयर को कभी-कभी टाइल ओवरले भी कहा जाता है. इनकी मदद से, Google के बेस मैप की टाइल पर इमेज लगाई जा सकती हैं. इस सुविधा का इस्तेमाल करके, अपने ऐप्लिकेशन में दिलचस्पी की जगहें या ट्रैफ़िक की जानकारी जैसे डेटा और स्थानीय इमेज जोड़ी जा सकती हैं. kGMSTypeNone मैप टाइप के साथ इस्तेमाल करने पर, टाइल लेयर की मदद से Google के बेस मैप डेटा को अपने डेटा से बदला जा सकता है.

टाइल लेयर तब काम की होती हैं, जब आपको मैप में ज़्यादा इमेज जोड़नी हों. आम तौर पर, ये इमेज बड़े भौगोलिक इलाकों को कवर करती हैं. इसके उलट, ग्राउंड ओवरलेज़ तब काम के होते हैं, जब आपको मैप पर किसी एक जगह पर कोई इमेज लगानी हो.

टाइल कोऑर्डिनेट

Maps API, हर ज़ूम लेवल पर इमेज को स्क्वेयर मैप टाइल के सेट में तोड़ता है. इन टाइल को क्रम से लगाई गई ग्रिड में व्यवस्थित किया जाता है. जब कोई मैप, नई जगह या नए ज़ूम लेवल पर स्क्रोल होता है, तो Maps API यह तय करता है कि किन टाइल की ज़रूरत है. इसके बाद, यह जानकारी फ़ेच करने के लिए टाइल के सेट में बदल जाती है.

मर्केटर प्रोजेक्शन के Google के वर्शन में, कोऑर्डिनेट (0,0) वाली टाइल हमेशा मैप के उत्तर-पश्चिम कोने पर होती है. इसमें x की वैल्यू पश्चिम से पूर्व की ओर और y की वैल्यू उत्तर से दक्षिण की ओर बढ़ती है. टाइलों को, ऑरिजिन से x,y कोऑर्डिनेट का इस्तेमाल करके इंडेक्स किया जाता है. उदाहरण के लिए, ज़ूम लेवल 2 पर, जब पृथ्वी को 16 टाइलों में बांटा जाता है, तो हर टाइल को x,y के यूनीक पेयर से रेफ़र किया जा सकता है:

दुनिया का मैप, जिसे चार लाइनों और चार कॉलम वाली टाइलों में बांटा गया है.

मैप की हर टाइल, 256x256 पॉइंट का स्क्वेयर होती है. ज़ूम लेवल 0 पर, पूरी दुनिया को एक टाइल में रेंडर किया जाता है. हर ज़ूम लेवल, मैग्निफ़िकेशन को दो के फ़ैक्टर से बढ़ाता है. इसलिए, उदाहरण के लिए, ज़ूम लेवल 1 पर मैप को टाइल की 2x2 ग्रिड के तौर पर, ज़ूम लेवल 2 पर 4x4 ग्रिड के तौर पर , और ज़ूम लेवल 3 पर 8x8 ग्रिड के तौर पर रेंडर किया जाता है. टाइल लेयर के लिए इमेज बनाने के लिए, हर ज़ूम लेवल पर हर टाइल के लिए 256x256 पॉइंट की इमेज बनाएं.

टाइल लेयर जोड़ना

  1. GMSURLTileLayer ऑब्जेक्ट या GMSTileLayer या GMSSyncTileLayer की पसंद के मुताबिक सबक्लास का इंस्टैंशिएट करें.
  2. ज़रूरी नहीं: अन्य टाइल लेयर के मुकाबले इसकी पोज़िशन अडजस्ट करने के लिए, zIndex प्रॉपर्टी में बदलाव करें.
  3. GMSTileLayer ऑब्जेक्ट को मैप पर असाइन करने के लिए, उसकी map प्रॉपर्टी सेट करें.

iOS के लिए Maps SDK, टाइल लेयर को लागू करने के लिए तीन क्लास उपलब्ध कराता है. हर क्लास के लिए, आपको यह तय करना होगा कि {x,y,zoom} कोऑर्डिनेट के दिए गए सेट के लिए, मैप की सही टाइल कैसे फ़ेच की जाए. ये विकल्प उपलब्ध हैं:

  • GMSSyncTileLayer की सबक्लास बनाएं. साथ ही, tileForX:y:zoom को लागू करें, जो UIImage इंस्टेंस लौटाता है.
  • GMSTileLayer की सबक्लास बनाएं. साथ ही, एसिंक्रोनस तरीके requestTileForX:y:zoom को लागू करें, जो बाद में टाइल इमेज के साथ वापस कॉल करता है.
  • यूआरएल से टाइलें अपने-आप फ़ेच करने के लिए, मौजूदा क्लास GMSURLTileLayer का इस्तेमाल करें. साथ ही, GMSTileURLConstructor ब्लॉक उपलब्ध कराएं. GMSURLTileLayer एक कॉन्क्रीट क्लास है, जिसे सबक्लास नहीं किया जा सकता.

GMSSyncTileLayer या GMSTileLayer की सबक्लास बनाने पर, nil टाइल का नतीजा देने से, iOS के लिए Maps SDK को यह पता चलेगा कि डेटा उपलब्ध नहीं है, लेकिन यह आने वाले समय में उपलब्ध हो सकता है. इसके अलावा, यह बताने के लिए kGMSTileLayerNoTile लौटाएं कि इस जगह पर कोई टाइल नहीं है.

GMSURLTileLayer के लिए, GMSTileURLConstructor से nil लौटाने पर, यह पता चलेगा कि इस जगह पर कोई टाइल नहीं है.

यूआरएल से टाइलें फ़ेच करने के लिए, 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
      

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;
      

टाइलों को UIImage के तौर पर दिखाने के लिए, GMSSyncTileLayer की सबक्लास बनाना

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 टाइलें

GMSSyncTileLayer या GMSURLTileLayer के साथ, हाई DPI इमेज का इस्तेमाल किया जा सकता है. इसके लिए, tileSize को 512 पर सेट करें. tileSize प्रॉपर्टी से पता चलता है कि दिखाई जाने वाली टाइल इमेज में कितने पिक्सल दिखेंगे. इसकी डिफ़ॉल्ट वैल्यू 256 होती है. यह नॉन-रेटिना डिवाइस पर Google Maps की टाइल का डाइमेंशन है.

अगर हाई DPI डिवाइस पर, सामान्य DPI टाइलें दिखाई जा रही हैं, तो tileSize को 512 पर सेट करके, इमेज को स्केल अप किया जा सकता है. ध्यान दें कि इमेज को स्केल अप करने से, इमेज की क्वालिटी कम हो सकती है. खास तौर पर, बारीक लाइनों या टेक्स्ट के लिए. सबसे अच्छे नतीजों के लिए, tileSize और इमेज DPI को डिसप्ले से मैच करें. रेटिना डिवाइस पर दिखाए जाने वाले मैप, तब सबसे अच्छे दिखेंगे, जब उनमें 512 के tileSize के साथ हाई DPI इमेज दिखाई जाएंगी. वहीं, नॉन-रेटिना डिवाइस पर दिखाए जाने वाले मैप, सामान्य इमेज और 256 के डिफ़ॉल्ट tileSize के साथ अच्छे दिखेंगे.

पुरानी टाइलें साफ़ करना

अगर लेयर से मिली टाइलें 'पुरानी' हो जाती हैं, तो उन्हें रीफ़्रेश करने के लिए, लेयर पर clearTileCache तरीके को कॉल किया जाना चाहिए. इससे इस लेयर की सभी टाइलें फिर से लोड हो जाएंगी.

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];