Kamera i widok

Wybierz platformę: Android iOS JavaScript

Mapy w pakiecie Maps SDK na Androida można przechylać i obracać za pomocą prostych gestów, co umożliwia użytkownikom dostosowanie orientacji mapy do ich potrzeb. Na dowolnym poziomie powiększenia możesz przesunąć mapę lub zmienić jej poziom z niewielkimi opóźnieniami dzięki mniejszym wektorowych fragmentów mapy.

Przykładowe fragmenty kodu

Repozytorium ApiDemos na GitHubie zawiera przykład, który demonstruje 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. W kierunku wschodnim i zachodnim mapa jest powtarzana w nieskończoność, ponieważ świat płynnie łączy się z samym sobą. W kierunku północnym i południowym mapa jest ograniczona do około 85 stopni szerokości geograficznej północnej i 85 stopni szerokości geograficznej południowej.

Uwaga: w projekcji Mercatora szerokość jest ograniczona wzdłuż, ale wysokość jest nieskończona w szerz. „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() reaguje na pojedyncze 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 również nasłuchiwać ruchów kamery, aby aplikacja odbierała powiadomienie, gdy kamera zacznie się poruszać, w danej chwili będzie w ruchu lub się zatrzyma ruchu. Szczegółowe informacje znajdziesz w przewodniku dotyczącym zdarzeń zmiany kamery.

Pozycja kamery

Widok mapy jest modelowany jako kamera patrząca w dół na płaskiej płaszczyźnie. Pozycja kamery (a zatem renderowanie mapy) jest określana przez te właściwości: cel (szerokość/długość geograficzna), kierunek, pochyleniepowiększenie.

Schemat właściwości kamery

Docelowy (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). Na przykład wartości 480, 840 i 1200 zostaną zaokrąglone do 120 stopni.

Kierunek (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 linię pionową od środka mapy do jej górnej krawędzi, kierunek będzie odpowiadać kierunkowi kamery (mierzonemu w stopniach) względem geograficznej północy.

Kierunek 0 oznacza, że górna część mapy wskazuje prawdziwy kierunek północny. 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 Maps API 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 odpowiada kamerze skierowanej w dół. Wartości większe niż 0 odpowiadają kamerze, która jest nachylona w kierunku horyzontu o określoną liczbę stopni. Gdy zmienisz kąt widzenia, mapa będzie wyglądać w perspektywie, a elementy znajdujące się daleko będą wydawać się mniejsze, a te znajdujące się blisko – większe. Poniżej znajdziesz ilustracje obrazujące ten proces.

Na obrazach poniżej kąt widzenia wynosi 0 stopni. Pierwsze zdjęcie przedstawia schematyczną wersję tego procesu: 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 i poziomiem powiększenia 18.
Mapa wyświetlana z domyślnym kątem patrzenia kamery.
Diagram pokazujący domyślną pozycję kamery bezpośrednio nad pozycją na mapie pod kątem 0 stopni.
Domyślny kąt widzenia kamery.

Na obrazach poniżej kąt widzenia wynosi 45 stopni. Zwróć uwagę, że kamera porusza się po połowie łuku między pozycją na wprost nad głową (0 stopni) a poziomą (90 stopni) do pozycji 3. Aparat nadal wskazuje środek mapy, ale obszar reprezentowana przez linię w pozycji 4 jest teraz widoczna.

Zrzut ekranu mapy z kamerą ustawioną pod kątem 45° i poziomem powiększenia 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.

Na tym zrzucie ekranu mapa jest nadal wyśrodkowana w tym samym miejscu co na oryginalnej mapie, ale u góry pojawiło się więcej funkcji. 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 podwaja szerokość świata na ekranie. Dlatego przy poziomie powiększenia 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 poziomów powiększenia dozwolonych na mapie zależy od wielu czynników, w tym od celu, 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 na poszczególnych poziomach powiększenia:

  • 1: Świat
  • 5: Ląd/kontynent
  • 10: Miasto
  • 15: Ulice
  • 20: Budynki
Na poniższych obrazach widać, jak wyglądają różne poziomy powiększenia:
Zrzut ekranu mapy w powiększeniu 5
Mapa na poziomie powiększenia 5.
Zrzut ekranu mapy w powiększeniu 15
Mapa w powiększeniu 15.
Zrzut ekranu mapy przy powiększeniu 20
Mapa na poziomie powiększenia 20.

Przesuwanie kamery

W interfejsie API Map Google możesz wybrać, która część świata jest widoczna na mapy. Osiąga się to przez zmianę pozycji kamery (a nie przez przesuwanie mapy).

Gdy zmieniasz kamerę, możesz animować 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:

Zmienianie poziomu powiększenia i ustawianie minimalnego/maksymalnego powiększenia

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

CameraUpdateFactory.zoomTo(float) daje Ci CameraUpdate, który zmienia poziom powiększenia na podana wartość, pozostawiając wszystkie inne właściwości bez zmian.

CameraUpdateFactory.zoomBy(float) i CameraUpdateFactory.zoomBy(float, Point) dają CameraUpdate, który zwiększa (lub zmniejsza, jeśli wartość jest ujemna) poziom powiększenia o podawaną 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.

Możesz ustawić preferowany minimalny lub maksymalny poziom powiększenia. Może to być przydatne np. do kontrolowania wrażeń użytkownika, jeśli aplikacja wyświetla zdefiniowany obszar wokół punktu zainteresowania lub jeśli używasz niestandardowej nakładki 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

Dostępne są 2 wygodne metody zmiany 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) pozwala uzyskać CameraUpdate, który zmienia szerokość geograficzną, długość geograficzną i powiększenie kamery, zachowując przy tym wszystkie inne właściwości.

Aby mieć pełną swobodę zmiany pozycji kamery, użyj CameraUpdateFactory.newCameraPosition(CameraPosition), która umożliwia użycie CameraUpdate, aby przesunąć kamerę do danej pozycji. CameraPosition można uzyskać bezpośrednio za pomocą new CameraPosition() lub za pomocą CameraPosition.Builder za pomocą 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, przez co mapa wydaje się przesunięta w lewo. Dodatnia wartość y powoduje przesunięcie kamery w dół, przez co mapa wydaje się przesunięta w górę. Z kolei ujemne wartości x powodują przesunięcie kamery w lewo, co sprawia, że mapa wydaje się przesunięta w prawo, a ujemne wartości y powodują przesunięcie kamery w górę. Przewijanie jest względne do bieżącej orientacji kamery. Jeśli na przykład kamera ma kierunek 90 stopni, wschodnia strona świata jest „na górze”.

Wyznaczanie granic

Wyznaczanie granic mapy

Czasami warto przenieść dzięki czemu cały interesujący Cię obszar jest widoczny poziom powiększenia. Jeśli np. wyświetlasz wszystkie stacje benzynowe w odległości 8 km od bieżącej pozycji użytkownika, możesz przesunąć kamerę, aby wszystkie były widoczne na ekranie. Aby to zrobić, najpierw oblicz LatLngBounds, które mają być widoczne na ekranie. Następnie możesz użyć CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding), aby uzyskać CameraUpdate, który zmienia pozycję kamery tak, aby dany LatLngBounds mieścił się całkowicie na mapie, biorąc pod uwagę określony margines (w pikselach). Zwrócona wartość CameraUpdate zapewnia, że odstęp (w pikselach) między określonymi granicami a brzegiem mapy będzie co najmniej tak duży jak określony margines. 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środkowywanie mapy w obszarze

W niektórych przypadkach możesz chcieć wyśrodkować kamerę w ramach określonych granic, zamiast uwzględniać jej skrajne krawędzie. Na przykład, aby wyśrodkować kamerę na kraju, zachowując stały zoom. W takim przypadku możesz użyć podobnej metody, tworząc element LatLngBounds i używając elementu CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom) z elementem LatLngBounds.getCenter() metody. 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) umożliwia określenie szerokości i wysokości prostokąta w pikselach, tak aby odpowiadały one wymiarom mapy. Prostokąt jest tak umieszczony, aby jego środek pokrywał się ze środkiem widoku mapy (tak więc jeśli określone wymiary są takie same jak wymiary widoku mapy, prostokąt pokrywa się z widokiem mapy). Zwrócona wartość CameraUpdate spowoduje przesunięcie kamery tak, aby określone elementy LatLngBounds znalazły się na środku ekranu w ramach danego prostokąta przy największym możliwym poziomie powiększenia, z uwzględnieniem wymaganego marginesu.

Uwaga: prostszą metodę newLatLngBounds(boundary, padding) do generowania pliku CameraUpdate stosuj tylko wtedy, gdy ma on służyć do przemieszczania kamery po ułożeniu mapy. Podczas tworzenia układu interfejs API oblicza wyświetlane granice mapy, które są potrzebne do prawidłowego wyświetlania ramki ograniczającej. 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 wymienionych powyżej scenariuszach określasz granice mapy, ale użytkownik może przewijać lub przesuwać widok poza te granice. Zamiast tego możesz ograniczyć zakres współrzędnych X i Y punktu centralnego mapy (celu kamery), aby użytkownicy mogli przewijać i przesuwać mapę tylko w tych granicach. 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);

      

Ten diagram przedstawia sytuację, w której cel kamery jest ograniczony do obszaru nieco większego 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 oznacza to, że widoczny obszar obejmuje obszary 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 cel kamery:

Diagram pokazujący cel kamery umieszczony w prawym dolnym rogu kamery LatLngBounds.

Na poniższym diagramie cel kamery ma bardzo ograniczone granice, co daje użytkownikowi niewielką możliwość przewijania lub przesuwania mapy. Krzyż reprezentuje cel kamery:

Diagram pokazujący obiektyw LatLngBounds, który jest mniejszy niż widoczny obszar.

Aktualizuję widok z kamery

Aby zastosować na mapie obiekt CameraUpdate, możesz przenieść lub płynnie ją animować. Aby natychmiast przesunąć kamerę w danym CameraUpdate, możesz wywołać funkcję GoogleMap.moveCamera(CameraUpdate).

Możesz zwiększyć wygodę użytkowników, zwłaszcza w przypadku krótkich przekształceń, przez animację 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
CameraUpdateopisujący, jak przesunąć kamerę.
callback
Obiekt, który implementuje GoogleMap.CancellableCallback Ten ogólny interfejs do obsługi zadań definiuje 2 metody: onCancel() i onFinished(). W przypadku animacji metody są wywoływane w tych okolicznościach:
onFinish()
Wywoływany, gdy animacja zostanie dokończona bez przerwy.
onCancel()

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

Może się tak też zdarzyć, jeśli zadzwonisz na numerGoogleMap.stopAnimation().

duration
Pożądany czas trwania animacji (w milisekundach) jako 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));