Kamera ve görünüm

Platform seçin: Android iOS JavaScript

Android için Haritalar SDK'sındaki haritalar kolayca yatırılabilir ve döndürülebilir. hareketler gibi özellikler sunar. Bu özellik, kullanıcılara haritayı farklı yöne bir anlam ifade ediyor. Vektör tabanlı harita karolarının daha küçük boyutu sayesinde, herhangi bir yakınlaştırma düzeyinde haritayı kaydırabilir veya perspektifini çok az gecikmeli olarak değiştirebilirsiniz.

Kod örnekleri

GitHub'daki ApiDemos deposu, gösteriliyor:

Giriş

Web üzerindeki Google Haritalar gibi, Android için Haritalar SDK'sı da ekranındaki dünyanın yüzeyini (bir küre) kullanarak (düz bir düzlem) Mercator projeksiyonu. Dünya kendi etrafında sorunsuz bir şekilde döndüğü için doğu ve batı yönünde harita sonsuz olarak tekrarlanır. Kuzey ve güney yönünde harita yaklaşık 85 derece kuzey ve 85 derece güney ile sınırlıdır.

Not: Merkatör projeksiyonunun sonlu bir genişliği vardır uzunlukla, yatay olarak sonsuz yükseklikte. "Kaçırdık" temel harita Merkatör projeksiyonunu kullanan görüntüler için yaklaşık +/- 85 derece sonuçta elde edilen harita şeklini kare yapar, bu da döşeme için mantık yürütmeyi kolaylaştırır seçim.

Android için Haritalar SDK'sı, haritanın kamerasını değiştirerek kullanıcının haritaya bakış açısını değiştirmenize olanak tanır.

Kamerada yapılan değişiklikler, eklediğiniz işaretçilerde, yer paylaşımlarında veya diğer grafiklerde herhangi bir değişiklik yapmaz. Ancak eklediğiniz öğeleri yeni görünüme daha iyi uyacak şekilde değiştirmek isteyebilirsiniz.

Harita üzerinde kullanıcı hareketlerini dinleyebildiğinizden, haritayı yanıt verebilir. Örneğin, OnMapClickListener.onMapClick() şuna yanıt verir: haritaya bir kez dokunun. Yöntem, dokunma konumunun enlem ve boylamasını aldığından, ekranı kaydırarak veya yakınlaştırarak o noktaya yanıt verebilirsiniz. İşaretçi balonuna yapılan dokunmalara veya işaretçi üzerinde yapılan sürükleme hareketlerine yanıt vermek için benzer yöntemler kullanılabilir.

Ayrıca kamera hareketlerini de dinleyebilirsiniz. Böylece, kamera hareket etmeye başladığında, hareket halindeyken veya hareket etmeyi bıraktığında uygulamanız bildirim alır. Ayrıntılar için kamera değişikliği etkinlikleri kılavuzuna bakın.

Kamera konumu

Harita görünümü, düz bir düzlemde aşağıya bakan kamera olarak modellenir. Konum (dolayısıyla haritanın oluşturulmasının) şu özellikleri içerir: target (enlem/boylam konumu), gemi, eğme, ve yakınlaştırma tuşlarına basın.

Kamera özellikleri şeması

Hedef (konum)

Kamera hedefi, harita merkezinin konumudur ve enlem ve boylam koordinatları.

Enlem, -85 ile 85 derece arasında (bu değerler dahil) olabilir. Bu aralığın üstündeki veya altındaki değerler, bu aralıktaki en yakın değere ayarlanır. Örneğin, 100 enlem değeri belirtilirse değer 85 olarak ayarlanır. Boylam, -180 ile 180 derece arasındadır. Bu aralığın üstündeki veya altındaki değerler, (-180, 180) aralığına girecek şekilde sarmalanır. Örneğin, 480, 840 ve 1.200 değerlerinin tümü 120 dereceye yuvarlanır.

Yön (yönlendirme)

Kamera yönü, pusula yönünü belirtir. Gerçek kuzeyden derece olarak ölçülen, karşılık gelen sayfanın üst kenarına dokunun. Haritanın ortasından üst kenarına dikey bir çizgi çizerseniz yön, gerçek kuzeye göre kameranın yönüne (derece cinsinden ölçülür) karşılık gelir.

0 noktası, haritanın üst kısmının gerçek kuzeyi gösterdiği anlamına gelir. Yön değeri 90, doğuya alınması gereken harita noktalarının üst kısmıdır (pusulada 90 derece). 180 değeri, haritanın üst kısmının tam güneyi gösterdiği anlamına gelir.

Haritalar API'si bir haritanın yönünü değiştirmenize olanak tanır. Örneğin, araba kullanan bir kişi Yürüyüşçüler, harita ve seyahat yönleriyle uyumlu hale getirmek için genellikle yol haritasını dönüştürürler. dikey bir çizgi genellikle kuzeyi işaret edecek şekilde haritayı yönlendirir.

Eğim (görüntüleme açısı)

Eğim, kameranın doğrudan haritanın merkez konumunun üzerindeki bir yay üzerindeki konumunu tanımlar. Bu konum, nadir (kameranın tam altına doğru olan yön) referans alınarak derece cinsinden ölçülür. 0 değeri, doğru kameraya karşılık gelir direksiyona geçmeyin. 0'dan büyük değerler, belirtilen derece sayısı. Görüntüleme açısını değiştirdiğinizde, harita uzaktaki özelliklerle perspektifte görünür daha küçük ve yakındaki özellikler daha büyük görünüyor. Aşağıdakiler bunu gösteren resim.

Aşağıdaki resimlerde görüntüleme açısı 0 derecedir. İlk resimde bunun şematik bir gösterimi yer almaktadır. 1. konum kamera konumu, 2. konum ise mevcut harita konumudur. Ortaya çıkan harita onun altında gösterilir.

0 derece görüş açısına sahip bir kameranın 18 yakınlaştırma düzeyinde konumlandırıldığı bir haritanın ekran görüntüsü.
Kameranın varsayılan görüntüleme açısıyla görüntülenen harita.
Kameranın varsayılan konumunu, doğrudan harita konumunun üzerinde 0 derecelik bir açıyla gösteren şema.
Kameranın varsayılan görüntüleme açısı.

Aşağıdaki resimlerde görüntüleme açısı 45 derecedir. Kameranın, 3 konumuna gitmek için tam olarak baş hizasında (0 derece) ve zemin (90 derece) arasındaki bir yayın yarısına kadar hareket ettiğini görebilirsiniz. Kamera hâlâ haritanın merkez noktasını doğruluyor, ancak alan artık 4 konumundaki çizgiyle temsil edilen görünür hale gelir.

Kameranın 45 derece görüntüleme açısında ve 18 yakınlaştırma düzeyinde yerleştirildiği haritanın ekran görüntüsü.
45 derecelik bir görüntüleme açısıyla gösterilen harita.
Yakınlaştırma düzeyi 18 olarak ayarlanmışken kameranın görüntüleme açısının 45 dereceye ayarlandığını gösteren diyagram.
45 derecelik kamera izleme açısı.

Bu ekran görüntüsünde gösterilen harita, orijinal haritadakiyle aynı noktaya odaklanmış durumdadır ancak haritanın üst kısmında daha fazla özellik gösterilmektedir. Siz açıyı 45 derecenin üzerine çıkar (kamera ile harita arasındaki özellikler) harita konumunun dışındaki özellikler ise orantısal olarak daha büyük görünür ve orantılı olarak daha küçük görünürler ve üç boyutlu bir etki yaratırlar.

Tarih aralığını

Kameranın yakınlaştırma düzeyi, haritanın ölçeğini belirler. Daha yüksek yakınlaştırma seviyelerinde ekranda daha fazla ayrıntı, daha düşük yakınlaştırma seviyelerinde ise dünyanın daha büyük bir kısmı görülebilir. 0 yakınlaştırma düzeyinde, haritanın ölçeği öyledir ki dünyanın tamamı yaklaşık 256 dp (yoğunluktan bağımsız piksel) genişliğinde olur.

Yakınlaştırma düzeyini 1 artırdığınızda ekrandaki dünyanın genişliği iki katına çıkar. Dolayısıyla, N yakınlaştırma düzeyinde, dünyanın genişliği yaklaşık olarak 256 * 2N dp. Örneğin, 2. yakınlaştırma seviyesinde tüm dünya yaklaşık 1024 dp genişliğindedir.

Yakınlaştırma düzeyi tam sayı olmak zorunda değildir. Yakınlaştırma aralığı Harita tarafından izin verilen seviyeler, hedef, konum, seçenek harita türünü ve ekran boyutunu seçin. Aralık dışındaki tüm sayılar şuna dönüştürülür: minimum zum düzeyi veya en yakın geçerli değer olabilir. Maksimum yakınlaştırma seviyesi. Aşağıdaki listede, her bir yakınlaştırma düzeyinde görmeyi bekleyebileceğiniz yaklaşık ayrıntı düzeyi gösterilmektedir:

  • 1: Dünya
  • 5: Kara/kıta
  • 10: Şehir
  • 15: Sokaklar
  • 20: Binalar
Aşağıdaki resimlerde farklı yakınlaştırma düzeylerinin görsel görünümü gösterilmektedir:
5 yakınlaştırma düzeyindeki bir haritanın ekran görüntüsü
5. yakınlaştırma seviyesindeki bir harita.
15 yakınlaştırma düzeyindeki bir haritanın ekran görüntüsü
15. yakınlaştırma düzeyindeki bir harita.
20 yakınlaştırma düzeyinde bir haritanın ekran görüntüsü
20. yakınlaştırma düzeyindeki bir harita.

Kamerayı hareket ettirme

Haritalar API, haritanın hangi kısmının görünür olacağını değiştirmenize olanak tanır. Bu, kameranın konumu değiştirilerek gerçekleştirilir ( haritayı hareket ettirerek).

Kamerayı değiştirdiğinizde, yeni video modunu kamera hareketidir. Animasyon, geçerli kamera arasında arapolasyon yapar özelliklerini ve yeni kamera özelliklerini kullanıyor. Ayrıca, süresi belirlenebilir.

Kameranın konumunu değiştirmek için istediğiniz yeri belirtmeniz gerekir CameraUpdate kullanarak kamerayı hareket ettirin. Maps API kullanarak çok sayıda farklı CameraUpdate türü oluşturmanızı sağlar. CameraUpdateFactory. Aşağıdaki seçenekler kullanılabilir:

Yakınlaştırma düzeyini değiştirme ve minimum/maksimum yakınlaştırmayı ayarlama

CameraUpdateFactory.zoomIn() ve CameraUpdateFactory.zoomOut() yakınlaştırma düzeyini 1, 0 değiştiren bir CameraUpdate değerini döndürürken aynı olacaktır.

CameraUpdateFactory.zoomTo(float), diğer tüm özellikleri aynı tutarken yakınlaştırma düzeyini belirtilen değere değiştiren bir CameraUpdate döndürür.

CameraUpdateFactory.zoomBy(float) ve CameraUpdateFactory.zoomBy(float, Point) size artış (veya azalma) durumunda bir CameraUpdate negatif), yakınlaştırma düzeyini ise verilen değere göre ayarlayın. İkincisi, ekrandaki belirli bir noktayı aynı konumda (enlem/boylam) sabitler ve bunu yapmak için kameranın konumunu değiştirebilir.

Tercih ettiğiniz minimum ve/veya maksimum yakınlaştırma düzeyini ayarlamak yararlı olabilir. Örneğin, uygulamanız bir önemli yer etrafında tanımlanmış bir alan gösteriyorsa veya sınırlı sayıda yakınlaştırma düzeyi içeren özel bir karo yer paylaşımı kullanıyorsanız bu, kullanıcının deneyimini kontrol etmek için yararlıdır.

Kotlin



private lateinit var map: GoogleMap

    map.setMinZoomPreference(6.0f)
    map.setMaxZoomPreference(14.0f)

      

Java


private GoogleMap map;
    map.setMinZoomPreference(6.0f);
    map.setMaxZoomPreference(14.0f);

      

API'nin Böylece kullanıcılar çok düşük veya çok yükseğe yakınlaştırma yapabilir. Örneğin, uydu veya arazi temel harita desenlerinden daha düşük maksimum yakınlaştırma değerine sahip olabilir.

Kamera konumu değiştiriliyor

Sık karşılaşılan konum değişiklikleri için iki kolaylık yöntemi vardır. CameraUpdateFactory.newLatLng(LatLng), diğer tüm özellikleri koruyarak kameranın enlem ve boylamını değiştiren bir CameraUpdate döndürür. CameraUpdateFactory.newLatLngZoom(LatLng, float), diğer tüm özellikleri koruyarak kameranın enlem, boylam ve yakınlaştırma ayarlarını değiştiren bir CameraUpdate döndürür.

Kamera konumunu değiştirirken tam esneklik için CameraUpdateFactory.newCameraPosition(CameraPosition) Bu da kamerayı hareket ettiren bir CameraUpdate değer. CameraPosition, doğrudan new CameraPosition() kullanılarak veya new CameraPosition.Builder() kullanılarak CameraPosition.Builder ile elde edilebilir.

Kaydırma

CameraUpdateFactory.scrollBy(float, float), kameranın enlem ve boylamını değiştirerek haritanın belirtilen piksel sayısı kadar hareket etmesini sağlayan bir CameraUpdate döndürür. Pozitif x değeri, kameranın sağa doğru hareket etmesine neden olur. Böylece harita sola doğru hareket etmiş gibi görünür. Pozitif y değeri kameranın aşağı doğru ilerlemesine ve dolayısıyla haritanın hareket etmesine neden olur yukarıya doğru. Tersine, negatif x değerleri kameranın sola doğru hareket etmesine neden olur. görünümün sağa doğru hareket ettiğini, negatif y değerleri ise yukarı hareket etmek için kamerayı kullanın. Kaydırma, kameranın mevcut yönüne göre yapılır. Örneğin, kameranın yönü 90 dereceyse doğu yönü "yukarıda" olması gerekir.

Sınır belirleme

Haritanın sınırlarını ayarlama

Bazen bir dosyayı tüm ilgi alanı mümkün olan en fazla görünür olacak şekilde bir kamera yakınlaştırma düzeyi. Örneğin, şehirdeki tüm benzin istasyonlarını konumu uzaklaştırarak, kamerayı bu şekilde hareket ettirerek ekranda görünmesi gerekir. Bunu yapmak için öncelikle ekranda görünmesini istediğiniz LatLngBounds değerini hesaplayın. Siz daha sonra kamerayı değiştiren bir CameraUpdate almak için CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding) komutunu kullanabilir belirtilen LatLngBounds haritaya tamamen uyacağından, belirtilen dolgu (piksel cinsinden) hesaba katılır. Döndürülen CameraUpdate, belirtilen sınırlar ile haritanın kenarı arasındaki boşluğun (piksel cinsinden) en az belirtilen dolgu kadar olmasını sağlar. Haritanın eğiminin ve yönünün 0 olacağını unutmayın.

Kotlin



val australiaBounds = LatLngBounds(
    LatLng((-44.0), 113.0),  // SW bounds
    LatLng((-10.0), 154.0) // NE bounds
)
map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0))

      

Java


LatLngBounds australiaBounds = new LatLngBounds(
    new LatLng(-44, 113), // SW bounds
    new LatLng(-10, 154)  // NE bounds
);
map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0));

      

Haritayı bir alan içinde ortalama

Bazı durumlarda, kameranızı aşırı kenarlıkları dahil etmek yerine bir sınır içinde merkezlemek isteyebilirsiniz. Örneğin, sabit bir yakınlaştırmayla kamerayı bir ülkeye odaklamak için. Bu durumda, benzer bir yöntem kullanabilirsiniz. bir LatLngBounds oluşturup CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom) LatLngBounds.getCenter() yöntemini kullanın. getCenter() yöntemi şunu döndürür: LatLngBounds coğrafi merkezi.

Kotlin



val australiaBounds = LatLngBounds(
    LatLng((-44.0), 113.0),  // SW bounds
    LatLng((-10.0), 154.0) // NE bounds
)
map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.center, 10f))

      

Java


LatLngBounds australiaBounds = new LatLngBounds(
    new LatLng(-44, 113), // SW bounds
    new LatLng(-10, 154)  // NE bounds
);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.getCenter(), 10));

      

Yöntemin aşırı yüklenmesi, newLatLngBounds(boundary, width, height, padding) sayfa için piksel cinsinden genişliği ve yüksekliği belirtmenize Böylece, bunların her bir reklam biriminin boyutlarına haritası. Dikdörtgen, merkezi haritanın görünümüyle aynı olacak şekilde yerleştirilir (böylece belirtilen boyutlar haritanın görünümüyle aynıysa dikdörtgen haritanın görünümüyle çakışır). Döndürülen CameraUpdate, kamerayı, belirtilen LatLngBounds'un gerekli dolgu dikkate alınarak mümkün olan en yüksek yakınlaştırma düzeyinde, belirtilen dikdörtgen içinde ekranda ortalanacağı şekilde hareket ettirir.

Not: CameraUpdate oluşturmak için yalnızca daha basit newLatLngBounds(boundary, padding) yolunu kullanın. Bu yöntem, harita düzene girdikten sonra kamerayı hareket ettirmek için kullanılacaksa tercih edilmelidir. API, düzen sırasında sınırlayıcı kutuyu doğru şekilde yansıtmak için gereken haritanın görüntüleme sınırlarını hesaplar. Buna karşılık, CameraUpdate daha karmaşık yöntem tarafından döndürüldü newLatLngBounds(boundary, width, height, padding) bunu değiştirmeyebilir, çünkü Google Haritalar'daki API aldığınız bağımsız değişkenlerden görüntüleme sınırlarını hesaplar.

Kullanıcının kaydırma özelliğini belirli bir alanla kısıtlama

Yukarıdaki senaryolarda, haritanın sınırlarını siz belirlersiniz ancak kullanıcı kaydırma veya kaydırma yapabilirsiniz. Bunun yerine haritanın odak noktasının (kamera hedefi) etkinleştirin. Böylece, kullanıcılar yalnızca bu sınırlar içinde kaydırma yapabilir. Örneğin, bir alışveriş merkezi veya havaalanı için perakende uygulaması, haritayı belirli sınırlarla kısıtlamak isteyebilir. Bu durumda kullanıcılar, bu sınırlar içinde kaydırma ve yakınlaştırma yapabilir.

Kotlin



// Create a LatLngBounds that includes the city of Adelaide in Australia.
val adelaideBounds = LatLngBounds(
    LatLng(-35.0, 138.58),  // SW bounds
    LatLng(-34.9, 138.61) // NE bounds
)

// Constrain the camera target to the Adelaide bounds.
map.setLatLngBoundsForCameraTarget(adelaideBounds)

      

Java


// Create a LatLngBounds that includes the city of Adelaide in Australia.
LatLngBounds adelaideBounds = new LatLngBounds(
    new LatLng(-35.0, 138.58), // SW bounds
    new LatLng(-34.9, 138.61)  // NE bounds
);

// Constrain the camera target to the Adelaide bounds.
map.setLatLngBoundsForCameraTarget(adelaideBounds);

      

Aşağıdaki şemada, kamera hedefinin görüntü alanından biraz daha büyük bir alana kısıtlandığı bir senaryo gösterilmektedir. Kullanıcı kamera hedefinin sınırlı alan içinde kalması koşuluyla kaydırma ve kaydırma hareketlerini kullanabilirsiniz. Haç, kamera hedefini gösterir:


      görünüm.

Harita, görüntü alanının tanımlanan sınırların dışındaki alanları göstermesine neden olsa bile her zaman görüntü alanını doldurur. Örneğin, sınırın bir köşesinde kamera hedefi görürseniz köşenin dışındaki alan görüntü alanında görünür ancak kullanıcılar bu alana daha fazla kaydıramaz. İlgili içeriği oluşturmak için kullanılan aşağıdaki şema bu senaryoyu göstermektedir. Haç, kamera hedefini gösterir:

Kamera hedefini ekranın sağ alt köşesinde gösteren şema
      LatLngBounds'u seçiyoruz.

Aşağıdaki şemada kamera hedefinin sınırları çok kısıtlıdır. Bu nedenle kullanıcıya haritayı kaydırma veya kaydırma yapma fırsatı çok azdır. Çarpı kamera hedefini temsil eder:

Görüntü alanından daha küçük bir kamera LatLngBounds'ını gösteren diyagram.

Kamera görüntüsünü güncelleme

Haritaya bir CameraUpdate uygulamak için kameraya anında geçiş yapabilir veya kameraya yumuşak bir animasyon uygulayabilirsiniz. Kamerayı CameraUpdate ile anında hareket ettirmek için GoogleMap.moveCamera(CameraUpdate)'ü çağırabilirsiniz.

Değişikliği animasyonlu hale getirerek, özellikle kısa hareketler için kullanıcı deneyimini daha keyifli hale getirebilirsiniz. Telefonla aramak yerine bunu yapmak için GoogleMap.moveCamera telefon etmek GoogleMap.animateCamera. Harita, yeni özelliklere sorunsuz geçiş yapacaktır. Bu yöntemin en ayrıntılı biçimi olan GoogleMap.animateCamera(cameraUpdate, duration, callback), üç bağımsız değişken sunar:

cameraUpdate
Kameranın nereye taşınacağını açıklayan CameraUpdate
callback
GoogleMap.CancellableCallback sınıfını uygulayan bir nesne. Görevleri işlemek için kullanılan bu genelleştirilmiş arayüzde iki yöntem tanımlanır: "onCancel" ve "onFinished". Animasyon için yöntemler aşağıdaki durumlarda çağrılır:
onFinish()
Animasyon kesintisiz olarak sonuna kadar giderse çağrılır.
onCancel()

Animasyon, çağrıyla kesilirse çağrılır stopAnimation() veya yeni bir kamera hareketi başlatma.

Alternatif olarak, GoogleMap.stopAnimation() numaralı telefonu aradığınızda da bu durumla karşılaşabilirsiniz.

duration
Animasyonun istenilen süresi (int olarak milisaniye cinsinden).

Aşağıdaki kod snippet'leri, bulun.

Kotlin



val sydney = LatLng(-33.88, 151.21)
val mountainView = LatLng(37.4, -122.1)

// Move the camera instantly to Sydney with a zoom of 15.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15f))

// Zoom in, animating the camera.
map.animateCamera(CameraUpdateFactory.zoomIn())

// Zoom out to zoom level 10, animating with a duration of 2 seconds.
map.animateCamera(CameraUpdateFactory.zoomTo(10f), 2000, null)

// Construct a CameraPosition focusing on Mountain View and animate the camera to that position.
val cameraPosition = CameraPosition.Builder()
    .target(mountainView) // Sets the center of the map to Mountain View
    .zoom(17f)            // Sets the zoom
    .bearing(90f)         // Sets the orientation of the camera to east
    .tilt(30f)            // Sets the tilt of the camera to 30 degrees
    .build()              // Creates a CameraPosition from the builder
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))

      

Java


LatLng sydney = new LatLng(-33.88,151.21);
LatLng mountainView = new LatLng(37.4, -122.1);

// Move the camera instantly to Sydney with a zoom of 15.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15));

// Zoom in, animating the camera.
map.animateCamera(CameraUpdateFactory.zoomIn());

// Zoom out to zoom level 10, animating with a duration of 2 seconds.
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

// Construct a CameraPosition focusing on Mountain View and animate the camera to that position.
CameraPosition cameraPosition = new CameraPosition.Builder()
    .target(mountainView )      // Sets the center of the map to Mountain View
    .zoom(17)                   // Sets the zoom
    .bearing(90)                // Sets the orientation of the camera to east
    .tilt(30)                   // Sets the tilt of the camera to 30 degrees
    .build();                   // Creates a CameraPosition from the builder
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));