Karo Katmanları

Platform seçin: Android iOS JavaScript

Haritanızın üst kısmına Karo Katmanı olarak resim ekleyebilirsiniz. Döşeme Katmanları, belirli bir yakınlaştırma düzeyinde harita parçasının üzerine yerleştirilir. Yeterli sayıda karo olduğunda, birden fazla yakınlaştırma düzeyinde Google'ın harita verilerine tüm harita için ekleme yapabilirsiniz.

Giriş

Karo katmanları (bazen Karo Yer Paylaşımları olarak da adlandırılır), görüntüleri Google'ın temel harita bloklarının üzerine bindirmenize olanak tanır. Bu, uygulamanıza önemli yerler veya trafik bilgileri gibi veriler ve yerel görüntüler eklemek için mükemmel bir yoldur. kGMSTypeNone harita türüyle birleştirildiğinde, karo katmanları etkili bir şekilde Google'ın temel harita verilerini kendi verilerinizle değiştirmenize olanak tanır.

Karo katmanları, haritaya genellikle geniş coğrafi alanları kapsayan kapsamlı görüntüler eklemek istediğinizde kullanışlıdır. Buna karşılık, zemin örtüşmeleri haritadaki bir noktadaki tek bir resmi düzeltmek istediğinizde kullanışlıdır.

Parça koordinatları

Maps API, görüntüleri her yakınlaştırma düzeyinde, sıralı bir ızgarada düzenlenmiş kare harita parçalarına ayırır. Bir harita yeni bir konuma veya yeni bir yakınlaştırma seviyesine gittiğinde, Maps API hangi kartların gerekli olduğunu belirler ve bunu, alınabilecek bir dizi karoya dönüştürür.

Google'ın Merkatör projeksiyonu uygulamasında, koordinat (0,0) olan karo her zaman haritanın kuzeybatı köşesinde yer alır. x değerleri batıdan doğuya doğru artarken y değerleri kuzeyden güneye doğru artar. Parçalar, söz konusu kaynaktan x,y koordinatları kullanılarak dizine eklenir. Örneğin, yakınlaştırma seviyesi 2'de, dünya 16 parçaya ayrıldığında her karoya benzersiz bir x,y çiftiyle referans verilebilir:

Dört satır ve dört karo sütununa bölünmüş dünya haritası.

Her harita bloğu 256x256 nokta biçiminde bir karedir. Yakınlaştırma seviyesi 0 olduğunda, tüm dünya tek bir parçada oluşturulur. Her yakınlaştırma seviyesi, büyütmeyi iki kat artırır. Dolayısıyla, yakınlaştırma düzeyi 1'de harita, 2x2'lik bir karo ızgarası veya yakınlaştırma düzeyi 2'de 4x4'lük bir ızgara, yakınlaştırma düzeyi 3'te 8x8'lik bir ızgara vb. şeklinde oluşturulur. Bir karo katmanı için resimler oluşturuyorsanız desteklemek istediğiniz her bir yakınlaştırma düzeyinde her karo için 256x256 puntoluk yeni bir resim oluşturmanız gerekir.

Karo Katmanı Ekleme

  1. Bir GMSURLTileLayer nesnesi veya GMSTileLayer/GMSSyncTileLayer özel alt sınıfı gösterin.
  2. İsteğe bağlı olarak, diğer karo katmanlarına göre konumunu ayarlamak için zIndex özelliğini değiştirin.
  3. map özelliğini ayarlayarak GMSTileLayer nesnesini haritaya atayın.

iOS için Haritalar SDK'sı, karo katmanı uygulamak için kullanılabilecek üç sınıf sunar. Her sınıfla birlikte, belirli bir {x,y,zoom} koordinat grubu için doğru harita blokunun nasıl getirileceğini tanımlamanız gerekir. Şu seçenekleri kullanabilirsiniz:

  • UIImage örnek döndüren tileForX:y:zoom uygulanmasını sağlayan GMSSyncTileLayer alt sınıfı.
  • Daha sonra karo görüntüsüyle geri çağıran eşzamansız yöntemin requestTileForX:y:zoom uygulamasını sağlayan GMSTileLayer alt sınıfı.
  • Kutuları URL'lerden otomatik olarak getirmek ve GMSTileURLConstructor bloğunu sağlamak için mevcut GMSURLTileLayer sınıfını kullanın. GMSURLTileLayer, alt sınıflandırılması mümkün olmayan somut bir sınıftır.

GMSSyncTileLayer veya GMSTileLayer alt sınıflarının oluşturulması durumunda, nil kutucuğu sonucunun sağlanması, iOS için Haritalar SDK'sına verilerin şu anda kullanılamadığını ancak gelecekte kullanılabileceğini bildirir. Alternatif olarak, bu konumda hiç karo olmadığını belirtmek için kGMSTileLayerNoTile değerini döndürün.

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

URL'lerden karoları getirmek için "GMSURLTileKatman"ı kullanma

GMSURLTileLayer alt sınıflandırma gerektirmez ancak GMSTileURLConstructor blokunu uygulamanız gerekir. Aşağıdaki kod, çok katlı bir binanın kat planını görüntülemek için GMSURLTileLayer özelliğinin nasıl kullanılacağını göstermektedir.

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;
      

Kutuları UIImage olarak yayınlamak için GMSSyncTileLayer alt sınıfı

GMSSyncTileLayer ve GMSTileLayer, alt sınıflandırılması için tasarlanmış soyut sınıflardır. Kutuları UIImage adına yayınlamak için bu sınıfları kullanabilirsiniz. Aşağıdaki örnekte GMSSyncTileLayer alt sınıflandırması yapılarak haritadaki bazı parçalar üzerinde ö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 örneklendirin 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 yüksek DPI görüntüleri GMSSyncTileLayer veya GMSURLTileLayer ile kullanabilirsiniz. tileSize özelliği, döndürülen karo resimlerinin görüntülemeyi tercih edeceği piksel sayısını belirtir. Bu varsayılan olarak 256'ya (Retina olmayan bir cihazdaki Google Haritalar karosunun boyutu) ayarlanır.

Yüksek DPI'ya sahip bir cihazda normal DPI karoları görüntülüyorsanız tileSize değerini 512 olarak ayarlayarak görüntüleri ölçeklendirebilirsiniz. Resimleri ölçeklendirmenin, özellikle ince çizgiler ve metinler için resim kalitesini düşürebileceğini unutmayın. En iyi sonuçlar için tileSize ve resim DPI'sını ekranla eşleştirin. Retina cihazlarda gösterilen haritalar, en iyi şekilde, yüksek DPI'ya sahip resimler (tileSize/512) ile görüntülenir. Retina olmayan cihazlarda gösterilen haritalar ise normal resimlerle ve varsayılan tileSize/256 ile harika görünür.

Eski karoları temizleme

Katman tarafından sağlanan karolar "eski" hale gelirse yenilemeyi zorlamak için katmanda clearTileCache yönteminin çağrılması gerekir. Bu işlem, bu katmandaki tüm blokların yeniden yüklenmesine neden olur.

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];