Yer Paylaşımları

Platform seçin: Android iOS JavaScript

Karo katmanı, bazen karo katmanı olarak da adlandırılır ve temel harita karolarının üzerinde görüntülenen bir resim koleksiyonudur.

Kod Örnekleri

GitHub'daki ApiDemos deposunda karo yer paylaşımı özelliğini gösteren bir örnek bulunur:

Giriş

TileOverlay, temel harita karolarının üzerine eklenen bir dizi resmi tanımlar.

Desteklemek istediğiniz her yakınlaştırma düzeyi için karoları sağlamanız gerekir. Birden fazla yakınlaştırma düzeyinde yeterli sayıda karonuz varsa haritanın tamamı için Google'ın harita verilerini ekleyebilirsiniz.

Haritaya, genellikle geniş coğrafi alanları kapsayan kapsamlı görüntüler eklemek istediğinizde karo yer paylaşımları yararlı olur. Buna karşılık, zemin bindirmeleri harita üzerinde bir alandaki tek bir resmi düzeltmek istediğinizde yararlı olur.

Haritaya ekstra özellikler eklemek için karo yer paylaşımında programatik olarak bir şeffaflık faktörü ayarlayarak veya şeffaf karo resimleri sağlayarak şeffaf karo yer paylaşımlarını da kullanabilirsiniz.

Karo koordinatları ve yakınlaştırma seviyeleri

Google Haritalar API'si, her yakınlaştırma düzeyindeki görüntüleri bir ızgara düzeninde düzenlenmiş kare harita desenlerine ayırır. Bir harita yeni bir konuma veya yeni bir yakınlaştırma düzeyine taşındığında, Haritalar API'si hangi kartların gerekli olduğunu belirler ve bu bilgileri alınması için bir dizi karoya dönüştürür.

Koordinatlara (0,0) sahip karo her zaman haritanın kuzeybatı köşesinde yer alır. X değerleri batıdan doğuya ve y değerleri kuzeyden güneye doğru artar. Karolar, ilgili kaynaktan x,y koordinatları kullanılarak dizine eklenir.

Yakınlaştırma düzeyi 0 olduğunda, tüm dünya tek bir karoda görüntülenir. Her yakınlaştırma düzeyi, büyütmeyi iki kat artırır. Dolayısıyla, yakınlaştırma düzeyi 1 olduğunda harita 2x2'lik karo ızgarası olarak oluşturulur. Zum düzeyi 2'de, 4x4 boyutunda bir ızgaradır. Zum düzeyi 3'te, 8x8 ızgaradır ve bu şekilde devam eder.

Örneğin, yakınlaştırma düzeyinde 2, dünya 16 karoya bölünür. Her bir parçaya x, y ve yakınlaştırmanın benzersiz bir kombinasyonuyla referans verilebilir:

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

Bir karo katmanı için resim oluştururken, desteklemek istediğiniz her yakınlaştırma düzeyindeki her karo için bir resim oluşturmanız gerekir. Google Haritalar, kartları görüntülerken 256 dp'yi (cihazdan bağımsız piksel) hedefler. Yüksek çözünürlüklü cihazlar için yüksek dpi parçaları (512x512 piksel) döndürmeniz önerilir. Farklı ekran boyutlarını ve yoğunluklarını destekleme hakkında bilgi için Android Geliştiricileri belgelerine bakın.

Not: Kameranın desteklediği yakınlaştırma düzeyleri çeşitli faktörlere bağlıdır ve karolarınızın desteklediği yakınlaştırma düzeyleriyle ilgili değildir.

  1. GoogleMap.getMaxZoomLevel(), geçerli kamera konumunda kullanılabilen maksimum yakınlaştırma düzeyini döndürür. Bunun için, kullanılmakta olan harita türü dikkate alınır. Örneğin, bir uydu veya arazi haritası, temel harita parçalarından daha düşük bir maksimum yakınlaştırma düzeyine sahip olabilir.
  2. GoogleMap.getMinZoomLevel() minimum yakınlaştırma düzeyini döndürür. Bu, her konum için aynıdır (maksimum yakınlaştırma düzeyinden farklı olarak) ancak cihazlar ile harita boyutları arasında değişiklik gösterebilir.

Karo yer paylaşımı ekleme

Karo yer paylaşımı oluşturmanın en basit ve en yaygın yolu, ilgili karo resmine işaret eden bir URL sağlamaktır. UrlTileProvider, URL'ye göre resim karoları sağlayan TileProvider özelliğinin kısmi bir uygulamasıdır. Bu sınıf, tüm resimlerin aynı boyutlara sahip olmasını gerektirir.

Parça koordinatlarını (x, y, yakınlaştırma) kabul eden ve parça için kullanılacak resmi işaret eden bir URL döndüren UrlTileProvider.getTileUrl() özelliğini uygulamanız gerekir. Belirtilen x, y ve yakınlaştırma için bir karo yoksa yöntem null değerini döndürmelidir. Bir URL; bir web kaynağına, Android öğesine veya yerel diskteki bir dosyaya işaret edebilir.

Döşeme resim stokunuzu, desteklemek istediğiniz tüm x,y koordinatları ve yakınlaştırma seviyeleri için tanımlanmış bir sunucuda oluşturun. Ardından karo yer paylaşımını ekleyin:

  1. Karo resimlerini sağlamak için UrlTileProvider tanımlayın.
  2. Her karo resmin URL'sini oluşturmak için getTileUrl() değerini geçersiz kılın.
  3. İlgili seçeneklere sahip bir TileOverlayOptions nesnesi sağlayın:
    • fadeIn: Boole. Karoların şeffaf hale gelip gelmeyeceğini belirler. Varsayılan değer: true. Karo yer paylaşımları arasında hızlı bir şekilde geçiş yaparken kararma efektini devre dışı bırakmak işinize yarayabilir. Şeffaflık ve belirme arasındaki ilişki hakkında bilgi için aşağıdaki şeffaflık bölümüne bakın.
    • tileProvider: Bu yer paylaşımı için kullanılacak TileProvider.
    • transparency: Kayan. Karo resimleri için bir şeffaflık faktörü ayarlar. Değer, 0.0f tamamen opak (varsayılan) ve 1.0f tamamen şeffaf anlamına geldiği [0.0f, 1.0f] aralığında olmalıdır. Bir kod örneği ve şeffaflık ile şeffaflaşma arasındaki ilişki için aşağıdaki şeffaflık bölümüne bakın.
    • visible: Boole. Karo yer paylaşımının görünürlüğünü belirtir. Haritada bir görünmez karo yer paylaşımı (false değeri) çizilmemiştir ancak haritada diğer tüm özellikleri korunur. Varsayılan değer: true.
    • zIndex: Zemin yer paylaşımları , daireler, çoklu çizgiler ve poligonlar dahil olmak üzere karo yer paylaşımının diğer bindirmelere göre çizilme sırasını belirler. Z-endeksi daha yüksek olan bindirmeler, Z-endeksi düşük olanların üzerine çizilir. Aynı Z-endeksine sahip yer paylaşımlarının sırası rastgeledir. Varsayılan Z-endeksi 0'dır. İşaretçilerin, diğer yer paylaşımlarının Z-endeksinden bağımsız olarak her zaman diğer yer paylaşımlarının üzerine çizildiğini unutmayın.
  4. Yer paylaşımını haritaya eklemek için GoogleMap.addTileOverlay() kodunu çağırın.

Kotlin



private lateinit var map: GoogleMap

var tileProvider: TileProvider = object : UrlTileProvider(256, 256) {
    override fun getTileUrl(x: Int, y: Int, zoom: Int): URL? {

        /* Define the URL pattern for the tile images */
        val url = "http://my.image.server/images/$zoom/$x/$y.png"
        return if (!checkTileExists(x, y, zoom)) {
            null
        } else try {
            URL(url)
        } catch (e: MalformedURLException) {
            throw AssertionError(e)
        }
    }

    /*
     * Check that the tile server supports the requested x, y and zoom.
     * Complete this stub according to the tile range you support.
     * If you support a limited range of tiles at different zoom levels, then you
     * need to define the supported x, y range at each zoom level.
     */
    private fun checkTileExists(x: Int, y: Int, zoom: Int): Boolean {
        val minZoom = 12
        val maxZoom = 16
        return zoom in minZoom..maxZoom
    }
}

val tileOverlay = map.addTileOverlay(
    TileOverlayOptions()
        .tileProvider(tileProvider)
)

      

Java


private GoogleMap map;

TileProvider tileProvider = new UrlTileProvider(256, 256) {

    @Override
    public URL getTileUrl(int x, int y, int zoom) {

        /* Define the URL pattern for the tile images */
        String s = String.format("http://my.image.server/images/%d/%d/%d.png", zoom, x, y);

        if (!checkTileExists(x, y, zoom)) {
            return null;
        }

        try {
            return new URL(s);
        } catch (MalformedURLException e) {
            throw new AssertionError(e);
        }
    }

    /*
     * Check that the tile server supports the requested x, y and zoom.
     * Complete this stub according to the tile range you support.
     * If you support a limited range of tiles at different zoom levels, then you
     * need to define the supported x, y range at each zoom level.
     */
    private boolean checkTileExists(int x, int y, int zoom) {
        int minZoom = 12;
        int maxZoom = 16;

        return (zoom >= minZoom && zoom <= maxZoom);
    }
};

TileOverlay tileOverlay = map.addTileOverlay(new TileOverlayOptions()
    .tileProvider(tileProvider));

      

Bir UrlTileProvider uygulamasının nasıl çalıştığını görmek için Google Play Hizmetleri SDK'sı ile birlikte gelen örnek koddaki TileOverlayDemoActivity bölümüne bakın.

Karo yer paylaşımları için şeffaflığı ayarlama

Şeffaf karoların harita üzerine yerleştirilmesi, kullanıcıların yer paylaşımlı blokların altındaki temel haritayı görebilmesi için yararlı olabilir. Bunu, kendi şeffaf karolarınızı sağlayarak veya karo yer paylaşımında programatik olarak bir şeffaflık faktörü ayarlayarak yapabilirsiniz.

Aşağıdaki kod örneği, karo yer paylaşımının şeffaflığını 0.5f ve 0.0f arasında değiştirir:

Kotlin



private var tileOverlayTransparent: TileOverlay? = null

override fun onMapReady(map: GoogleMap) {
    tileOverlayTransparent = map.addTileOverlay(
        TileOverlayOptions()
            .tileProvider(object : UrlTileProvider(256, 256) {
                // ...
            })
            .transparency(0.5f)
    )
}

// Switch between 0.0f and 0.5f transparency.
fun toggleTileOverlayTransparency() {
    tileOverlayTransparent?.let {
        it.transparency = 0.5f - it.transparency
    }
}

      

Java


private TileOverlay tileOverlayTransparent;

@Override
public void onMapReady(GoogleMap map) {
    tileOverlayTransparent = map.addTileOverlay(new TileOverlayOptions()
        .tileProvider(new UrlTileProvider(256, 256) {
            // ...
        })
        .transparency(0.5f));
}

// Switch between 0.0f and 0.5f transparency.
public void toggleTileOverlayTransparency() {
    if (tileOverlayTransparent != null) {
        tileOverlayTransparent.setTransparency(0.5f - tileOverlayTransparent.getTransparency());
    }
}

      

Şeffaflık, parça resimleri için alfa kanalı çarpanı olarak uygulanır. Bir karo yer paylaşımının şeffaflığını ayarlamak için yukarıdaki örnekte gösterildiği gibi [0.0f, 1.0f] aralığında transparency bulunan bir TileOverlayOptions nesnesi sağlayın. 0.0f değeri, karo yer paylaşımının tamamen opak olduğu, 1.0f değeri ise tamamen şeffaf olduğu anlamına gelir. Varsayılan değer 0.0f'dir (opak).

Karo yer paylaşımının şeffaflığına TileOverlay.getTransparency() yöntemini çağırarak erişebilir, TileOverlay.setTransparency() yöntemini çağırarak ise değiştirebilirsiniz.

Şeffaflık, animasyon ve belirme

Şeffaflık değiştirildiğinde animasyon gösterilmez. Şeffaflık seçeneği, fadeIn seçeneğiyle birlikte çalışır.

Şeffaflaştırma, karo yüklendikten sonra şeffaflık animasyonu sağlar. Bir şeffaflık değeri ayarlarsanız karolar tamamen şeffaftan tanımlanan şeffaflık değerine dönüşür. Şeffaflaştırma sırasında şeffaflığı değiştirirseniz animasyon, yeni hedef şeffaflığına doğru devam eder.

Karo yer paylaşımını kaldırma

Bir karo yer paylaşımını TileOverlay.remove() yöntemini kullanarak kaldırabilirsiniz.

Kotlin



tileOverlay?.remove()

      

Java


tileOverlay.remove();

      

Eski karoları temizle

Karo yer paylaşımı tarafından sağlanan karolar "eski" hale gelirse yenilemeyi zorlamak için clearTileCache() çağrısı yapabilirsiniz. Bu işlem, bu yer paylaşımındaki tüm karoların yeniden yüklenmesine neden olur. Örneğin, TileProvider ile sağlanan karolar değişirse önceki karoların artık oluşturulmadığından emin olmak için daha sonra clearTileCache() yöntemini çağırmanız gerekir.

Kotlin



tileOverlay?.clearTileCache()

      

Java


tileOverlay.clearTileCache();