Street View

Seleziona la piattaforma: Android iOS JavaScript

Google Street View fornisce viste panoramiche a 360° delle strade designate in tutta la sua area di copertura.

Questo video mostra come utilizzare il servizio Street View per offrire agli utenti un'esperienza reale di un indirizzo sulla mappa, fornendo loro un contesto significativo sulla destinazione o su qualsiasi luogo di loro interesse.

La copertura disponibile tramite l'API Google Maps per Android v2 è la stessa dell'app Google Maps sul tuo dispositivo Android. Puoi scoprire di più su Street View e visualizzare le aree supportate su una mappa interattiva nella pagina Informazioni su Street View.

La classe StreetViewPanorama modella la panoramica di Street View nella tua applicazione. All'interno della tua UI, un panorama è rappresentato da un oggetto StreetViewPanoramaFragment o StreetViewPanoramaView.

Esempi di codice

Il repository ApiDemos su GitHub include esempi che mostrano l'utilizzo di Street View.

Esempi di Kotlin:

Esempi di Java:

Panoramica di Street View in Maps SDK for Android

Maps SDK for Android fornisce un servizio Street View per ottenere e manipolare le immagini utilizzate in Google Street View. Le immagini vengono restituite come panoramiche.

Ogni panoramica in Street View è un'immagine o un insieme di immagini che fornisce una visuale completa a 360 gradi da un'unica posizione. Le immagini sono conformi alla proiezione equirettangolare (Plate Carrée), che contiene 360 gradi di visualizzazione orizzontale (una panoramica completa) e 180 gradi di visualizzazione verticale (dall'alto verso il basso). La vista panoramica a 360° risultante definisce una proiezione su una sfera con l'immagine avvolta sulla superficie bidimensionale di quella sfera.

StreetViewPanorama fornisce un visualizzatore che esegue il rendering della panoramica come una sfera con una fotocamera al centro. Puoi manipolare l'oggetto StreetViewPanoramaCamera per controllare lo zoom e l'orientamento (inclinazione e direzione) della videocamera.

Inizia

Configura un progetto

Segui la guida introduttiva per configurare un progetto Maps SDK for Android.

Verifica la disponibilità di panoramiche in Street View prima di aggiungerne una

La libreria client dell'SDK Google Play Services include alcuni esempi di Street View che puoi importare nel tuo progetto e utilizzare come base per lo sviluppo. Consulta l'introduzione per le linee guida sull'importazione degli esempi.

La libreria di utilità di Maps SDK for Android è una libreria open source di classi utili per una serie di applicazioni. Nel repository GitHub è inclusa l'utilità per i metadati di Street View. Questa utilità controlla se una località è supportata da Street View. Puoi evitare errori quando aggiungi una panoramica in Street View a un'app per Android chiamando questa utilità di metadati e aggiungendo una panoramica in Street View solo se la risposta è OK.

Utilizzare l'API

Segui le istruzioni riportate di seguito per aggiungere una panoramica di Street View a un frammento Android. Questo è il modo più semplice per aggiungere Street View alla tua applicazione. Poi, scopri di più su frammenti, visualizzazioni e personalizzazione della panoramica.

Aggiungi una Panoramica in Street View

Segui i passaggi riportati di seguito per aggiungere una panoramica in Street View come questa:

Demo di panoramica in Street View

In sintesi:

  1. Aggiungi un oggetto Fragment all'Activity che gestirà la Panoramica in Street View. Il modo più semplice per farlo è aggiungere un elemento <fragment> al file di layout per Activity.
  2. Implementa l'interfaccia OnStreetViewPanoramaReadyCallback e utilizza il metodo di callback onStreetViewPanoramaReady(StreetViewPanorama) per ottenere un handle per l'oggetto StreetViewPanorama.
  3. Chiama getStreetViewPanoramaAsync() sul frammento per registrare il callback.

Di seguito sono riportati ulteriori dettagli su ogni passaggio.

Aggiungi un frammento

Aggiungi un elemento <fragment> al file di layout dell'attività per definire un oggetto Fragment. In questo elemento, imposta l'attributo class su com.google.android.gms.maps.StreetViewPanoramaFragment (o SupportStreetViewPanoramaFragment).

Ecco un esempio di frammento in un file di layout:

<fragment
    android:name="com.google.android.gms.maps.StreetViewPanoramaFragment"
    android:id="@+id/streetviewpanorama"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Aggiungi il codice di Street View

Per utilizzare la panoramica in Street View all'interno della tua app, devi implementare l'interfaccia OnStreetViewPanoramaReadyCallback e impostare un'istanza del callback su un oggetto StreetViewPanoramaFragment o StreetViewPanoramaView. Questo tutorial utilizza un StreetViewPanoramaFragment, perché è il modo più semplice per aggiungere Street View alla tua app. Il primo passaggio consiste nell'implementare l'interfaccia di callback:

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

      

Nel metodo onCreate() di Activity, imposta il file di layout come visualizzazione dei contenuti. Ad esempio, se il file di layout ha il nome main.xml, utilizza questo codice:

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


      

Ottieni un handle per il frammento chiamando FragmentManager.findFragmentById(), passandogli l'ID risorsa dell'elemento <fragment>. Tieni presente che l'ID risorsa R.id.streetviewpanorama viene aggiunto automaticamente al progetto Android quando crei il file di layout.

Poi utilizza getStreetViewPanoramaAsync() per impostare il callback sul frammento.

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

      

Utilizza il metodo di callback onStreetViewPanoramaReady(StreetViewPanorama) per recuperare un'istanza non null di StreetViewPanorama, pronta per essere utilizzata.

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


      

Scopri di più sulla configurazione dello stato iniziale

A differenza di una mappa, non è possibile configurare lo stato iniziale della panoramica in Street View tramite XML. Tuttavia, puoi configurare la panoramica in modo programmatico passando un oggetto StreetViewPanoramaOptions contenente le opzioni specificate.

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

      

Scopri di più su StreetViewPanoramaFragment

StreetViewPanoramaFragment è una sottoclasse della classe Android Fragment e consente di inserire una Panoramica in Street View in un frammento Android. Gli oggetti StreetViewPanoramaFragment fungono da container per il panorama e forniscono l'accesso all'oggetto StreetViewPanorama.

StreetViewPanoramaView

StreetViewPanoramaView, una sottoclasse della classe Android View, ti consente di inserire una Panoramica in Street View in un View Android. Un View rappresenta un'area rettangolare dello schermo ed è un elemento di base fondamentale per le app per Android e i widget. Proprio come un StreetViewPanoramaFragment, StreetViewPanoramaView funge da container per la panoramica, esponendo le funzionalità principali tramite l'oggetto StreetViewPanorama. Gli utenti di questa classe devono inoltrare tutti i metodi del ciclo di vita dell'attività, come onCreate(), onDestroy(), onResume() e onPause()), ai metodi corrispondenti nella classe StreetViewPanoramaView.

Personalizza la funzionalità controllata dall'utente

Per impostazione predefinita, l'utente può utilizzare le seguenti funzionalità quando visualizza la panoramica in Street View: panoramica, zoom e spostamento verso le panoramiche adiacenti. Puoi attivare e disattivare i gesti controllati dall'utente tramite i metodi su StreetViewPanorama. Le modifiche programmatiche sono comunque possibili quando il gesto è disattivato.

Imposta la posizione della panoramica

Per impostare la posizione della panoramica in Street View, chiama StreetViewPanorama.setPosition(), passando un LatLng. Puoi anche passare radius e source come parametri facoltativi.

Un raggio è utile se vuoi ampliare o restringere l'area in cui Street View cercherà una panoramica corrispondente. Un raggio pari a 0 indica che la panoramica deve essere collegata esattamente al valore LatLng specificato. Il raggio predefinito è di 50 metri. Se nell'area corrispondente è presente più di una panoramica, l'API restituirà la corrispondenza migliore.

Un'origine è utile se vuoi limitare Street View in modo che cerchi solo panoramiche all'aperto. Per impostazione predefinita, le Panoramiche in Street View potrebbero trovarsi all'interno di luoghi come musei, edifici pubblici, bar e attività. Tieni presente che potrebbero non esistere panoramiche esterne per la località specificata.

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

      

In alternativa, puoi impostare la posizione in base a un ID panorama passando un panoId a StreetViewPanorama.setPosition().

Per recuperare l'ID panorama per i panorami adiacenti, utilizza prima getLocation() per recuperare un StreetViewPanoramaLocation. Questo oggetto contiene l'ID della panoramica corrente e un array di oggetti StreetViewPanoramaLink, ognuno dei quali contiene l'ID di una panoramica collegata a quella corrente.

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

      

Zoom avanti e indietro

Puoi modificare il livello di zoom in modo programmatico impostando StreetViewPanoramaCamera.zoom. Se imposti lo zoom su 1.0, l'immagine verrà ingrandita di un fattore pari a 2.

Lo snippet seguente utilizza StreetViewPanoramaCamera.Builder() per creare una nuova fotocamera con l'inclinazione e l'orientamento della fotocamera esistente, aumentando al contempo lo zoom del 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();

      

Imposta l'orientamento della videocamera (punto di vista)

Puoi determinare l'orientamento della videocamera di Street View impostando la direzione e l'inclinazione su StreetViewPanoramaCamera.

bearing
La direzione in cui è puntata la videocamera, specificata in gradi in senso orario rispetto al nord geografico, attorno al punto della videocamera. Il nord geografico è 0, l'est è 90, il sud è 180 e l'ovest è 270.
inclina
L'inclinazione verso l'alto o verso il basso dell'asse Y. L'intervallo va da -90 a 90, dove -90 indica una visuale verso il basso, 0 una visuale centrata sull'orizzonte e 90 una visuale verso l'alto. La variazione viene misurata rispetto al beccheggio predefinito iniziale della videocamera, che spesso (ma non sempre) è piatto in orizzontale. Ad esempio, un'immagine scattata su una collina avrà probabilmente un'inclinazione predefinita non orizzontale.

Lo snippet seguente utilizza StreetViewPanoramaCamera.Builder() per creare una nuova fotocamera con lo zoom e l'inclinazione della fotocamera esistente, modificando al contempo l'orientamento di 30 gradi verso sinistra.

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

      

Lo snippet seguente inclina la fotocamera verso l'alto di 30 gradi.

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

      

Animare i movimenti della videocamera

Per animare i movimenti della videocamera, chiama StreetViewPanorama.animateTo(). L'animazione esegue l'interpolazione tra gli attributi della fotocamera attuali e quelli nuovi. Se vuoi passare direttamente alla videocamera senza animazione, puoi impostare la durata su 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);

      

L'immagine seguente mostra il risultato quando pianifichi l'esecuzione dell'animazione precedente ogni 2000 millisecondi utilizzando Handler.postDelayed():

Demo dell'animazione di una panoramica in Street View