Kamera i widok

Wybierz platformę: Android iOS JavaScript

Mapy w pakiecie Maps SDK na Androida można łatwo przechylać i obracać. za pomocą gestów, co daje użytkownikom możliwość dostosowania mapy do orientacji, co ma dla nich sens. Przy każdym powiększeniu możesz przesuwać mapę z niewielkim opóźnieniem wynikającym z niewielkich rozmiarów wektorowych fragmentów mapy.

Przykładowe fragmenty kodu

Repozytorium API Apigee na GitHubie zawiera przykład, przedstawia funkcje aparatu:

Wprowadzenie

Podobnie jak Mapy Google w internecie, pakiet Maps SDK na Androida reprezentuje powierzchnię świata (sferę) na ekranie urządzenia (płaską płaszczyznę) za pomocą Odwzorowanie metryczne. We wschodniej i zachodniej części mapy w nieskończoność, tak jak świat płynnie się wokół siebie. W kierunek północny i południowy jest ograniczony do około 85 stopni na północ i 85 stopni na południe.

Uwaga: odwzorowanie Merkatora ma skończoną szerokość. na długość, ale na nieskończoną wysokość. „Zakończyliśmy” mapa podstawowa z użyciem odwzorowania Merkatora pod kątem około +/-85 stopni do zmieni kształt mapy na kwadrat, co ułatwi logikę wyboru.

Maps SDK na Androida pozwala zmienić punkt widzenia użytkownika mapy, modyfikując jej aparat.

Zmiany w aparacie nie spowodują żadnych zmian w znacznikach, nakładkach ani innych dodanych grafik, ale możesz też zmienić je, z nowym widokiem.

Możesz nasłuchiwać gestów użytkowników na mapie, więc możesz zmienić mapę w odpowiadania na prośby użytkowników. Na przykład metoda wywołania zwrotnego OnMapClickListener.onMapClick() odpowiada na jedno kliknięcie na mapie. Ponieważ metoda otrzymuje szerokość i długość geograficzną miejsca kliknięcia, możesz zareagować, przesuwając lub powiększając widok do tego punktu. Podobne metody są dostępne w przypadku kliknięć w dymku znacznika lub za reagowanie na gest przeciągania na znaczniku.

Możesz też nasłuchiwać ruchów kamery, aby aplikacja odbierała powiadomienie, gdy kamera zacznie się poruszać, w danym momencie porusza się lub się zatrzyma ruchu. Szczegółowe informacje znajdziesz w przewodniku po zdarzeniach zmiany kamery.

Położenie kamery

Widok mapy jest modelowany jako kamera patrząca w dół na płaskiej płaszczyźnie. Pozycja kamery (a tym samym renderowanie mapy) są określane przez te właściwości: target (szerokość/długość geograficzna), bearing, przechyla, oraz powiększenie.

Schemat właściwości kamery

Cel (lokalizacja)

Cel kamery to lokalizacja środka mapy, określona jako szerokości i długości geograficznej.

Szerokość geograficzna może wynosić od -85 do 85 stopni włącznie. Wartości powyżej lub poniżej tego zakresu zostanie ograniczona do najbliższej wartości z tego zakresu. Na przykład szerokość geograficzna równa 100 powoduje ustawienie wartości 85. Długość geograficzna mieści się w zakresie od -180 do 180 stopni włącznie. Wartości powyżej lub poniżej tej wartości zakres zostanie zawijany w taki sposób, aby mieścił się w zakresie (-180, 180). Dla: Na przykład 480, 840 i 1200 zostaną zapakowane w zakresie 120 stopni.

Orientacja

Orientacja kamery określa kierunek kompasu, mierzony w stopniach od rzeczywistej północy, odpowiadając do górnej krawędzi mapy. Jeśli narysujesz pionową linię od środka mapy do górnej krawędzi położenie na mapie, położenie odpowiada kierunkowi kamery (mierzonemu w stopniach) do północy geograficznej.

Orientacja 0 oznacza, że góra mapy wskazuje rzeczywistą północ. Wartość kierunku 90 oznacza, że góra mapy jest skierowana we wschód (90 stopni na kompasie). Wartość A 180 oznacza górną część mapy wskazujący kierunek południowy.

Interfejs API Map Google umożliwia zmianę kierunku mapy. Na przykład gdy ktoś jedzie samochodem często zmienia mapę, wyrównując ją z kierunkiem podróży, a turyści korzystają z mapy, kompas zazwyczaj ustala mapę tak, aby pionowa linia wskazywała północ.

Pochylenie (kąt patrzenia)

Pochylenie określa położenie kamery na łuku bezpośrednio nad mapą położenie środkowe, mierzone w stopniach od Nadir (kierunek skierowany bezpośrednio pod aparatem). Wartość 0 oznacza, że aparat jest skierowany. prosto w dół. Wartości większe niż 0 odpowiadają kamerze, która jest nachylona w kierunku horyzontu o określoną liczbę stopni. Po zmianie kąta patrzenia mapa jest wyświetlana w perspektywie z odległymi obiektami mniejsze, a pobliskie obiekty wydają się większe. Poniżej ilustracje.

Na poniższych obrazach kąt patrzenia wynosi 0 stopni. Pierwszy obraz przedstawia to schematy, pozycja 1 to pozycja kamery, a pozycja 2 to bieżąca pozycja na mapie. Powstała mapa jest widoczna pod nią.

Zrzut ekranu mapy z kamerą ustawioną pod kątem 0 stopni przy powiększeniu 18.
Mapa wyświetlana z domyślnym kątem patrzenia kamery.
Diagram pokazujący domyślne położenie kamery bezpośrednio nad pozycją na mapie pod kątem 0 stopni.
Domyślny kąt patrzenia kamery.

Na poniższych obrazach kąt patrzenia wynosi 45 stopni. Zwróć uwagę, że kamera porusza się w połowie łuku między głowem prostym (0 stopni) a podłożem (90 stopni), w pozycji 3. Aparat nadal wskazuje środek mapy, ale obszar reprezentowana przez linię w pozycji 4 jest teraz widoczna.

Zrzut ekranu mapy z kamerą pod kątem 45 stopni przy powiększeniu 18.
Mapa wyświetlana pod kątem 45 stopni.
Diagram przedstawiający kąt patrzenia kamery ustawiony na 45 stopni z poziomem powiększenia nadal ustawionym na 18.
Kąt patrzenia kamery pod kątem 45 stopni.

Mapa na tym zrzucie ekranu jest wciąż wyśrodkowana w tym samym punkcie, co w oryginalnej mapy, ale na jej górze pojawiło się więcej obiektów. Gdy zwiększ kąt powyżej 45 stopni, elementy między aparatem a mapą położenie jest proporcjonalnie większe, a obiekty poza położeniem na mapie wydawać się proporcjonalnie mniejsze, co daje efekt trójwymiarowy.

Zoom

Poziom powiększenia kamery określa skalę mapy. Przy większym powiększeniu bardziej szczegółowa jest widoczność na ekranie przy mniejszym powiększeniu. więcej informacji ze świata jest widoczne na ekranie. Przy poziomie powiększenia 0 skala Mapa jest taka, że cały świat ma szerokość około 256 dp. (piksele niezależne od gęstości).

Zwiększenie poziomu powiększenia o 1 powoduje podwojenie szerokości ekranu. Dlatego przy powiększeniu N szerokość świata wynosi około 256 * 2N dp. Na przykład przy powiększeniu 2 cały świat jest ustawiony na około Szerokość 1024 dp.

Poziom powiększenia nie musi być liczbą całkowitą. Zakres powiększenia poziomy dozwolone przez mapę zależą od wielu czynników, w tym od wartości docelowej, typu mapy i rozmiaru ekranu. Każda liczba spoza zakresu zostanie przekonwertowana na następną najbliższą prawidłową wartością, którą może być minimalny poziom powiększenia maksymalny poziom powiększenia. Poniższa lista pokazuje przybliżony poziom szczegółowości które możesz zobaczyć przy każdym powiększeniu:

  • 1: Świat
  • 5: Ląd/kontynent
  • 10: Miasto
  • 15: Ulice
  • 20. Budynki
. . Te obrazy pokazują wygląd różnych poziomów powiększenia:
Zrzut ekranu mapy w powiększeniu 5
Mapa w powiększeniu 5.
Zrzut ekranu mapy w powiększeniu 15
Mapa w powiększeniu 15.
Zrzut ekranu mapy przy powiększeniu 20
Mapa w powiększeniu 20.

Poruszanie aparatem

W interfejsie API Map Google możesz wybrać, która część świata jest widoczna na mapy. Służy do tego zmiana położenia kamery (w przeciwieństwie do przesunięcie mapy).

Po zmianie aparatu możesz animować wynikowy obraz ruch kamery. Animacja interpoluje się między bieżącym aparatem i nowych atrybutach aparatu. Możesz też określić czas trwania animacji.

Aby zmienić pozycję kamery, musisz określić, gdzie ma się ona znajdować przesuń kamerę za pomocą CameraUpdate. Interfejs API Map Google pozwala na tworzenie wielu różnych typów CameraUpdate za pomocą CameraUpdateFactory Dostępne są te ustawienia:

Zmiana poziomu powiększenia oraz ustawienie minimalnego/maksymalnego powiększenia

CameraUpdateFactory.zoomIn() i CameraUpdateFactory.zoomOut() uzyskasz CameraUpdate, który zmienia poziom powiększenia o 1,0, przy zachowaniu z pozostałymi właściwościami.

CameraUpdateFactory.zoomTo(float) daje wartość CameraUpdate, która zmienia poziom powiększenia na podaną wartość, bez zmian we wszystkich pozostałych właściwościach.

CameraUpdateFactory.zoomBy(float) oraz CameraUpdateFactory.zoomBy(float, Point) otrzymasz CameraUpdate, który rośnie (lub maleje, jeśli wartość jest ujemnego poziomu powiększenia o podaną wartość. To ostatnie określa dany punkt na ekranie, tak aby pozostało w tej samej lokalizacji (szerokość/długość geograficzna). i może zmienić jego położenie.

Warto ustawić preferowany minimalny lub maksymalny poziom powiększenia. Jest to przydatne na przykład wtedy, gdy chcesz kontrolować sposób, w jaki użytkownik korzysta z aplikacji, gdy wyświetla się w określonym obszarze wokół ciekawego miejsca, a jeśli korzystasz z niestandardowego kafelka z nakładką z ograniczonym zestawem poziomów powiększenia.

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

      

Pamiętaj, że ze względów technicznych mogą one uniemożliwiać które umożliwiają użytkownikom zbyt małe lub zbyt duże powiększenie. Na przykład Satelita lub ukształtowanie terenu może mieć niższe maksymalne powiększenie niż podstawowe kafelki mapy.

Zmiana pozycji kamery

Są 2 wygodne metody wprowadzania typowych zmian pozycji. CameraUpdateFactory.newLatLng(LatLng) daje CameraUpdate, który zmienia szerokość i długość geograficzną kamery, przy zachowaniu pozostałych właściwości. CameraUpdateFactory.newLatLngZoom(LatLng, float) daje CameraUpdate, który zmienia szerokości i długości geograficznej oraz powiększenia przy zachowaniu wszystkich pozostałych właściwości.

Aby mieć pełną swobodę zmiany pozycji kamery, użyj CameraUpdateFactory.newCameraPosition(CameraPosition) Dzięki temu masz CameraUpdate, który przenosi kamerę w daną pozycję. CameraPosition można uzyskać bezpośrednio przy użyciu new CameraPosition() lub w połączeniu z usługą CameraPosition.Builder w przypadku: new CameraPosition.Builder()

Przesuwanie (przewijanie)

CameraUpdateFactory.scrollBy(float, float) daje Ci CameraUpdate, który zmienia szerokość i długość geograficzną kamery w taki sposób, że mapa jest przesuwana określoną liczbę pikseli. Dodatnia wartość x powoduje przesunięcie kamery w prawo, aby mapa przesunęła się w lewo. A dodatnie y powoduje przesuwanie kamery w dół, sprawiając, że mapa się przesunęła w górę. I na odwrót, wartości ujemne powodują przesuwanie kamery w lewo, że mapa przesunęła się w prawo, a ujemne wartości y powodują aby przesunąć kamerę w górę. Przewijanie zależy od bieżącego ustawienia kamery orientacji ekranu. Jeśli na przykład kamera jest ustawiona na 90 stopni, kierunek wschód jest „w górę”.

Wyznaczanie granic

Wyznaczanie granic mapy

Czasami warto przenieść dzięki czemu cały interesujący Cię obszar jest widoczny poziom powiększenia. Jeśli na przykład wyświetlasz wszystkie stacje benzynowe w okolicy: na odległość 8 km od bieżącej pozycji użytkownika, możesz przesunąć kamerę tak, aby były widoczne na ekranie. Aby to zrobić, najpierw oblicz LatLngBounds, które mają być widoczne na ekranie. Ty może następnie użyć CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding), aby uzyskać CameraUpdate do zmiany aparatu położenie w taki sposób, aby dane LatLngBounds pasowały w całości do mapy, co biorąc pod uwagę określone dopełnienie (w pikselach). Zwrócona wartość CameraUpdate zapewnia przerwę (w pikselach) między podanymi granicami a krawędzią mapa będzie równa co najmniej określonemu dopełnieniu. Pamiętaj, że funkcja przechylenia przesunięcie mapy będzie wynosić 0.

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

      

Wyśrodkowanie mapy na obszarze

W niektórych przypadkach warto wyśrodkować kamerę w określonym obszarze, a nie łącznie z granicami skrajnymi. Aby na przykład wyśrodkować kamerę na kraju utrzymując stałe powiększenie. W takim przypadku możesz użyć podobnej metody, po utworzeniu LatLngBounds i przy użyciu funkcji CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom) z LatLngBoundsMetoda getCenter(). Metoda getCenter() zwraca centrum geograficznego LatLngBounds.

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

      

Przeciążenie metody, newLatLngBounds(boundary, width, height, padding) pozwala określić szerokość i wysokość w pikselach w taki sposób, aby odpowiadały one wymiarom mapy. Prostokąt jest tak umieszczony, że jego środek jest taki sam jak widoku mapy (jeśli określone wymiary są takie same jak widoku mapy, wtedy prostokąt zbiega się z widokiem mapy). zwrócona wartość CameraUpdate przesunie kamerę tak, że określony LatLngBounds są wyśrodkowane na ekranie wewnątrz danego prostokąta w największego możliwego poziomu powiększenia, biorąc pod uwagę wymagane dopełnienie.

Uwaga: używaj tylko prostszej metody newLatLngBounds(boundary, padding) aby wygenerować CameraUpdate, jeśli ma być używany do przenoszenia gdy już zmienisz układ mapy. Podczas tworzenia układu interfejs API oblicza granice wyświetlania mapy, które są niezbędne do poprawnego i wyświetlić ramkę ograniczającą. Dla porównania możesz użyć atrybutu Funkcja CameraUpdate zwrócona przez bardziej złożoną metodę newLatLngBounds(boundary, width, height, padding) w dowolnym momencie, jeszcze przed zmianą układu mapy, ponieważ interfejs API oblicza granice wyświetlania na podstawie przekazywanych argumentów.

Ograniczanie przesuwania w danym obszarze przez użytkownika

W powyższych scenariuszach ustalasz granice dla mapy, a użytkownik które można przewijać lub przesunąć poza te granice. Zamiast tego lepiej będzie: ograniczyć granicę środka szerokości i długości geograficznej punktu fokalnego mapy (kamera cel), dzięki czemu użytkownicy mogą tylko przewijać i przesuwać tylko w obrębie tych granic. Przykład: w przypadku aplikacji dla sklepów w centrum handlowym lub na lotnisku może być konieczne ograniczenie mapy określonych granic, co umożliwia użytkownikom przewijanie i przesuwanie w obrębie tych granic.

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

      

Poniższy diagram przedstawia scenariusz, w którym cel kamery to ograniczony do obszaru, który jest nieco większy niż widoczny obszar. Użytkownik może przewijanie i przesuwanie, pod warunkiem że cel kamery pozostaje w ograniczonym obszarze. krzyżyk oznacza cel kamery:

Diagram przedstawiający obwody szerokości geograficznej kamery, które są większe niż
      widoczny obszar.

Mapa zawsze wypełnia widoczny obszar, nawet jeśli spowoduje to obszary znajdujące się poza zdefiniowanymi granicami. Jeśli na przykład umieścisz parametr cel kamery w rogu ograniczonego obszaru, widoczne w widocznym obszarze, ale użytkownicy nie mogą przewinąć do tego obszaru. ilustruje ten scenariusz: Krzyż oznacza aparat cel:

Schemat przedstawiający cel kamery umieszczony w prawym dolnym rogu
      w przypadku położenia kamery.

Na poniższym schemacie cel kamery ma bardzo ograniczone granice. oferowanie użytkownikowi jak najmniejszej możliwości przewijania lub przesuwania mapy. Krzyż reprezentuje cel kamery:

Schemat przedstawiający obwody szerokości geograficznej kamery, które są mniejsze niż
      widoczny obszar.

Aktualizuję obraz z kamery

Aby zastosować na mapie element CameraUpdate, możesz przenieść lub płynnie ją animować. Aby przesunąć kamerę przy użyciu CameraUpdate, możesz zadzwonić GoogleMap.moveCamera(CameraUpdate)

Możesz sprawić, że wrażenia użytkowników będą bardziej przyjemne, zwłaszcza w przypadku krótkich ruchów, animując tę zmianę. Aby to zrobić, zamiast dzwonić GoogleMap.moveCamera zadzwoń GoogleMap.animateCamera. Nowe atrybuty mapy zostaną płynnie przeniesione. Najbardziej szczegółowa forma tej metody GoogleMap.animateCamera(cameraUpdate, duration, callback), Podaje 3 argumenty:

cameraUpdate
CameraUpdate który opisuje, gdzie przesunąć kamerę.
callback
Obiekt, który implementuje GoogleMap.CancellableCallback. Ten uogólniony interfejs obsługi zadań definiuje 2 metody „onCancel()” i „onFinished()”. W przypadku animacji metody są wywoływane w zachodzą te okoliczności:
onFinish()
Wywoływana, jeśli animacja zostanie odtworzona bez zakłóceń.
onCancel()

Wywoływana, jeśli animacja została przerwana przez wywołanie stopAnimation() lub rozpoczyna nowy ruch kamerą.

Może się to również zdarzyć, gdy zadzwonisz GoogleMap.stopAnimation().

duration
Oczekiwany czas trwania animacji w milisekundach w formie int.

Poniższe fragmenty kodu ilustrują niektóre typowe sposoby przenoszenia aparat fotograficzny.

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