Karo Katmanları

Platform seçin: Android iOS JavaScript

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

Giriş

Karo katmanları (Bazen Karo Yer Paylaşımları olarak adlandırılır), görüntüleri Google'ın temel harita döşemelerinin üzerine yerleştirmenize olanak tanır. Bu, önemli yerler veya trafik bilgileri gibi verileri ve yerel görüntüleri uygulamanıza eklemenin harika bir yoludur. Parça 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.

Karo katmanları haritaya, genellikle geniş coğrafi alanları kapsayan kapsamlı görüntüler eklemek istediğinizde yararlı olur. Bunun aksine, yer yer paylaşımları harita üzerindeki bir noktada tek bir resmi düzeltmek istediğinizde yararlı olur.

Parça koordinatları

Maps API, her yakınlaştırma düzeyindeki görüntüleri, sıralı bir ızgarada düzenlenmiş bir dizi kare harita karosuna böler. Bir harita kayarak yeni bir konuma ya da yeni bir yakınlaştırma düzeyine geldiğinde, Haritalar API'si hangi kutuların gerektiğini belirler ve bunu almak için bir dizi karoya dönüştürür.

Google'ın Mercator projeksiyonunu uygularken (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 parçaya bölündüğünde her bir parçaya benzersiz bir x,y çiftiyle referans verilebilir:

Dört satır ve dört karo sütuna ayrılmış dünya haritası.

Her bir harita parçası, 256x256 nokta boyutunda bir karedir. Yakınlaştırma düzeyi 0 olduğunda, tüm dünya tek bir parçada oluşturulur. Her yakınlaştırma düzeyi, büyütmeyi iki kat artırır. Bu nedenle, yakınlaştırma düzeyi 1 olduğunda harita, 2x2 karo ızgarası veya 2. yakınlaştırma düzeyinde 4x4 ızgara, 3. yakınlaştırma düzeyinde 8x8 boyutlu bir ızgara vb. olarak oluşturulur. Karo katmanı için resim oluşturuyorsanız desteklemek istediğiniz her yakınlaştırma düzeyinde her parça için 256x256 nokta boyutunda yeni bir resim oluşturmanız gerekir.

Karo Katmanı Ekleme

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

iOS için Haritalar SDK'sı, bir karo katmanı 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. Mevcut seçenekler şunlardır:

  • UIImage örnekleri döndüren tileForX:y:zoom uygulamasının uygulanmasını sağlayan GMSSyncTileLayer alt sınıfı.
  • GMSTileLayer alt sınıfı, daha sonra bir parça görüntüsüyle geri çağıran eşzamansız requestTileForX:y:zoom yönteminin uygulanmasını sağlar.
  • Mevcut GMSURLTileLayer sınıfını kullanarak, blokları URL'lerden otomatik olarak getirin ve GMSTileURLConstructor engellemesini sağlayın. GMSURLTileLayer, alt sınıflandırılmamış bir somut sınıftır.

GMSSyncTileLayer veya GMSTileLayer alt sınıflandırması söz konusu olduğunda, nil karo sonucu sağlamak, iOS için Haritalar SDK'sına verilerin şu anda kullanılamadığını, ancak gelecekte kullanılabilir olabileceğini bildirir. Alternatif olarak, bu konumda hiç karo olmadığını belirtmek için kGMSTileLayerNoTile döndürün.

GMSURLTileLayer için GMSTileURLConstructor değerinden nil döndürülmesi, bu konumda hiç karo olmadığını belirtir.

URL'lerden blok almak için "GMSURLTileLayer" kullanma

GMSURLTileLayer, alt sınıflandırma gerektirmez ancak GMSTileURLConstructor blokunu uygulamanız gerekir. Aşağıdaki kodda, çok katlı bir binanın kat planını görüntülemek için GMSURLTileLayer öğesinin 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 sunmak için GMSSyncTileLayer alt sınıfını kullanın

GMSSyncTileLayer ve GMSTileLayer, alt sınıflandırılmak üzere tasarlanmış soyut sınıflardır. Kartları UIImage olarak sunmak için bu sınıfları kullanabilirsiniz. Aşağıdaki örnekte, GMSSyncTileLayer alt sınıfı kullanılarak haritadaki bazı parçalar üzerinde nasıl özel bir resim 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 somutlaştırın 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 Parçalar

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. Bu varsayılan değer, Retina olmayan bir cihazdaki Google Haritalar parçasının boyutu olan 256'dı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 daha büyük hale getirmenin, özellikle ince çizgiler veya metinler için 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. Retina cihazda gösterilen haritalar, tileSize değeri 512 olan yüksek DPI'lı resimler görüntülenirken en iyi şekilde görünürken, Retina olmayan bir cihazda gösterilen haritalar normal resimlerle ve varsayılan tileSize değeri 256'yla harika görünür.

Eski karolar temizleniyor

Katman tarafından sağlanan parçalar "eski" hale gelirse yenilemeye 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];