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. Herhangi bir yakınlaştırma düzeyinde, haritayı kaydırabilir veya ve reklam öğelerinin daha küçük ayak izi sayesinde, daha az gecikme vektör tabanlı harita desenleridir.

Kod örnekleri

GitHub'daki ApiDemos deposu, kamera özelliklerini gösteriyor:

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. Doğu ve batı yönünde harita dünya kesintisiz bir şekilde kendi etrafında dönerken sonsuza kadar tekrarlanır. kuzey ve güney yönünde harita yaklaşık 85 derece kuzeyle sınırlıdır ve güneyde 85 derece.

Not: Merkatör projeksiyonunun sonlu bir genişliği vardır uzunlukla, yatay olarak sonsuz yüksekliktedir. “İşimizi bitirdik.” temel harita Merkatör projeksiyonunu kullanan görüntüler için yaklaşık +/- 85 derece sonuç olarak 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ı, kullanıcının belirli bir konuma ilişkin bakış açısını Haritanın kamerasını değiştirerek haritayı açın.

Kamerada yapacağınız değişikliklerde, işaretçilerde, katmanlarda veya ancak eklediğiniz öğeleri sığacak şekilde değiştirebilirsiniz daha iyi hale getirebilirsiniz.

Harita üzerinde kullanıcı hareketlerini dinleyebildiğinizden, haritayı yanıt verebilme seçeneği eklendi. Örneğin, OnMapClickListener.onMapClick() şuna yanıt verir: haritaya bir kez dokunun. Yöntem, enlem ve boylam değerlerini aldığı için o noktaya kadar kaydırarak veya yakınlaştırarak yanıt verebilirsiniz. Bir işaretçinin balonuna yapılan dokunmalara yanıt vermek için de benzer yöntemler kullanılabilir. için yanıt verebilirsiniz.

Ayrıca kamera hareketlerini de dinleyebilirsiniz. Böylece, uygulamanız Kamera hareket etmeye başladığında, şu anda hareket ederken veya durduğunda bildirim yer 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 (her ikisi de dahil) arasında olabilir. Yukarıdaki değerler veya bu aralığın altındaki değerler, bu aralıktaki en yakın değere sabitlenir. Örneğin, enlem 100 olarak belirtildiğinde değer 85 olarak ayarlanır. Boylam -180 ile 180 derece arasında değişir. Bunun üstündeki veya altındaki değerler aralığı, (-180, 180) aralığında olacak şekilde sarmalanır. Örneğin, 480, 840 ve 1200 değerlerinin tamamı 120 dereceye kadar sarmalanır.

Rulman (yön)

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 merkezinden üst kenara dikey bir çizgi çizerseniz haritasında, yön, kameranın yönüne (derece cinsinden ölçülür) karşılık gelir gerçeğe dönüşüyor.

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). Değer 180, güneye doğru yapılması gereken harita noktalarının üst kısmı 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.

Yatır (görüntüleme açısı)

Eğme, kameranın konumunu doğrudan harita üzerinde bir yay üzerinde tanımlar merkez konum, uzaklık derecesi cinsinden ölçülür nadir (doğrudan kameranın altını gösteren yön). 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 bir bir şemadır. konum 1 kamera konumu, 2. konum ise geçerli harita konumudur. Ortaya çıkan harita onun altında gösterilir.

Kamerası 0 görüntüleme açısında, 18 yakınlaştırma düzeyinde yerleştirilmiş 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 yukarıdan düz (0 derece) ve zemin (90 derece) arasında bir yay boyunca yarım yönde hareket eder, 3. konuma getirin. Kamera hâlâ haritanın merkez noktasını doğruluyor, ancak alan artık 4 konumundaki satırla temsil edilen görünür hale gelir.

Kameranın 45 derece görüntüleme açısında, 18 yakınlaştırma düzeyinde yerleştirildiği haritanın ekran görüntüsü.
45 derecelik görüş açısıyla görüntülenen harita.
Kameranın görüş açısının 45 dereceye ayarlandığını, yakınlaştırma seviyesinin ise hâlâ 18'e ayarlandığını gösteren şema.
45 derecelik kamera görüş açısı.

Bu ekran görüntüsündeki harita, ancak haritanın üst kısmında daha fazla özellik göründü. 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 geniş yakınlaştırma ekranda daha fazla ayrıntı görülebilirken, düşük zum düzeylerinde ekranda daha fazla yer görülebilir. Yakınlaştırma seviyesi 0'da, tüm dünyanın genişliği yaklaşık 256 dp'dir. (yoğunluktan bağımsız pikseller).

Yakınlaştırma düzeyini 1 artırdığınızda, ekrandaki yerküre 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 düzeyinde, tüm dünya yaklaşık olarak 1024 dp genişlik.

Yakınlaştırma düzeyinin tam sayı olması gerekmez. 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 yaklaşık ayrıntı düzeyi gösterilmektedir görebilirsiniz:

  • 1: Dünya
  • 5: Karalar/kıta
  • 10: Şehir
  • 15: Sokaklar
  • 20: Binalar
ziyaret edin. ziyaret edin. Aşağıdaki resimlerde, farklı yakınlaştırma seviyelerinin görsel görünümü gösterilmektedir:
5 yakınlaştırma düzeyindeki bir haritanın ekran görüntüsü
Yakınlaştırma seviyesi 5 olan bir harita.
15 yakınlaştırma düzeyindeki bir haritanın ekran görüntüsü
Yakınlaştırma seviyesinde 15 olan bir harita.
20 yakınlaştırma düzeyinde bir haritanın ekran görüntüsü
Yakınlaştırma düzeyinde bir harita.

Kamerayı hareket ettirme

Google Maps API, dünyanın hangi bölgesinin haritada görünür olduğunu değiştirmenizi haritası. Bu, kameranın konumu değiştirilerek gerçekleştirilir ( haritayı hareket ettirerek).

Kamerayı değiştirdiğinizde, oluşturulan kamerada görünen animasyon 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) yakınlaştırma seviyesini verilen değere değiştiren bir CameraUpdate sağlar, ancak diğer tüm özellikleri aynı tutarak.

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, verilen noktayı sabitler ekranda aynı konumda (enlem/boylam) kalacak şekilde Kameranın konumunu da değiştirebilir.

Tercih ettiğiniz minimum ve/veya maksimum yakınlaştırma düzeyini ayarlamak yararlı olabilir. Örneğin, uygulamanızda bir veya özel bir blok kullanıyorsanız sınırlı bir yakınlaştırma düzeyiyle görüntülenebilir.

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) kameranın enlem ve boylamını değiştiren bir CameraUpdate değeri verir, korurken diğer özellikleri de korur. CameraUpdateFactory.newLatLngZoom(LatLng, float) kameranın yönünü değiştiren bir CameraUpdate verir enlem, boylam ve yakınlaştırma gibi özellikler içerir.

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

Kaydırma (kaydırma)

CameraUpdateFactory.scrollBy(float, float) size şunları sağlayan bir CameraUpdate verir: kameranın enlem ve boylamını harita belirtilen sayıda piksel. Pozitif x değeri kameranın 'i tıklayın. Böylece harita sola taşınmış 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 durumuna bağlıdır Yön. Ö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ı belirleme

Bazen bir dosyayı bir kameranın, ilgilenilen alanın tamamının mümkün olan en fazla görünür olacağı şekilde 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. Bunun için önce Ekranda görünmesini istediğiniz LatLngBounds. 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 belirli değerler ile çerçevenin kenarı arasındaki boşluğun (piksel cinsinden) eşleme en az belirtilen dolgu kadar olacaktır. Yatırma ve düzeltmenin her ikisinin de noktası 0 olacaktır.

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ı bir çerçeveye yerleştirmek yerine bir sınırları da dahil ediyor. Örneğin, kamerayı bir ülkenin ortalamasına elde edebiliyorlar. Bu durumda, benzer bir yöntem kullanabilirsiniz. bir LatLngBounds oluşturup CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom) LatLngBounds.getCenter() yöntemini çağırı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 kenarınınkiyle aynı olacak şekilde konumlandırılır haritanın görünümünü (böylece, belirtilen boyutlar harita görünümüne denk gelen bir konuma gelecektir). İlgili içeriği oluşturmak için kullanılan CameraUpdate değeri, kamerayı belirtilen LatLngBounds, ekranda belirtilen dikdörtgenin içinde ortalanır mümkün olan en yüksek yakınlaştırma düzeyine sahip olmanız gerekir.

Not: Yalnızca daha basit olan yöntemi kullanın newLatLngBounds(boundary, padding) taşımak için kullanılacaksa bir CameraUpdate oluşturmak üzere kameraya takılmayın. Düzen sırasında API, Haritanın, doğru şekilde oluşturulması için gereken görüntüleme sınırlarını hesaplar sınırlayıcı kutucuğu yansıtın. 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ına yönelik bir perakende uygulamasının haritasını, kullanıcıların bu sınırlar içinde kaydırma ve kaydırma yapmasına olanak tanır.

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 diyagramda, kamera hedefinin görüntü alanından biraz daha geniş bir alanla sınırlandırılır. Kullanıcı kamera hedefinin sınırlı alan içinde kalması koşuluyla kaydırma ve kaydırma hareketlerini kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan çarpı, kamera hedefini temsil eder:


      görünüm.

Harita, görüntü alanının gösterilmesine neden olsa bile, her zaman görüntü alanını doldurur. belirlenen sınırların dışında kalan alanları ifade eder. Ö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ç, kamerayı temsil eder hedef:

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

Aşağıdaki şemada, kamera hedefinin çok kısıtlı sınırları var. kullanıcıya haritayı kaydırması için çok az bir fırsat sunar. Çarpı kamera hedefini temsil eder:


      görünüm.

Kamera görünümü güncelleniyor

Haritaya bir CameraUpdate uygulamak için kameraya anında geçiş yapabilir veya kameraya yumuşak bir animasyon uygulayabilirsiniz. Kamerayı hareket ettirmek için verilen CameraUpdate ile anında telefon edebilirsiniz GoogleMap.moveCamera(CameraUpdate).

Özellikle kısa hamleler ve özellikle de uzun hamleler için animasyon oluşturarak yapabilirsiniz. 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, GoogleMap.animateCamera(cameraUpdate, duration, callback), üç bağımsız değişken sunar:

cameraUpdate
CameraUpdate kameranın nereye taşınacağını açıklıyor.
callback
GoogleMap.CancellableCallback. Görevleri yapmaya yönelik bu genelleştirilmiş arayüzde iki yöntem açıklanmaktadır "onCancel()" ve "onFinished()". Animasyonda, yöntemler şu durumlarda:
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 bu, GoogleMap.stopAnimation().

duration
Animasyonların istenen süresi (milisaniye cinsinden) int olarak.

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));