Karo Katmanları

Platform seçin: Android iOS JavaScript

Resimleri, haritanızın üzerine karo katmanı olarak ekleyebilirsiniz. Karo katmanları, belirli bir yakınlaştırma düzeyinde bir harita karosunun üzerine yerleştirilir. Yeterli sayıda karo kullanarak Google'ın harita verilerini haritanın tamamı için birden fazla yakınlaştırma düzeyinde tamamlayabilirsiniz.

Giriş

Karo katmanları (bazen karo yer paylaşımları olarak da adlandırılır), resimleri Google'ın temel harita karolarının üzerine yerleştirmenize olanak tanır. Bu, uygulamanıza önemli yerler veya trafik bilgileri gibi verileri ve yerel görüntüleri eklemenin mükemmel bir yoludur. Karo katmanları, kGMSTypeNone harita türüyle birlikte kullanıldığında Google'ın temel harita verilerini kendi verilerinizle etkili bir şekilde değiştirmenize olanak tanır.

Haritaya genellikle geniş coğrafi alanları kapsayan kapsamlı görüntüler eklemek istediğinizde karo katmanları faydalıdır. Buna karşılık, zemin yer paylaşımları, haritadaki tek bir noktada tek bir resmi sabitlemek istediğinizde kullanışlıdır.

Parça koordinatları

Haritalar API'si, her yakınlaştırma düzeyindeki görüntüleri düzenli bir ızgara şeklinde düzenlenmiş bir dizi kare harita kartı olarak ayırır. Harita yeni bir konuma veya yeni bir yakınlaştırma düzeyine kaydırılırken Maps API hangi karoların gerekli olduğunu belirler ve bunu alınacak bir karo grubuna dönüştürür.

Google'ın Mercator projeksiyonunu uygulamasında, (0,0) koordinatına sahip karo her zaman haritanın kuzeybatı köşesindedir. x değerleri batıdan doğuya doğru, y değerleri ise kuzeyden güneye doğru artar. Kartlar, bu kaynaktaki x,y koordinatları kullanılarak dizine eklenir. Örneğin, 2. yakınlaştırma düzeyinde, dünya 16 karoya bölündüğünde her karoya benzersiz bir x,y çifti ile referans verilebilir:

Dört satır ve dört sütun halindeki karolara bölünmüş dünya haritası.

Her harita karosu 256x256 nokta karesidir. 0 yakınlaştırma düzeyinde dünyanın tamamı tek bir karoda oluşturulur. Her yakınlaştırma seviyesi, büyütmeyi iki kat artırır. Bu nedenle, 1. yakınlaştırma düzeyinde harita 2x2 karo ızgarası olarak, 2. yakınlaştırma düzeyinde 4x4 ızgara, 3. yakınlaştırma düzeyinde 8x8 ızgara olarak oluşturulur. Bir karo katmanı için resim oluşturuyorsanız desteklemek istediğiniz her yakınlaştırma düzeyinde her karo için yeni bir 256x256 piksel resim oluşturmanız gerekir.

Kart katmanı ekleme

  1. Bir GMSURLTileLayer nesnesi veya GMSTileLayer ya da GMSSyncTileLayer sınıfının özel alt sınıfını oluşturun.
  2. İsteğe bağlı olarak, zIndex mülkünü diğer karo katmanlarına göre konumunu ayarlayacak şekilde değiştirin.
  3. GMSTileLayer nesnesini map özelliğini ayarlayarak haritaya atayın.

iOS için Haritalar SDK'sı, karo katmanı uygulamak için kullanılabilecek üç sınıf sağlar. Her sınıfta, belirli bir {x,y,zoom} koordinat grubu için doğru harita karosunun nasıl getirileceğini tanımlamanız gerekir. Kullanabileceğiniz seçenekler şunlardır:

  • GMSSyncTileLayer alt sınıfı, UIImage örnekleri döndüren tileForX:y:zoom uygulamasını sağlar.
  • Daha sonra bir karo resmiyle geri çağıran requestTileForX:y:zoom adlı eşzamansız yöntemin uygulanmasını sağlayan GMSTileLayer alt sınıfı.
  • GMSTileURLConstructor bloğunu sağlayarak URL'lerden karoları otomatik olarak almak için mevcut GMSURLTileLayer sınıfını kullanın. GMSURLTileLayer sınıfı, alt sınıf oluşturulamayan somut bir sınıftır.

GMSSyncTileLayer veya GMSTileLayer alt sınıfı oluşturulduğunda, nil karo sonucu sağlandığında iOS için Haritalar SDK'sına verilerin şu anda kullanılamadığını ancak gelecekte kullanılabileceğini bildirir. Alternatif olarak, bu konumda karo olmadığını belirtmek için kGMSTileLayerNoTile döndürebilirsiniz.

GMSURLTileLayer için GMSTileURLConstructor kaynağından nil döndürülmesi, bu konumda karo olmadığını gösterir.

URL'lerden karo almak için GMSURLTileLayer'ı kullanma

GMSURLTileLayer için alt sınıf oluşturmanız gerekmez ancak GMSTileURLConstructor bloğunu uygulamanız gerekir. Aşağıdaki kodda, çok katlı bir binanın kat planını görüntülemek için GMSURLTileLayer işlevinin nasıl kullanılacağı gösterilmektedir.

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;
      

Kartları UIImage olarak yayınlamak için GMSSyncTileLayer sınıfını alt sınıfa alma

GMSSyncTileLayer ve GMSTileLayer, alt sınıf oluşturulacak şekilde tasarlanmış soyut sınıflardır. Kartları UIImage olarak yayınlamak için bu sınıfları kullanabilirsiniz. Aşağıdaki örnekte, GMSSyncTileLayer sınıfını alt sınıflandırarak haritadaki bazı karoların üzerine özel bir resmin nasıl oluşturulacağı gösterilmektedir.

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
      

Katmanı haritanıza eklemek için nesneyi örnekleyin ve harita özelliğini ayarlayın.

Swift

let layer = TestTileLayer()
layer.map = mapView
      

Objective-C

GMSTileLayer *layer = [[TestTileLayer alloc] init];
layer.map = mapView;
      

Retina cihazlar için yüksek DPI karoları

tileSize değerini 512 olarak ayarlayarak GMSSyncTileLayer veya GMSURLTileLayer ile yüksek DPI resimler kullanabilirsiniz. tileSize mülkü, döndürülen karo resimlerinin tercih edeceği piksel sayısını belirtir. Bu değer varsayılan olarak 256'dır (Retina olmayan bir cihazdaki Google Haritalar karosunun boyutu).

Yüksek DPI'li bir cihazda normal DPI karoları gösteriyorsanız tileSize değerini 512 olarak ayarlayarak resimleri büyütebilirsiniz. Resimleri büyütmenin, özellikle ince çizgiler veya metinler söz konusu olduğunda resim kalitesini düşürebileceğini unutmayın. En iyi sonuçlar için tileSize ve resim DPI'sini ekranla eşleştirin. Retina cihazlarda gösterilen haritalar, 512 tileSize değerine sahip yüksek DPI resimler gösterilirken en iyi şekilde görünür. Retina dışı cihazlarda gösterilen haritalar ise normal resimler ve varsayılan 256 tileSize değeriyle harika görünür.

Eski karoları temizleme

Katman tarafından sağlanan karolar "geçersiz" hale gelirse yenilemeyi zorlamak için katmanda clearTileCache yöntemi çağrılmalıdır. Bu işlem, bu katmandaki tüm karoların yeniden yüklenmesine neden olur.

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];