Google Street View zapewnia panoramiczne widoki 360° z wyznaczonych dróg na całym obszarze objętym zasięgiem.
W tym filmie pokazujemy, jak za pomocą usługi Street View zapewnić użytkownikom wrażenia w prawdziwym świecie z adresem na mapie i przekazywać im istotne informacje o miejscu docelowym lub innym miejscu, które ich interesuje.
Zasięg dostępny przez interfejs API Map Google v2 jest taki sam jak dla aplikacji Mapy Google na Twoim urządzeniu z Androidem. Więcej informacji o Street View i obsługiwanych obszarach na interaktywnej mapie znajdziesz w artykule Street View – informacje.
Klasa StreetViewPanorama
modeluje w aplikacji panoramę Street View. W Twoim interfejsie panorama jest reprezentowana przez obiekt StreetViewPanoramaFragment
lub StreetViewPanoramaView
.
Przykładowe fragmenty kodu
Repozytorium API Apigee na GitHubie zawiera przykłady, które pokazują wykorzystanie Street View.
Przykłady z usługi Kotlin:
- StreetViewPanoramaBasicDemoActivity: podstawy korzystania z Street View
- StreetViewPanoramaEventsDemoActivity: odsłuchiwanie zdarzeń
- StreetViewPanoramaNavigationDemoActivity: automatyczne kontrolowanie panoram Street View
- StreetViewPanoramaOptionsDemoActivity: zmiana opcji interfejsu i gestów
- StreetViewPanoramaViewDemoActivity: używa
StreetViewPanoramaView
(zamiast fragmentu). - SplitStreetViewPanoramaAndMapDemoActivity: korzystanie z aktywności, która wyświetla Street View i mapę.
Przykłady w języku Java:
- StreetViewPanoramaBasicDemoActivity: podstawy korzystania z Street View
- StreetViewPanoramaEventsDemoActivity: odsłuchiwanie zdarzeń
- StreetViewPanoramaNavigationDemoActivity: automatyczne kontrolowanie panoram Street View
- StreetViewPanoramaOptionsDemoActivity: zmiana opcji interfejsu i gestów
- StreetViewPanoramaViewDemoActivity: używa
StreetViewPanoramaView
(zamiast fragmentu). - SplitStreetViewPanoramaAndMapDemoActivity: tworzenie aktywności, która wyświetla Street View i mapę.
Omówienie funkcji Street View w pakiecie SDK Map Google na Androida
Pakiet Maps SDK na Androida udostępnia usługę Street View, która umożliwia pozyskiwanie zdjęć używanych w Google Street View i manipulowanie nimi. Obrazy są zwracane jako panoramy.
Każda panorama Street View jest obrazem albo zestawem zdjęć, które zapewniają pełny widok 360 stopni z jednego miejsca. Obrazy są tworzone zgodnie z odwzorowaniem walcowym równoodległościowym (Plate Carrée), które obejmuje widok w poziomie obejmujący 360 stopni (pełne zawinięcie) i 180 stopni w pionie (od prostopadłości do prosto w dół). Powstała w ten sposób panorama 360 stopni to rzut kuli z obrazem nałożonym na dwuwymiarową powierzchnię tej kuli.
StreetViewPanorama
umożliwia renderowanie panoramy z aparatem umieszczonym w jej środku. Możesz manipulować elementem StreetViewPanoramaCamera
, aby kontrolować powiększenie i orientację (pochylenie i położenie kamery).
Rozpocznij
Konfigurowanie projektu
Aby skonfigurować projekt pakietu Maps SDK na Androida, postępuj zgodnie z przewodnikiem dla początkujących.
Zanim dodasz panoramę, sprawdź dostępność panoramy Street View
Biblioteka klienta pakietu SDK Usług Google Play zawiera kilka przykładów Street View, które możesz zaimportować do swojego projektu i wykorzystać jako podstawę podczas programowania. Wskazówki na temat importowania próbek znajdziesz we wprowadzeniu.
Biblioteka narzędziowa pakietu Maps SDK na Androida to biblioteka klas typu open source, która przydaje się w różnych aplikacjach. Repozytorium GitHub zawiera narzędzie do edytowania metadanych Street View.
To narzędzie sprawdza, czy Street View obsługuje daną lokalizację. 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
Wykonaj poniższe instrukcje, aby dodać panoramę Street View do fragmentu kodu z Androidem. To najprostszy sposób dodania Street View do aplikacji. Następnie przeczytaj więcej o fragmentach, widokach i dostosowywaniu panoramy.
Dodawanie panoramy Street View
Aby dodać taką panoramę Street View:
W skrócie:
- Dodaj do obiektu Activity obiekt Fragment, który będzie obsługiwać panoramę Street View. Najłatwiej to zrobić, dodając element
<fragment>
do pliku układu dlaActivity
. - Zaimplementuj interfejs
OnStreetViewPanoramaReadyCallback
i użyj metody wywołania zwrotnegoonStreetViewPanoramaReady(StreetViewPanorama)
, aby uzyskać nick do obiektuStreetViewPanorama
. - Wywołaj w tym fragmencie polecenie
getStreetViewPanoramaAsync()
, aby zarejestrować wywołanie zwrotne.
Poniżej znajdziesz więcej informacji o poszczególnych krokach.
Dodaj fragment
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ć nad panoramą Street View w aplikacji, musisz zaimplementować interfejs OnStreetViewPanoramaReadyCallback
i ustawić wystąpienie wywołania zwrotnego na obiekcie StreetViewPanoramaFragment
lub StreetViewPanoramaView
. W tym samouczku używamy StreetViewPanoramaFragment
, ponieważ jest to najprostszy sposób dodania Street View do Twojej aplikacji. Pierwszy krok to implementacja interfejsu wywołania zwrotnego:
Kotlin
class StreetViewActivity : AppCompatActivity(), OnStreetViewPanoramaReadyCallback { // ... }
Java
class StreetViewActivity extends AppCompatActivity implements OnStreetViewPanoramaReadyCallback { // ... }
W metodzie onCreate()
w Activity
ustaw plik układu jako widok treści. Jeśli np. 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); }
Uzyskaj uchwyt dla tego fragmentu, wywołując metodę FragmentManager.findFragmentById()
i przekazując mu identyfikator zasobu elementu <fragment>
.
Zwróć uwagę, że identyfikator zasobu R.id.streetviewpanorama
jest dodawany automatycznie do projektu Androida podczas tworzenia pliku układu.
Następnie użyj metody getStreetViewPanoramaAsync()
, aby ustawić wywołanie zwrotne dla tego fragmentu.
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
, która jest gotowa 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 ma możliwości skonfigurowania początkowego stanu 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 obiektu
StreetViewPanoramaFragment
, użyj statycznej metody fabrykiStreetViewPanoramaFragment.newInstance(StreetViewPanoramaOptions options)
, aby utworzyć fragment i przekazać niestandardowe opcje konfiguracji. - Jeśli używasz obiektu
StreetViewPanoramaView
, użyj konstruktoraStreetViewPanoramaView(Context, StreetViewPanoramaOptions)
i przekaż własne, niestandardowe opcje.
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 o StreetViewPanoramaFragment
StreetViewPanoramaFragment
jest podklasą klasy Fragment Androida 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 Android View
, umożliwia umieszczenie panoramy Street View w urządzeniu View
Androida. View
reprezentuje prostokątny obszar ekranu i jest podstawowym elementem składowym aplikacji i widżetów na Androida.
Podobnie jak StreetViewPanoramaFragment
, obiekt StreetViewPanoramaView
pełni rolę kontenera dla panoramy i pokazuje jej główne funkcje za pomocą obiektu StreetViewPanorama
. Użytkownicy tej klasy muszą przekazywać wszystkie metody cyklu życia aktywności (takie jak onCreate()
, onDestroy()
, onResume()
i onPause())
) do odpowiednich metod z klasy StreetViewPanoramaView
.
Dostosowywanie funkcji kontrolowanej przez użytkownika
Podczas wyświetlania panoramy Street View użytkownik domyślnie ma dostęp do tych funkcji: przesuwanie, powiększanie i podróżowanie do sąsiednich panoram. Gesty kontrolowane przez użytkowników możesz włączać i wyłączać za pomocą metod w StreetViewPanorama
. Gdy gest jest wyłączony, można wprowadzać automatyczne zmiany.
Ustaw lokalizację panoramy
Aby ustawić lokalizację panoramy Street View, wywołaj StreetViewPanorama.setPosition()
, przekazując LatLng
.
Parametr radius
i source
możesz też przekazywać jako parametry opcjonalne.
Promień jest przydatny, gdy chcesz poszerzyć lub zawęzić obszar, na którym Street View będzie szukać pasującej panoramy. Promień równy 0 oznacza, że panorama musi być połączona z określonym obszarem LatLng
.
Domyślny promień to 50 metrów. Jeśli w pasującym obszarze znajduje się więcej niż 1 panorama, interfejs API zwróci najlepszą panoramę.
Źródło przydaje się, gdy chcesz ograniczyć widok do Street View do zdjęć panoramicznych. Domyślnie panoramy Street View mogą znajdować się w muzeach, budynkach publicznych, kawiarniach i firmach. W danej lokalizacji mogą nie być dostępne panoramy na zewnątrz.
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 getLocation()
do pobrania StreetViewPanoramaLocation
.
Ten obiekt zawiera identyfikator bieżącej panoramy oraz 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 za pomocą ustawienia StreetViewPanoramaCamera.zoom
.
Gdy ustawisz powiększenie na 1,0,
obraz zostanie powiększony 2-krotnie.
Ten fragment kodu używa uprawnienia StreetViewPanoramaCamera.Builder()
do utworzenia nowej kamery z przechyleniem i położeniem istniejącej kamery, zwiększając jednocześnie powiększenie 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();
Ustaw orientację (punkt widzenia) aparatu.
Możesz określić orientację aparatu Street View, ustawiając położenie i przechylenie na StreetViewPanoramaCamera
.
- dźwigając
- Kierunek, w którym skierowany jest aparat, określony w stopniach w prawo, od rzeczywistej północy, w kierunku lokalizacji kamery. Rzeczywista północ to 0, wschód to 90, południe to 180, a zachód to 270.
- przechyl
- Oś Y pochyla się w górę lub w dół. Zakres wynosi od -90 do 90, przy czym -90 skieruje się prosto w dół, 0 na horyzoncie, a 90 na horyzoncie. Wariancję jest mierzona na podstawie początkowego domyślnego kąta kamery, który często (ale nie zawsze) jest płaski w poziomie. Na przykład zdjęcie zrobione ze wzgórza prawdopodobnie będzie miało domyślny kąt, który nie jest poziomy.
Ten fragment kodu używa uprawnienia StreetViewPanoramaCamera.Builder()
, aby utworzyć nową kamerę z powiększeniem i przechyleniem dotychczasowej kamery, przesuwając ją 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();
Ten fragment przechyla kamerę w górę o 30 stopni.
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();
Animuj ruchy kamery
Aby animować ruchy kamery, wywołaj StreetViewPanorama.animateTo()
.
Animacja interpoluje między bieżącymi atrybutami kamery a 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, jeśli zaplanujesz uruchamianie powyższej animacji co 2000 milisekund z użyciem metody Handler.postDelayed()
: