Google Street View udostępnia widoki sferyczne (360°) z wyznaczonych dróg na całym obsługiwanym obszarze.
Ten film pokazuje, jak możesz używać usługi Street View, aby zapewnić użytkownikom rzeczywiste wrażenia związane z adresem na mapie i dostarczyć im przydatnych informacji o miejscu docelowym lub dowolnym miejscu, które ich interesuje.
Zasięg dostępny w interfejsie Google Maps Android API w wersji 2 jest taki sam jak w aplikacji Mapy Google na urządzeniu z Androidem. Więcej informacji o Street View i obsługiwanych obszarach znajdziesz na interaktywnej mapie w artykule Informacje o Street View.
Klasa StreetViewPanorama modeluje panoramę Street View w aplikacji. W interfejsie panorama jest reprezentowana przez obiekt StreetViewPanoramaFragment lub StreetViewPanoramaView.
Przykładowe kody
Repozytorium ApiDemos na GitHubie zawiera przykłady pokazujące, jak korzystać ze Street View.
Przykłady w języku Kotlin:
- StreetViewPanoramaBasicDemoActivity: podstawy korzystania ze Street View.
- StreetViewPanoramaEventsDemoActivity: nasłuchiwanie zdarzeń.
- StreetViewPanoramaNavigationDemoActivity: programowe sterowanie panoramami Street View.
- StreetViewPanoramaOptionsDemoActivity: zmiana opcji interfejsu i gestów.
- StreetViewPanoramaViewDemoActivity: używanie
StreetViewPanoramaView(zamiast fragmentu). - SplitStreetViewPanoramaAndMapDemoActivity: używanie aktywności, która wyświetla Street View i mapę.
Przykłady w języku Java:
- StreetViewPanoramaBasicDemoActivity: podstawy korzystania ze Street View.
- StreetViewPanoramaEventsDemoActivity: nasłuchiwanie zdarzeń.
- StreetViewPanoramaNavigationDemoActivity: programowe sterowanie panoramami Street View.
- StreetViewPanoramaOptionsDemoActivity: zmiana opcji interfejsu i gestów.
- StreetViewPanoramaViewDemoActivity: używanie
StreetViewPanoramaView(zamiast fragmentu). - SplitStreetViewPanoramaAndMapDemoActivity: tworzenie aktywności, która wyświetla Street View i mapę.
Omówienie Street View w pakiecie Maps SDK na Androida
Pakiet Maps SDK na Androida udostępnia usługę Street View, która umożliwia uzyskiwanie i modyfikowanie zdjęć używanych w Google Street View. Obrazy są zwracane jako panoramy.
Każda panorama Street View to zdjęcie lub zestaw zdjęć, które zapewniają pełny widok 360 stopni z jednej lokalizacji. Obrazy są zgodne z odwzorowaniem walcowym równoodległościowym (Plate Carrée), które obejmuje 360 stopni widoku w poziomie (pełny obrót) i 180 stopni widoku w pionie (od góry do dołu). Powstała panorama 360 stopni definiuje projekcję na kuli, a obraz jest owinięty wokół dwuwymiarowej powierzchni tej kuli.
StreetViewPanorama udostępnia przeglądarkę, która renderuje panoramę jako sferę z kamerą w środku. Możesz manipulować StreetViewPanoramaCamera, aby kontrolować powiększenie i orientację (pochylenie i kierunek) kamery.
Rozpocznij
Konfigurowanie projektu
Aby skonfigurować projekt pakietu SDK Map na Androida, postępuj zgodnie z przewodnikiem dla początkujących.
Sprawdzanie dostępności panoramy Street View przed jej dodaniem
Biblioteka klienta pakietu SDK usług Google Play zawiera kilka przykładów Street View, które możesz zaimportować do projektu i wykorzystać jako podstawę do dalszych prac. Wskazówki dotyczące importowania przykładów znajdziesz we wprowadzeniu.
Biblioteka narzędziowa pakietu Maps SDK na Androida to biblioteka klas open source, które są przydatne w różnych aplikacjach. W repozytorium GitHub znajduje się narzędzie do metadanych Street View.
To narzędzie sprawdza, czy dana lokalizacja jest obsługiwana przez Street View. Możesz uniknąć błędów podczas dodawania panoramy Street View do aplikacji na Androida, wywołując to narzędzie do metadanych i dodając panoramę Street View tylko wtedy, gdy odpowiedź to OK.
Korzystanie z interfejsu API
Aby dodać panoramę Street View do fragmentu Androida, postępuj zgodnie z poniższymi instrukcjami. To najprostszy sposób na dodanie Street View do aplikacji. Następnie dowiedz się więcej o fragmentach, widokach i dostosowywaniu panoramy.
Dodawanie panoramy Street View
Aby dodać panoramę Street View, wykonaj te czynności:
Podsumowanie:
- Dodaj obiekt Fragment do obiektu Activity, który będzie obsługiwać panoramę Street View. Najprostszym sposobem jest dodanie elementu
<fragment>do pliku układu dlaActivity. - Zaimplementuj interfejs
OnStreetViewPanoramaReadyCallbacki użyj metody wywołania zwrotnegoonStreetViewPanoramaReady(StreetViewPanorama), aby uzyskać uchwyt do obiektuStreetViewPanorama. - Wywołaj
getStreetViewPanoramaAsync()we fragmencie, aby zarejestrować wywołanie zwrotne.
Poniżej znajdziesz więcej informacji o każdym z tych kroków.
Dodawanie fragmentu
Dodaj element <fragment> do pliku układu aktywności, aby zdefiniować obiekt Fragment. W tym elemencie ustaw atrybut class na com.google.android.gms.maps.StreetViewPanoramaFragment (lub SupportStreetViewPanoramaFragment).
Oto przykład fragmentu w pliku układu:
<fragment
android:name="com.google.android.gms.maps.StreetViewPanoramaFragment"
android:id="@+id/streetviewpanorama"
android:layout_width="match_parent"
android:layout_height="match_parent"/>Dodaj kod Street View
Aby pracować z panoramą Street View w aplikacji, musisz zaimplementować interfejs OnStreetViewPanoramaReadyCallback i ustawić instancję wywołania zwrotnego w obiekcie StreetViewPanoramaFragment lub StreetViewPanoramaView. W tym samouczku używamy StreetViewPanoramaFragment, ponieważ jest to najprostszy sposób na dodanie Street View do aplikacji. Pierwszym krokiem jest wdrożenie interfejsu wywołania zwrotnego:
Kotlin
class StreetViewActivity : AppCompatActivity(), OnStreetViewPanoramaReadyCallback { // ... } private fun newView() { val sanFrancisco = LatLng(37.754130, -122.447129) val view = StreetViewPanoramaView( this, StreetViewPanoramaOptions().position(sanFrancisco), ) } private fun setLocationOfThePanorama(streetViewPanorama: StreetViewPanorama) { val sanFrancisco = LatLng(37.754130, -122.447129) // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco) // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20) // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR) // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR) streetViewPanorama.location.links.firstOrNull()?.let { link: StreetViewPanoramaLink -> streetViewPanorama.setPosition(link.panoId) } } private fun zoom(streetViewPanorama: StreetViewPanorama) { val zoomBy = 0.5f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom + zoomBy) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing) .build() } private fun pan(streetViewPanorama: StreetViewPanorama) { val panBy = 30f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - panBy) .build() } private fun tilt(streetViewPanorama: StreetViewPanorama) { var tilt = streetViewPanorama.panoramaCamera.tilt + 30 tilt = if (tilt > 90) 90f else tilt val previous = streetViewPanorama.panoramaCamera val camera = StreetViewPanoramaCamera.Builder(previous) .tilt(tilt) .build() } private fun animate(streetViewPanorama: StreetViewPanorama) { // Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. val duration: Long = 1000 val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - 60) .build() streetViewPanorama.animateTo(camera, duration) } }
Java
public class StreetViewActivity extends AppCompatActivity implements OnStreetViewPanoramaReadyCallback { // ... } private void newView() { LatLng sanFrancisco = new LatLng(37.754130, -122.447129); StreetViewPanoramaView view = new StreetViewPanoramaView( this, new StreetViewPanoramaOptions().position(sanFrancisco)); } private void setLocationOfThePanorama(StreetViewPanorama streetViewPanorama) { LatLng sanFrancisco = new LatLng(37.754130, -122.447129); // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco); // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20); // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR); // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR); StreetViewPanoramaLocation location = streetViewPanorama.getLocation(); if (location != null && location.links != null) { streetViewPanorama.setPosition(location.links[0].panoId); } } private void zoom(StreetViewPanorama streetViewPanorama) { float zoomBy = 0.5f; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom + zoomBy) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing) .build(); } private void pan(StreetViewPanorama streetViewPanorama) { float panBy = 30; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - panBy) .build(); } private void tilt(StreetViewPanorama streetViewPanorama) { float tilt = streetViewPanorama.getPanoramaCamera().tilt + 30; tilt = (tilt > 90) ? 90 : tilt; StreetViewPanoramaCamera previous = streetViewPanorama.getPanoramaCamera(); StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder(previous).tilt(tilt).build(); } private void animate(StreetViewPanorama streetViewPanorama) { // Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. long duration = 1000; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - 60) .build(); streetViewPanorama.animateTo(camera, duration); } }
W metodzie onCreate() klasy Activity ustaw plik układu jako widok zawartości. Jeśli na przykład plik układu ma nazwę main.xml, użyj tego kodu:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_street_view) val streetViewPanoramaFragment = supportFragmentManager .findFragmentById(R.id.street_view_panorama) as SupportStreetViewPanoramaFragment streetViewPanoramaFragment.getStreetViewPanoramaAsync(this) }
Java
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_street_view); SupportStreetViewPanoramaFragment streetViewPanoramaFragment = (SupportStreetViewPanoramaFragment) getSupportFragmentManager().findFragmentById(R.id.street_view_panorama); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this); }
Pobierz uchwyt do fragmentu, wywołując FragmentManager.findFragmentById() i przekazując mu identyfikator zasobu elementu <fragment>.
Zauważ, że identyfikator zasobu R.id.streetviewpanorama jest automatycznie dodawany do projektu aplikacji na Androida podczas tworzenia pliku układu.
Następnie użyj getStreetViewPanoramaAsync(), aby ustawić wywołanie zwrotne we fragmencie.
Kotlin
val streetViewPanoramaFragment = supportFragmentManager .findFragmentById(R.id.street_view_panorama) as SupportStreetViewPanoramaFragment streetViewPanoramaFragment.getStreetViewPanoramaAsync(this)
Java
SupportStreetViewPanoramaFragment streetViewPanoramaFragment = (SupportStreetViewPanoramaFragment) getSupportFragmentManager().findFragmentById(R.id.street_view_panorama); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);
Użyj metody wywołania zwrotnego onStreetViewPanoramaReady(StreetViewPanorama), aby pobrać niepustą instancję StreetViewPanorama gotową do użycia.
Kotlin
override fun onStreetViewPanoramaReady(streetViewPanorama: StreetViewPanorama) { val sanFrancisco = LatLng(37.754130, -122.447129) streetViewPanorama.setPosition(sanFrancisco) }
Java
@Override public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) { LatLng sanFrancisco = new LatLng(37.754130, -122.447129); streetViewPanorama.setPosition(sanFrancisco); }
Więcej informacji o konfigurowaniu stanu początkowego
W przeciwieństwie do mapy nie można skonfigurować stanu początkowego panoramy Street View za pomocą kodu XML. Możesz jednak skonfigurować panoramę automatycznie, przekazując obiekt StreetViewPanoramaOptions zawierający określone opcje.
- Jeśli używasz
StreetViewPanoramaFragment, użyj metody fabryki statycznejStreetViewPanoramaFragment.newInstance(StreetViewPanoramaOptions options), aby utworzyć fragment i przekazać niestandardowe opcje konfiguracji. - Jeśli używasz
StreetViewPanoramaView, użyj konstruktoraStreetViewPanoramaView(Context, StreetViewPanoramaOptions)i przekaż niestandardowe opcje konfiguracji.
Kotlin
val sanFrancisco = LatLng(37.754130, -122.447129) val view = StreetViewPanoramaView( this, StreetViewPanoramaOptions().position(sanFrancisco), )
Java
LatLng sanFrancisco = new LatLng(37.754130, -122.447129); StreetViewPanoramaView view = new StreetViewPanoramaView( this, new StreetViewPanoramaOptions().position(sanFrancisco));
Więcej informacji o StreetViewPanoramaFragment
StreetViewPanoramaFragment jest podklasą klasy Android Fragment i umożliwia umieszczenie panoramy Street View we fragmencie Androida.
Obiekty StreetViewPanoramaFragment działają jako kontenery panoramy i zapewniają dostęp do obiektu StreetViewPanorama.
StreetViewPanoramaView
StreetViewPanoramaView, podklasa klasy View Androida, umożliwia umieszczenie panoramy Street View w obiekcie View Androida. View reprezentuje prostokątny obszar ekranu i jest podstawowym elementem składowym aplikacji na Androida i widżetów. Podobnie jak StreetViewPanoramaFragment, StreetViewPanoramaView działa jako kontener dla panoramy, udostępniając główne funkcje za pomocą obiektu StreetViewPanorama. Użytkownicy tej klasy muszą przekazywać wszystkie metody cyklu życia działania, takie jak onCreate(), onDestroy(), onResume() i onPause()), do odpowiednich metod w klasie StreetViewPanoramaView.
Dostosowywanie funkcji kontrolowanej przez użytkownika
Domyślnie podczas wyświetlania panoramy Street View użytkownik może korzystać z tych funkcji: przesuwanie, powiększanie i przechodzenie do sąsiednich panoram. Gesty kontrolowane przez użytkownika możesz włączać i wyłączać za pomocą metod w StreetViewPanorama. Zmiany programowe są nadal możliwe, gdy gest jest wyłączony.
Ustawianie lokalizacji panoramy
Aby ustawić lokalizację panoramy Street View, wywołaj metodę StreetViewPanorama.setPosition(), przekazując obiekt LatLng.
Możesz też przekazywać parametry radius i source jako parametry opcjonalne.
Promień jest przydatny, jeśli chcesz poszerzyć lub zawęzić obszar, na którym Street View będzie szukać pasującej panoramy. Promień o wartości 0 oznacza, że panorama musi być połączona dokładnie z określonymi współrzędnymi LatLng.
Domyślny promień to 50 metrów. Jeśli w obszarze dopasowania znajduje się więcej niż 1 panorama, interfejs API zwróci najlepsze dopasowanie.
Źródło jest przydatne, jeśli chcesz ograniczyć Street View do wyszukiwania tylko panoram na zewnątrz. Domyślnie panoramy Street View mogą znajdować się w miejscach takich jak muzea, budynki publiczne, kawiarnie i firmy. Pamiętaj, że dla określonej lokalizacji mogą nie istnieć panoramy zewnętrzne.
Kotlin
val sanFrancisco = LatLng(37.754130, -122.447129) // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco) // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20) // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR) // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR)
Java
LatLng sanFrancisco = new LatLng(37.754130, -122.447129); // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco); // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20); // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR); // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR);
Możesz też ustawić lokalizację na podstawie identyfikatora panoramy, przekazując panoId do StreetViewPanorama.setPosition().
Aby pobrać identyfikator sąsiednich panoram, najpierw użyj metody getLocation(), aby pobrać obiekt StreetViewPanoramaLocation.
Ten obiekt zawiera identyfikator bieżącej panoramy i tablicę obiektów StreetViewPanoramaLink, z których każdy zawiera identyfikator panoramy połączonej z bieżącą.
Kotlin
streetViewPanorama.location.links.firstOrNull()?.let { link: StreetViewPanoramaLink -> streetViewPanorama.setPosition(link.panoId) }
Java
StreetViewPanoramaLocation location = streetViewPanorama.getLocation(); if (location != null && location.links != null) { streetViewPanorama.setPosition(location.links[0].panoId); }
Powiększanie i pomniejszanie
Poziom powiększenia możesz zmienić automatycznie, ustawiając StreetViewPanoramaCamera.zoom.
Ustawienie powiększenia na 1,0 spowoduje dwukrotne powiększenie obrazu.
Poniższy fragment kodu używa StreetViewPanoramaCamera.Builder() do utworzenia nowej kamery z nachyleniem i orientacją istniejącej kamery, ale z powiększeniem zwiększonym o 50%.
Kotlin
val zoomBy = 0.5f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom + zoomBy) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing) .build()
Java
float zoomBy = 0.5f; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom + zoomBy) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing) .build();
Ustawianie orientacji kamery (punktu widzenia)
Orientację kamery Street View możesz określić, ustawiając kierunek i nachylenie w obiekcie StreetViewPanoramaCamera.
- bearing
- Kierunek, w którym skierowana jest kamera, określony w stopniach zgodnie z ruchem wskazówek zegara od północy geograficznej wokół miejsca, w którym znajduje się kamera. Północ to 0, wschód – 90, południe – 180, a zachód – 270.
- pochylenie
- Oś Y przechyla się w górę lub w dół. Zakres wynosi od -90 do 90, gdzie -90 oznacza patrzenie prosto w dół, 0 – na horyzont, a 90 – prosto w górę. Odchylenie jest mierzone od początkowego domyślnego nachylenia kamery, które często (ale nie zawsze) jest płaskie w poziomie. Na przykład zdjęcie zrobione na wzgórzu będzie prawdopodobnie miało domyślne nachylenie, które nie jest poziome.
Poniższy fragment kodu używa StreetViewPanoramaCamera.Builder() do utworzenia nowej kamery z powiększeniem i pochyleniem istniejącej kamery, ale ze zmianą kierunku o 30 stopni w lewo.
Kotlin
val panBy = 30f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - panBy) .build()
Java
float panBy = 30; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - panBy) .build();
Poniższy fragment kodu przechyla kamerę o 30 stopni w górę.
Kotlin
var tilt = streetViewPanorama.panoramaCamera.tilt + 30 tilt = if (tilt > 90) 90f else tilt val previous = streetViewPanorama.panoramaCamera val camera = StreetViewPanoramaCamera.Builder(previous) .tilt(tilt) .build()
Java
float tilt = streetViewPanorama.getPanoramaCamera().tilt + 30; tilt = (tilt > 90) ? 90 : tilt; StreetViewPanoramaCamera previous = streetViewPanorama.getPanoramaCamera(); StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder(previous).tilt(tilt).build();
Animowanie ruchów kamery
Aby animować ruchy kamery, wywołaj StreetViewPanorama.animateTo().
Animacja interpoluje między bieżącymi i nowymi atrybutami kamery. Jeśli chcesz przejść bezpośrednio do kamery bez animacji, możesz ustawić czas trwania na 0.
Kotlin
// Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. val duration: Long = 1000 val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - 60) .build() streetViewPanorama.animateTo(camera, duration)
Java
// Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. long duration = 1000; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - 60) .build(); streetViewPanorama.animateTo(camera, duration);
Poniższy obraz pokazuje wynik zaplanowania powyższej animacji do uruchamiania co 2000 milisekund za pomocą Handler.postDelayed():