Karo Katmanları

Platform seçin: Android iOS JavaScript

Haritanızın üzerine bir Karo Katmanı olarak resim ekleyebilirsiniz. Karo Katmanları, harita karosunun üzerine belirli bir yakınlaştırma düzeyinde yerleştirilir. Yeterli sayıda karoyla, Google'ın harita verilerini tüm harita için birden fazla yakınlaştırma düzeyinde tamamlayabilirsiniz.

Giriş

Karo katmanları (Bazen Karo Yer Paylaşımları da denir), görüntüleri Google'ın temel harita karolarının üzerine yerleştirmenize olanak tanır. Bu, önemli yerler veya trafik bilgileri gibi verileri ve yerel görüntüleri uygulamanıza eklemenin mükemmel bir yoludur. kGMSTypeNone harita türüyle birleştirildiğinde, karo katmanları, Google'ın temel harita verilerini etkili bir şekilde kendi verilerinizle değiştirmenize olanak tanır.

Karo katmanları, haritaya genellikle büyük coğrafi alanları kapsayan kapsamlı görüntüler eklemek istediğinizde kullanışlıdır. Bunun aksine, yer örtüleri, harita üzerinde bir noktadaki tek bir resmi düzeltmek istediğinizde kullanışlıdır.

Parça koordinatları

Maps API, her yakınlaştırma düzeyindeki görüntüleri, sıralı bir ızgara düzeninde düzenlenmiş kare harita parçalarına ayırır. Bir harita kayarak yeni bir konuma veya yeni bir yakınlaştırma düzeyine geçtiğinde, Haritalar API'si hangi kartların gerektiğini belirler ve bunu alınması için bir dizi karoya dönüştürür.

Google'ın Mercator projeksiyonunu uygulaması için (0,0) koordinatlı 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. Karolar, ilgili kaynaktan x,y koordinatları kullanılarak dizine eklenir. Örneğin, yakınlaştırma seviyesi 2'de, dünya 16 karoya bölündüğünde her kutu benzersiz bir x,y çiftiyle referans verilebilir:

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

Her bir harita parçası, 256x256 noktalı bir karedir. Zum düzeyi 0'da, tüm dünya tek bir karo içinde görüntülenir. Her yakınlaştırma düzeyi, büyütmeyi iki kat artırır. Böylece, yakınlaştırma düzeyinde 1 harita, 2x2 karo ızgarası veya 2. yakınlaştırma düzeyinde 4x4 ızgara, 3. yakınlaştırma düzeyinde 8x8 ızgara vb. olarak görüntülenir. Karo katmanı için resimler oluşturuyorsanız desteklemek istediğiniz her yakınlaştırma düzeyinde her parça için 256x256 nokta resmi oluşturmanız gerekir.

Karo Katmanı Ekleme

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

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

  • UIImage örnekleri döndüren tileForX:y:zoom uygulamasının uygulanmasını sağlayan GMSSyncTileLayer alt sınıfı.
  • Daha sonra parça resmiyle geri çağıran eşzamansız requestTileForX:y:zoom yönteminin uygulanmasını sağlayan GMSTileLayer alt sınıfı.
  • Karoları URL'lerden otomatik olarak getirmek için mevcut GMSURLTileLayer sınıfını kullanın. Böylece GMSTileURLConstructor engellemesi sağlanır. GMSURLTileLayer, alt sınıflandırılamayan somut bir sınıftır.

GMSSyncTileLayer veya GMSTileLayer alt sınıflandırma söz konusu olduğunda, bir nil parça sonucu sağladığınızda iOS için Haritalar SDK'sı bu verinin şu anda kullanılamadığını ancak gelecekte kullanılabileceğini bildirir. Alternatif olarak, bu konumda hiç karo olmadığını belirtmek için kGMSTileLayerNoTile döndürün.

GMSURLTileLayer için GMSTileURLConstructor öğesinden nil döndürüldüğünde bu konumda karo bulunmadığı anlamına gelir.

URL'lerden karo almak için "GMSURLTiletier" 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;
      

Karoları UIImage olarak yayınlamak için GMSSyncTileLayer alt sınıfını oluşturun

GMSSyncTileLayer ve GMSTileLayer, alt sınıflandırılmak üzere tasarlanmış soyut sınıflardır. Kartları UIImage olarak yayınlamak için bu sınıfları kullanabilirsiniz. Aşağıdaki örnekte, GMSSyncTileLayer alt sınıfı kullanılarak haritadaki bazı karolar ü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 ö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 yaparak yüksek DPI'ya sahip resimleri GMSSyncTileLayer veya GMSURLTileLayer ile kullanabilirsiniz. tileSize özelliği, döndürülen karo görsellerinin görüntülemeyi tercih edeceği piksel sayısını belirtir. Varsayılan olarak 256 piksel (retina olmayan bir cihazdaki Google Haritalar blokunun boyutu) ayarlanır.

Yüksek DPI'lı bir cihazda normal DPI karoları görüntülüyorsanız tileSize değerini 512'ye ayarlayarak resimleri ölçeklendirebilirsiniz. Resimleri ölçeklendirmenin, özellikle ince çizgiler veya metinlerde resim kalitesini düşürebileceğini unutmayın. En iyi sonuçlar için tileSize ve görüntü DPI'sını ekranla eşleştirin. Bir Retina cihazda gösterilen haritalar, tileSize 512 piksellik yüksek DPI'lı resimler görüntülenirken en iyi görünürken, Retina olmayan bir cihazda gösterilen haritalar normal resimlerle ve varsayılan tileSize değeri olan 256'yla mükemmel görünür.

Eski karoları temizleme

Katman tarafından sağlanan karolar "eski" 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];