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:
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
- Bir
GMSURLTileLayer
nesnesi veyaGMSTileLayer
ya daGMSSyncTileLayer
sınıfının özel alt sınıfını oluşturun. - İsteğe bağlı olarak,
zIndex
mülkünü diğer karo katmanlarına göre konumunu ayarlayacak şekilde değiştirin. GMSTileLayer
nesnesinimap
ö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ürentileForX: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ğlayanGMSTileLayer
alt sınıfı. GMSTileURLConstructor
bloğunu sağlayarak URL'lerden karoları otomatik olarak almak için mevcutGMSURLTileLayer
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];